// RUN: %clang_cc1 -std=c++17 -verify %s template struct DominatorTreeBase { static constexpr bool IsPostDominator = true; }; extern template class DominatorTreeBase; constexpr bool k = DominatorTreeBase::IsPostDominator; namespace CompleteType { template constexpr int f(const bool (&)[N]) { return 0; } template struct X { static constexpr bool arr[] = {V...}; static constexpr int value = f(arr); }; constexpr int n = X::value; } template struct A { static const int n; static const int m; constexpr int f() { return n; } constexpr int g() { return n; } }; template constexpr int A::n = sizeof(A) + sizeof(T); template inline constexpr int A::m = sizeof(A) + sizeof(T); static_assert(A().f() == 5); static_assert(A().g() == 5); namespace GH135032 { template struct InlineAuto { template inline static auto var = 5; }; template struct PartialInlineAuto { template inline static auto var = 6; template inline static auto var = 7; }; int inline_auto = InlineAuto::var; int partial_inline_auto = PartialInlineAuto::var; } namespace GH140773 { template class ConstString { // #ConstString ConstString(typename T::type) {} // #ConstString-Ctor }; template struct Foo { template static constexpr ConstString kFilename{[] { // #kFileName return 42; }}; }; // We don't want to instantiate the member template until it's used! Foo<> foo; auto X = Foo<>::kFilename<'a'>; // expected-error@#kFileName {{no viable constructor}} // expected-note@-2 {{in instantiation of static data member}} // expected-note@#ConstString-Ctor {{candidate template ignored}} // expected-note@#ConstString-Ctor {{implicit deduction guide}} // expected-note@#ConstString {{candidate template ignored}} // expected-note@#ConstString {{implicit deduction guide}} }