xref: /llvm-project/clang/test/SemaTemplate/cxx17-inline-variables.cpp (revision 93ee9caaede478563bed7d29c7331552f74c3508)
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