File: cxx17-inline-variables.cpp

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,235,796 kB
  • sloc: cpp: 7,617,614; ansic: 1,433,901; asm: 1,058,726; python: 252,096; f90: 94,671; objc: 70,753; lisp: 42,813; pascal: 18,401; sh: 10,032; ml: 5,111; perl: 4,720; awk: 3,523; makefile: 3,401; javascript: 2,272; xml: 892; fortran: 770
file content (71 lines) | stat: -rw-r--r-- 2,031 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// RUN: %clang_cc1 -std=c++17 -verify %s

template<bool> struct DominatorTreeBase {
  static constexpr bool IsPostDominator = true;
};
extern template class DominatorTreeBase<false>;
constexpr bool k = DominatorTreeBase<false>::IsPostDominator;

namespace CompleteType {
  template<unsigned N> constexpr int f(const bool (&)[N]) { return 0; }

  template<bool ...V> struct X {
    static constexpr bool arr[] = {V...};
    static constexpr int value = f(arr);
  };

  constexpr int n = X<true>::value;
}

template <typename T> struct A {
  static const int n;
  static const int m;
  constexpr int f() { return n; }
  constexpr int g() { return n; }
};
template <typename T> constexpr int A<T>::n = sizeof(A) + sizeof(T);
template <typename T> inline constexpr int A<T>::m = sizeof(A) + sizeof(T);
static_assert(A<int>().f() == 5);
static_assert(A<int>().g() == 5);

namespace GH135032 {

template <typename T> struct InlineAuto {
  template <typename G> inline static auto var = 5;
};

template <typename> struct PartialInlineAuto {
  template <typename, typename> inline static auto var = 6;
  template <typename T> inline static auto var<int, T> = 7;
};

int inline_auto = InlineAuto<int>::var<int>;
int partial_inline_auto = PartialInlineAuto<int>::var<int, int>;

}

namespace GH140773 {
template <class T> class ConstString { // #ConstString
  ConstString(typename T::type) {} // #ConstString-Ctor
};

template <class = int>
struct Foo {
  template <char>
  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}}

}