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 {
f(const bool (&)[N])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;
fA23   constexpr int f() { return n; }
gA24   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