187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %ms_abi_triple -ast-print %s -std=gnu++11 | FileCheck %s
2a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman
3a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman// CHECK: r;
4a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman// CHECK-NEXT: (r->method());
5a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedmanstruct MyClass
6a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman{
7a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    void method() {}
8a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman};
9a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman
10a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedmanstruct Reference
11a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman{
12a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    MyClass* object;
13a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    MyClass* operator ->() { return object; }
14a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman};
15a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman
1625c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test1() {
17a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    Reference r;
18a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    (r->method());
19a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman}
20a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman
21915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman// CHECK: if (int a = 1)
22915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman// CHECK:  while (int a = 1)
23915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman// CHECK:  switch (int a = 1)
24915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman
2525c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test2()
26915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman{
27915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    if (int a = 1) { }
28915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    while (int a = 1) { }
29915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    switch (int a = 1) { }
30915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman}
31915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman
32d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman// CHECK: new (1) int;
33d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedmanvoid *operator new (typeof(sizeof(1)), int, int = 2);
3425c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test3() {
35d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman  new (1) int;
36d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman}
37d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman
38d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman// CHECK: new X;
39d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedmanstruct X {
40d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman  void *operator new (typeof(sizeof(1)), int = 2);
41d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman};
4225c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test4() { new X; }
43eafa9d4d0d8b97f006dbd19c1e51d14663c8c5c3Eli Friedman
44eafa9d4d0d8b97f006dbd19c1e51d14663c8c5c3Eli Friedman// CHECK: for (int i = 2097, j = 42; false;)
4525c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test5() {
46eafa9d4d0d8b97f006dbd19c1e51d14663c8c5c3Eli Friedman  for (int i = 2097, j = 42; false;) {}
47eafa9d4d0d8b97f006dbd19c1e51d14663c8c5c3Eli Friedman}
4825c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedman
4925c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedman// CHECK: test6fn((int &)y);
5025c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test6fn(int& x);
5125c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedmanvoid test6() {
5225c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedman    unsigned int y = 0;
5325c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedman    test6fn((int&)y);
5425c9bc117d8825dce7911f6fddf3725d1914a7c6Eli Friedman}
55e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman
560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: S s(1, 2);
57e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman
58e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedmantemplate <class S> void test7()
59e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman{
60e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman    S s( 1,2 );
61e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman}
62e1aebe1e3aabe955e3805e994647e5e31dcc4d8cEli Friedman
63a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedman
64a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedman// CHECK: t.~T();
65a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedman
66a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedmantemplate <typename T> void test8(T t) { t.~T(); }
67a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman
68a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK:      enum E
70a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman// CHECK-NEXT:  A,
71a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman// CHECK-NEXT:  B,
72a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman// CHECK-NEXT:  C
73a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman// CHECK-NEXT:  };
74a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman// CHECK-NEXT: {{^[ ]+}}E a = A;
75a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman
76a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedmanstruct test9
77a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman{
78a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman    void f()
79a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman    {
80a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman        enum E { A, B, C };
81a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman        E a = A;
82a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman    }
83a45451d0959501c7d82582c61571a29cfdacdb0bEli Friedman};
840a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko
850a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenkonamespace test10 {
860a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko  namespace M {
870a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko    template<typename T>
880a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko    struct X {
890a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko      enum { value };
900a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko    };
910a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko  }
920a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko}
930a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko
940a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenkotypedef int INT;
950a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko
960a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko// CHECK: test11
970a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko// CHECK-NEXT: return test10::M::X<INT>::value;
980a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenkoint test11() {
990a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko  return test10::M::X<INT>::value;
1000a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko}
1010a04cbd98f65827918e857e7ab5597676b9d8e3bDmitri Gribenko
1025250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko
1035250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenkostruct DefaultArgClass
1045250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko{
1055250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko  DefaultArgClass(int a = 1) {}
106d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola  DefaultArgClass(int a, int b, int c = 1) {}
1075250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko};
1085250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko
1095250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenkostruct NoArgClass
1105250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko{
1115250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko  NoArgClass() {}
1125250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko};
1135250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko
11493aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenkostruct VirualDestrClass
11593aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko{
11693aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  VirualDestrClass(int arg);
11793aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  virtual ~VirualDestrClass();
11893aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko};
11993aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko
12093aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenkostruct ConstrWithCleanupsClass
12193aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko{
12293aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42));
12393aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko};
12493aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko
1255250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko// CHECK: test12
1265250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko// CHECK-NEXT: DefaultArgClass useDefaultArg;
1275250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko// CHECK-NEXT: DefaultArgClass overrideDefaultArg(1);
128d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola// CHECK-NEXT: DefaultArgClass(1, 2);
129d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola// CHECK-NEXT: DefaultArgClass(1, 2, 3);
1305250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko// CHECK-NEXT: NoArgClass noArg;
13193aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko// CHECK-NEXT: ConstrWithCleanupsClass cwcNoArg;
13293aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko// CHECK-NEXT: ConstrWithCleanupsClass cwcOverrideArg(48);
13393aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko// CHECK-NEXT: ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));
1345250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenkovoid test12() {
1355250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko  DefaultArgClass useDefaultArg;
1365250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko  DefaultArgClass overrideDefaultArg(1);
137d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola  DefaultArgClass tempWithDefaultArg = DefaultArgClass(1, 2);
138d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola  DefaultArgClass tempWithExplictArg = DefaultArgClass(1, 2, 3);
1395250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko  NoArgClass noArg;
14093aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  ConstrWithCleanupsClass cwcNoArg;
14193aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  ConstrWithCleanupsClass cwcOverrideArg(48);
14293aa2db250a0e67192ab2a5417e4dfd5530d6f56Dmitri Gribenko  ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));
1435250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko}
1445250e2b24f7288fb31dc6357831fcbc4ced26693Dmitri Gribenko
14528fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith// CHECK: void test13() {
14628fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith// CHECK:   _Atomic(int) i;
14728fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith// CHECK:   __c11_atomic_init(&i, 0);
14828fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith// CHECK:   __c11_atomic_load(&i, 0);
14928fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith// CHECK: }
15028fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smithvoid test13() {
15128fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith  _Atomic(int) i;
15228fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith  __c11_atomic_init(&i, 0);
15328fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith  __c11_atomic_load(&i, 0);
15428fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith}
15528fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith
15642acc0c357557574514814863cab950f23cbff5eEli Friedman
15742acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK: void test14() {
15842acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK:     struct X {
15942acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK:         union {
16042acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK:             int x;
16142acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK:         } x;
16242acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK:     };
16342acc0c357557574514814863cab950f23cbff5eEli Friedman// CHECK: }
16442acc0c357557574514814863cab950f23cbff5eEli Friedmanvoid test14() {
16542acc0c357557574514814863cab950f23cbff5eEli Friedman  struct X { union { int x; } x; };
16642acc0c357557574514814863cab950f23cbff5eEli Friedman}
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: float test15() {
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK:     return __builtin_asinf(1.F);
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: }
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NOT: extern "C"
173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesfloat test15() {
174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return __builtin_asinf(1.0F);
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18776 {
178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct A {
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  operator void *();
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  explicit operator bool();
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A operator&(A);
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: struct A
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: {{^[ ]*operator}} void *();
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-NEXT: {{^[ ]*explicit}} operator bool();
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid bar(void *);
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid foo() {
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A a, b;
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bar(a & b);
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: bar(a & b);
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (a & b)
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: if (a & b)
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
1996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace {
2016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test(int i) {
2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  switch (i) {
2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case 1:
2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // CHECK: {{\[\[clang::fallthrough\]\]}}
2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      [[clang::fallthrough]];
2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case 2:
2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      break;
2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace {
213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: struct {{\[\[gnu::visibility\(\"hidden\"\)\]\]}} S;
214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct [[gnu::visibility("hidden")]] S;
215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
2160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: struct CXXFunctionalCastExprPrint fce = CXXFunctionalCastExprPrint{};
2180e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct CXXFunctionalCastExprPrint {} fce = CXXFunctionalCastExprPrint{};
2190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: struct CXXTemporaryObjectExprPrint toe = CXXTemporaryObjectExprPrint{};
2210e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct CXXTemporaryObjectExprPrint { CXXTemporaryObjectExprPrint(); } toe = CXXTemporaryObjectExprPrint{};
22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace PR24872 {
22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: template <typename T> struct Foo : T {
22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: using T::operator-;
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename T> struct Foo : T {
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  using T::operator-;
22887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
22987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace dont_crash_on_auto_vars {
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct T { enum E {X = 12ll }; };
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S {
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  struct  { int I; } ADecl;
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static const auto Y = T::X;
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//CHECK: static const auto Y = T::X;
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr auto var = T::X;
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//CHECK: constexpr auto var = T::X;
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
241