14309b667SRichard Smith // RUN: %clang_cc1 -std=c++17 -verify %s 24309b667SRichard Smith // expected-no-diagnostics 34309b667SRichard Smith template<bool> struct DominatorTreeBase { 44309b667SRichard Smith static constexpr bool IsPostDominator = true; 54309b667SRichard Smith }; 64309b667SRichard Smith extern template class DominatorTreeBase<false>; 74309b667SRichard Smith constexpr bool k = DominatorTreeBase<false>::IsPostDominator; 82faf8e12SRichard Smith 92faf8e12SRichard Smith namespace CompleteType { f(const bool (&)[N])102faf8e12SRichard Smith template<unsigned N> constexpr int f(const bool (&)[N]) { return 0; } 112faf8e12SRichard Smith 122faf8e12SRichard Smith template<bool ...V> struct X { 132faf8e12SRichard Smith static constexpr bool arr[] = {V...}; 142faf8e12SRichard Smith static constexpr int value = f(arr); 152faf8e12SRichard Smith }; 162faf8e12SRichard Smith 172faf8e12SRichard Smith constexpr int n = X<true>::value; 182faf8e12SRichard Smith } 19*93ee9caaSRichard Smith 20*93ee9caaSRichard Smith template <typename T> struct A { 21*93ee9caaSRichard Smith static const int n; 22*93ee9caaSRichard Smith static const int m; fA23*93ee9caaSRichard Smith constexpr int f() { return n; } gA24*93ee9caaSRichard Smith constexpr int g() { return n; } 25*93ee9caaSRichard Smith }; 26*93ee9caaSRichard Smith template <typename T> constexpr int A<T>::n = sizeof(A) + sizeof(T); 27*93ee9caaSRichard Smith template <typename T> inline constexpr int A<T>::m = sizeof(A) + sizeof(T); 28*93ee9caaSRichard Smith static_assert(A<int>().f() == 5); 29*93ee9caaSRichard Smith static_assert(A<int>().g() == 5); 30