// RUN: %clang_cc1 -triple %ms_abi_triple -ast-print %s -std=gnu++11 | FileCheck %s // CHECK: r; // CHECK-NEXT: (r->method()); struct MyClass { void method() {} }; struct Reference { MyClass* object; MyClass* operator ->() { return object; } }; void test1() { Reference r; (r->method()); } // CHECK: if (int a = 1) // CHECK: while (int a = 1) // CHECK: switch (int a = 1) void test2() { if (int a = 1) { } while (int a = 1) { } switch (int a = 1) { } } // CHECK: new (1) int; void *operator new (typeof(sizeof(1)), int, int = 2); void test3() { new (1) int; } // CHECK: new X; struct X { void *operator new (typeof(sizeof(1)), int = 2); }; void test4() { new X; } // CHECK: for (int i = 2097, j = 42; false;) void test5() { for (int i = 2097, j = 42; false;) {} } // CHECK: test6fn((int &)y); void test6fn(int& x); void test6() { unsigned int y = 0; test6fn((int&)y); } // CHECK: S s(1, 2); template void test7() { S s( 1,2 ); } // CHECK: t.~T(); template void test8(T t) { t.~T(); } // CHECK: enum E // CHECK-NEXT: A, // CHECK-NEXT: B, // CHECK-NEXT: C // CHECK-NEXT: }; // CHECK-NEXT: {{^[ ]+}}E a = A; struct test9 { void f() { enum E { A, B, C }; E a = A; } }; namespace test10 { namespace M { template struct X { enum { value }; }; } } typedef int INT; // CHECK: test11 // CHECK-NEXT: return test10::M::X::value; int test11() { return test10::M::X::value; } struct DefaultArgClass { DefaultArgClass(int a = 1) {} DefaultArgClass(int a, int b, int c = 1) {} }; struct NoArgClass { NoArgClass() {} }; struct VirualDestrClass { VirualDestrClass(int arg); virtual ~VirualDestrClass(); }; struct ConstrWithCleanupsClass { ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42)); }; // CHECK: test12 // CHECK-NEXT: DefaultArgClass useDefaultArg; // CHECK-NEXT: DefaultArgClass overrideDefaultArg(1); // CHECK-NEXT: DefaultArgClass(1, 2); // CHECK-NEXT: DefaultArgClass(1, 2, 3); // CHECK-NEXT: NoArgClass noArg; // CHECK-NEXT: ConstrWithCleanupsClass cwcNoArg; // CHECK-NEXT: ConstrWithCleanupsClass cwcOverrideArg(48); // CHECK-NEXT: ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56)); void test12() { DefaultArgClass useDefaultArg; DefaultArgClass overrideDefaultArg(1); DefaultArgClass tempWithDefaultArg = DefaultArgClass(1, 2); DefaultArgClass tempWithExplictArg = DefaultArgClass(1, 2, 3); NoArgClass noArg; ConstrWithCleanupsClass cwcNoArg; ConstrWithCleanupsClass cwcOverrideArg(48); ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56)); } // CHECK: void test13() { // CHECK: _Atomic(int) i; // CHECK: __c11_atomic_init(&i, 0); // CHECK: __c11_atomic_load(&i, 0); // CHECK: } void test13() { _Atomic(int) i; __c11_atomic_init(&i, 0); __c11_atomic_load(&i, 0); } // CHECK: void test14() { // CHECK: struct X { // CHECK: union { // CHECK: int x; // CHECK: } x; // CHECK: }; // CHECK: } void test14() { struct X { union { int x; } x; }; } // CHECK: float test15() { // CHECK: return __builtin_asinf(1.F); // CHECK: } // CHECK-NOT: extern "C" float test15() { return __builtin_asinf(1.0F); } namespace PR18776 { struct A { operator void *(); explicit operator bool(); A operator&(A); }; // CHECK: struct A // CHECK-NEXT: {{^[ ]*operator}} void *(); // CHECK-NEXT: {{^[ ]*explicit}} operator bool(); void bar(void *); void foo() { A a, b; bar(a & b); // CHECK: bar(a & b); if (a & b) // CHECK: if (a & b) return; } }; namespace { void test(int i) { switch (i) { case 1: // CHECK: {{\[\[clang::fallthrough\]\]}} [[clang::fallthrough]]; case 2: break; } } } namespace { // CHECK: struct {{\[\[gnu::visibility\(\"hidden\"\)\]\]}} S; struct [[gnu::visibility("hidden")]] S; } // CHECK: struct CXXFunctionalCastExprPrint { // CHECK-NEXT: } fce = CXXFunctionalCastExprPrint{}; struct CXXFunctionalCastExprPrint {} fce = CXXFunctionalCastExprPrint{}; // CHECK: struct CXXTemporaryObjectExprPrint { // CHECK-NEXT: CXXTemporaryObjectExprPrint(); // CHECK-NEXT: } toe = CXXTemporaryObjectExprPrint{}; struct CXXTemporaryObjectExprPrint { CXXTemporaryObjectExprPrint(); } toe = CXXTemporaryObjectExprPrint{}; namespace PR24872 { // CHECK: template struct Foo : T { // CHECK: using T::operator-; template struct Foo : T { using T::operator-; }; } namespace dont_crash_on_auto_vars { struct T { enum E {X = 12ll }; }; struct S { struct { int I; } ADecl; static const auto Y = T::X; }; //CHECK: static const auto Y = T::X; constexpr auto var = T::X; //CHECK: constexpr auto var = T::X; }