| // RUN: %clang_cc1 -std=c++17 -verify %s |
| // expected-no-diagnostics |
| template<bool> struct DominatorTreeBase { |
| static constexpr bool IsPostDominator = true; |
| }; |
| extern template class DominatorTreeBase<false>; |
| constexpr bool k = DominatorTreeBase<false>::IsPostDominator; |
| |
| namespace CompleteType { |
| template<unsigned N> constexpr int f(const bool (&)[N]) { return 0; } |
| |
| template<bool ...V> struct X { |
| static constexpr bool arr[] = {V...}; |
| static constexpr int value = f(arr); |
| }; |
| |
| constexpr int n = X<true>::value; |
| } |
| |
| template <typename T> struct A { |
| static const int n; |
| static const int m; |
| constexpr int f() { return n; } |
| constexpr int g() { return n; } |
| }; |
| template <typename T> constexpr int A<T>::n = sizeof(A) + sizeof(T); |
| template <typename T> inline constexpr int A<T>::m = sizeof(A) + sizeof(T); |
| static_assert(A<int>().f() == 5); |
| static_assert(A<int>().g() == 5); |