338 lines · cpp
1// RUN: %clang_cc1 -triple %ms_abi_triple -ast-print %s -std=gnu++11 | FileCheck %s2 3// CHECK: r;4// CHECK-NEXT: (r->method());5struct MyClass6{7 void method() {}8};9 10struct Reference11{12 MyClass* object;13 MyClass* operator ->() { return object; }14};15 16void test1() {17 Reference r;18 (r->method());19}20 21// CHECK: if (int a = 1)22// CHECK: while (int a = 1)23// CHECK: switch (int a = 1)24// CHECK: for (; int a = 1;)25 26void test2()27{28 if (int a = 1) { }29 while (int a = 1) { }30 switch (int a = 1) { }31 for(; int a = 1; ) { }32}33 34// CHECK: new (1) int;35void *operator new (typeof(sizeof(1)), int, int = 2);36void test3() {37 new (1) int;38}39 40// CHECK: new X;41struct X {42 void *operator new (typeof(sizeof(1)), int = 2);43};44void test4() { new X; }45 46// CHECK: for (int i = 2097, j = 42; false;)47void test5() {48 for (int i = 2097, j = 42; false;) {}49}50 51// CHECK: test6fn((int &)y);52void test6fn(int& x);53void test6() {54 unsigned int y = 0;55 test6fn((int&)y);56}57 58// CHECK: S s(1, 2);59 60template <class S> void test7()61{62 S s( 1,2 );63}64 65 66// CHECK: t.~T();67 68template <typename T> void test8(T t) { t.~T(); }69 70 71// CHECK: enum E72// CHECK-NEXT: A,73// CHECK-NEXT: B,74// CHECK-NEXT: C75// CHECK-NEXT: };76// CHECK-NEXT: {{^[ ]+}}E a = A;77 78struct test979{80 void f()81 {82 enum E { A, B, C };83 E a = A;84 }85};86 87namespace test10 {88 namespace M {89 template<typename T>90 struct X {91 enum { value };92 };93 }94}95 96typedef int INT;97 98// CHECK: test1199// CHECK-NEXT: return test10::M::X<INT>::value;100int test11() {101 return test10::M::X<INT>::value;102}103 104 105struct DefaultArgClass106{107 DefaultArgClass(int a = 1) {}108 DefaultArgClass(int a, int b, int c = 1) {}109};110 111struct NoArgClass112{113 NoArgClass() {}114};115 116struct VirualDestrClass117{118 VirualDestrClass(int arg);119 virtual ~VirualDestrClass();120};121 122struct ConstrWithCleanupsClass123{124 ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42));125};126 127// CHECK: test12128// CHECK-NEXT: DefaultArgClass useDefaultArg;129// CHECK-NEXT: DefaultArgClass overrideDefaultArg(1);130// CHECK-NEXT: DefaultArgClass(1, 2);131// CHECK-NEXT: DefaultArgClass(1, 2, 3);132// CHECK-NEXT: NoArgClass noArg;133// CHECK-NEXT: ConstrWithCleanupsClass cwcNoArg;134// CHECK-NEXT: ConstrWithCleanupsClass cwcOverrideArg(48);135// CHECK-NEXT: ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));136void test12() {137 DefaultArgClass useDefaultArg;138 DefaultArgClass overrideDefaultArg(1);139 DefaultArgClass tempWithDefaultArg = DefaultArgClass(1, 2);140 DefaultArgClass tempWithExplictArg = DefaultArgClass(1, 2, 3);141 NoArgClass noArg;142 ConstrWithCleanupsClass cwcNoArg;143 ConstrWithCleanupsClass cwcOverrideArg(48);144 ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));145}146 147// CHECK: void test13() {148// CHECK: _Atomic(int) i;149// CHECK: __c11_atomic_init(&i, 0);150// CHECK: __c11_atomic_load(&i, 0);151// CHECK: }152void test13() {153 _Atomic(int) i;154 __c11_atomic_init(&i, 0);155 __c11_atomic_load(&i, 0);156}157 158 159// CHECK: void test14() {160// CHECK: struct X {161// CHECK: union {162// CHECK: int x;163// CHECK: } x;164// CHECK: };165// CHECK: }166void test14() {167 struct X { union { int x; } x; };168}169 170 171// CHECK: float test15() {172// CHECK: return __builtin_asinf(1.F);173// CHECK: }174// CHECK-NOT: extern "C"175float test15() {176 return __builtin_asinf(1.0F);177}178 179// CHECK: void test_atomic_loads(int *ptr, int *ret, int memorder) {180// CHECK: __atomic_load_n(ptr, memorder);181// CHECK: __atomic_load(ptr, ret, memorder);182// CHECK: }183void test_atomic_loads(int *ptr, int *ret, int memorder) {184 __atomic_load_n(ptr, memorder);185 __atomic_load(ptr, ret, memorder);186}187 188// CHECK: void test_atomic_stores(int *ptr, int val, int memorder) {189// CHECK: __atomic_store_n(ptr, val, memorder);190// CHECK: __atomic_store(ptr, &val, memorder);191// CHECK: }192void test_atomic_stores(int *ptr, int val, int memorder) {193 __atomic_store_n(ptr, val, memorder);194 __atomic_store(ptr, &val, memorder);195}196 197// CHECK: void test_atomic_exchanges(int *ptr, int val, int *ret, int memorder) {198// CHECK: __atomic_exchange_n(ptr, val, memorder);199// CHECK: __atomic_exchange(ptr, &val, ret, memorder);200// CHECK: }201void test_atomic_exchanges(int *ptr, int val, int *ret, int memorder) {202 __atomic_exchange_n(ptr, val, memorder);203 __atomic_exchange(ptr, &val, ret, memorder);204}205 206// CHECK: void test_atomic_cmpxchgs(int *ptr, int *expected, int desired, bool weak, int success_memorder, int failure_memorder) {207// CHECK: __atomic_compare_exchange_n(ptr, expected, desired, weak, success_memorder, failure_memorder);208// CHECK: __atomic_compare_exchange(ptr, expected, &desired, weak, success_memorder, failure_memorder);209// CHECK: }210void test_atomic_cmpxchgs(int *ptr, int *expected, int desired, bool weak, int success_memorder, int failure_memorder) {211 __atomic_compare_exchange_n(ptr, expected, desired, weak, success_memorder, failure_memorder);212 __atomic_compare_exchange(ptr, expected, &desired, weak, success_memorder, failure_memorder);213}214 215// CHECK: void test_atomic_fetch_ops(int *ptr, int val, int memorder) {216// CHECK: __atomic_add_fetch(ptr, val, memorder);217// CHECK: __atomic_sub_fetch(ptr, val, memorder);218// CHECK: __atomic_and_fetch(ptr, val, memorder);219// CHECK: __atomic_xor_fetch(ptr, val, memorder);220// CHECK: __atomic_or_fetch(ptr, val, memorder);221// CHECK: __atomic_nand_fetch(ptr, val, memorder);222// CHECK: __atomic_fetch_add(ptr, val, memorder);223// CHECK: __atomic_fetch_sub(ptr, val, memorder);224// CHECK: __atomic_fetch_and(ptr, val, memorder);225// CHECK: __atomic_fetch_xor(ptr, val, memorder);226// CHECK: __atomic_fetch_or(ptr, val, memorder);227// CHECK: __atomic_fetch_nand(ptr, val, memorder);228// CHECK: }229void test_atomic_fetch_ops(int *ptr, int val, int memorder) {230 __atomic_add_fetch(ptr, val, memorder);231 __atomic_sub_fetch(ptr, val, memorder);232 __atomic_and_fetch(ptr, val, memorder);233 __atomic_xor_fetch(ptr, val, memorder);234 __atomic_or_fetch(ptr, val, memorder);235 __atomic_nand_fetch(ptr, val, memorder);236 __atomic_fetch_add(ptr, val, memorder);237 __atomic_fetch_sub(ptr, val, memorder);238 __atomic_fetch_and(ptr, val, memorder);239 __atomic_fetch_xor(ptr, val, memorder);240 __atomic_fetch_or(ptr, val, memorder);241 __atomic_fetch_nand(ptr, val, memorder);242}243 244// CHECK: void test_atomic_setclear(void *ptr, int memorder) {245// CHECK: __atomic_test_and_set(ptr, memorder);246// CHECK: __atomic_clear(ptr, memorder);247// CHECK: }248void test_atomic_setclear(void *ptr, int memorder) {249 __atomic_test_and_set(ptr, memorder);250 __atomic_clear(ptr, memorder);251}252 253// CHECK: void test_atomic_fences(int memorder) {254// CHECK: __atomic_thread_fence(memorder);255// CHECK: __atomic_signal_fence(memorder);256// CHECK: }257void test_atomic_fences(int memorder) {258 __atomic_thread_fence(memorder);259 __atomic_signal_fence(memorder);260}261 262// CHECK: void test_atomic_lockfree(unsigned long size, void *ptr) {263// CHECK: __atomic_always_lock_free(size, ptr);264// CHECK: __atomic_is_lock_free(size, ptr);265// CHECK: }266void test_atomic_lockfree(unsigned long size, void *ptr) {267 __atomic_always_lock_free(size, ptr);268 __atomic_is_lock_free(size, ptr);269}270 271namespace PR18776 {272struct A {273 operator void *();274 explicit operator bool();275 A operator&(A);276};277 278// CHECK: struct A279// CHECK-NEXT: {{^[ ]*operator}} void *();280// CHECK-NEXT: {{^[ ]*explicit}} operator bool();281 282void bar(void *);283 284void foo() {285 A a, b;286 bar(a & b);287// CHECK: bar(a & b);288 if (a & b)289// CHECK: if (a & b)290 return;291}292};293 294namespace {295void test(int i) {296 switch (i) {297 case 1:298 // CHECK: {{\[\[clang::fallthrough\]\]}}299 [[clang::fallthrough]];300 case 2:301 break;302 }303}304}305 306namespace {307// CHECK: struct {{\[\[gnu::visibility\(\"hidden\"\)\]\]}} S;308struct [[gnu::visibility("hidden")]] S;309}310 311// CHECK: struct CXXFunctionalCastExprPrint {312// CHECK-NEXT: } fce = CXXFunctionalCastExprPrint{};313struct CXXFunctionalCastExprPrint {} fce = CXXFunctionalCastExprPrint{};314 315// CHECK: struct CXXTemporaryObjectExprPrint {316// CHECK-NEXT: CXXTemporaryObjectExprPrint();317// CHECK-NEXT: } toe = CXXTemporaryObjectExprPrint{};318struct CXXTemporaryObjectExprPrint { CXXTemporaryObjectExprPrint(); } toe = CXXTemporaryObjectExprPrint{};319 320namespace PR24872 {321// CHECK: template <typename T> struct Foo : T {322// CHECK: using T::operator-;323template <typename T> struct Foo : T {324 using T::operator-;325};326}327 328namespace dont_crash_on_auto_vars {329struct T { enum E {X = 12ll }; };330struct S {331 struct { int I; } ADecl;332 static const auto Y = T::X;333};334//CHECK: static const auto Y = T::X;335constexpr auto var = T::X;336//CHECK: constexpr auto var = T::X;337}338