1 | // RUN: %clang_cc1 -std=c++17 -verify %s |
2 | // expected-no-diagnostics |
3 | template<bool> struct DominatorTreeBase { |
4 | static constexpr bool IsPostDominator = true; |
5 | }; |
6 | extern template class DominatorTreeBase<false>; |
7 | constexpr bool k = DominatorTreeBase<false>::IsPostDominator; |
8 | |
9 | namespace CompleteType { |
10 | template<unsigned N> constexpr int f(const bool (&)[N]) { return 0; } |
11 | |
12 | template<bool ...V> struct X { |
13 | static constexpr bool arr[] = {V...}; |
14 | static constexpr int value = f(arr); |
15 | }; |
16 | |
17 | constexpr int n = X<true>::value; |
18 | } |
19 | |
20 | template <typename T> struct A { |
21 | static const int n; |
22 | static const int m; |
23 | constexpr int f() { return n; } |
24 | constexpr int g() { return n; } |
25 | }; |
26 | template <typename T> constexpr int A<T>::n = sizeof(A) + sizeof(T); |
27 | template <typename T> inline constexpr int A<T>::m = sizeof(A) + sizeof(T); |
28 | static_assert(A<int>().f() == 5); |
29 | static_assert(A<int>().g() == 5); |
30 | |