brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 3200a59 Raw
114 lines · cpp
1// RUN: %clang_cc1 -verify -pedantic %s -std=c++982// RUN: %clang_cc1 -verify -pedantic %s -std=c++113 4template<typename T> struct atomic {5  _Atomic(T) value; // expected-warning {{'_Atomic' is a C11 extension}}6 7  void f() _Atomic; // expected-error {{expected ';' at end of declaration list}}8};9 10template<typename T> struct user {11  struct inner { char n[sizeof(T)]; };12  atomic<inner> i;13};14 15user<int> u;16 17// Test overloading behavior of atomics.18struct A { };19 20int &ovl1(_Atomic(int)); // expected-warning {{'_Atomic' is a C11 extension}}21int &ovl1(_Atomic int);  // expected-warning {{'_Atomic' is a C11 extension}} // ok, redeclaration22long &ovl1(_Atomic(long)); // expected-warning {{'_Atomic' is a C11 extension}}23float &ovl1(_Atomic(float)); // expected-warning {{'_Atomic' is a C11 extension}}24double &ovl1(_Atomic(A const *const *)); // expected-warning {{'_Atomic' is a C11 extension}}25double &ovl1(A const *const *_Atomic); // expected-warning {{'_Atomic' is a C11 extension}}26short &ovl1(_Atomic(A **)); // expected-warning {{'_Atomic' is a C11 extension}}27 28void test_overloading(int i, float f, _Atomic(int) ai, _Atomic(float) af, // expected-warning 2 {{'_Atomic' is a C11 extension}}29                      long l, _Atomic(long) al, A const *const *acc, // expected-warning {{'_Atomic' is a C11 extension}}30                      A const ** ac, A **a) {31  int& ir1 = ovl1(i);32  int& ir2 = ovl1(ai);33  long& lr1 = ovl1(l);34  long& lr2 = ovl1(al);35  float &fr1 = ovl1(f);36  float &fr2 = ovl1(af);37  double &dr1 = ovl1(acc);38  double &dr2 = ovl1(ac);39  short &sr1 = ovl1(a);40}41 42typedef int (A::*fp)() _Atomic; // expected-error {{expected ';' after top level declarator}} expected-warning {{does not declare anything}} \43                                // expected-warning {{'_Atomic' is a C11 extension}}44 45typedef _Atomic(int(A::*)) atomic_mem_ptr_to_int; // expected-warning {{'_Atomic' is a C11 extension}}46typedef int(A::*_Atomic atomic_mem_ptr_to_int); // expected-warning {{'_Atomic' is a C11 extension}}47 48typedef _Atomic(int)(A::*mem_ptr_to_atomic_int); // expected-warning {{'_Atomic' is a C11 extension}}49typedef _Atomic int(A::*mem_ptr_to_atomic_int); // expected-warning {{'_Atomic' is a C11 extension}}50 51typedef _Atomic(int)&atomic_int_ref; // expected-warning {{'_Atomic' is a C11 extension}}52typedef _Atomic int &atomic_int_ref; // expected-warning {{'_Atomic' is a C11 extension}}53typedef _Atomic atomic_int_ref atomic_int_ref; // expected-warning {{'_Atomic' qualifier on reference type 'atomic_int_ref' (aka '_Atomic(int) &') has no effect}} \54                                               // expected-warning {{'_Atomic' is a C11 extension}}55 56typedef int &_Atomic atomic_reference_to_int; // expected-error {{'_Atomic' qualifier may not be applied to a reference}} \57                                              // expected-warning {{'_Atomic' is a C11 extension}}58typedef _Atomic(int &) atomic_reference_to_int; // expected-error {{_Atomic cannot be applied to reference type 'int &'}} \59                                                // expected-warning {{'_Atomic' is a C11 extension}}60 61struct S {62  _Atomic union { int n; }; // expected-warning {{anonymous union cannot be '_Atomic'}} \63                            // expected-warning {{'_Atomic' is a C11 extension}}64};65 66namespace copy_init {67  struct X {68    X(int);69    int n;70  };71  _Atomic(X) y = X(0); // expected-warning {{'_Atomic' is a C11 extension}}72  _Atomic(X) z(X(0)); // expected-warning {{'_Atomic' is a C11 extension}}73  void f() { y = X(0); }74 75  _Atomic(X) e1(0); // expected-error {{cannot initialize}} \76                    // expected-warning {{'_Atomic' is a C11 extension}}77#if __cplusplus >= 201103L78  _Atomic(X) e2{0}; // expected-error {{illegal initializer}} \79                    // expected-warning {{'_Atomic' is a C11 extension}}80  _Atomic(X) a{X(0)}; // expected-warning {{'_Atomic' is a C11 extension}}81  // FIXME: This does not seem like the right answer.82  _Atomic(int) e3{0}; // expected-error {{illegal initializer}} \83                      // expected-warning {{'_Atomic' is a C11 extension}}84#endif85 86  struct Y {87    _Atomic(X) a; // expected-warning {{'_Atomic' is a C11 extension}}88    _Atomic(int) b; // expected-warning {{'_Atomic' is a C11 extension}}89  };90  Y y1 = { X(0), 4 };91  Y y2 = { 0, 4 }; // expected-error {{cannot initialize}}92 93  // FIXME: It's not really clear if we should allow these. Generally, C++1194  // allows extraneous braces around initializers. We should at least give the95  // same answer in all these cases:96  Y y3 = { X(0), { 4 } }; // expected-error {{illegal initializer type}}97  Y y4 = { { X(0) }, 4 };98  _Atomic(int) ai = { 4 }; // expected-error {{illegal initializer type}} \99                           // expected-warning {{'_Atomic' is a C11 extension}}100  _Atomic(X) ax = { X(0) }; // expected-warning {{'_Atomic' is a C11 extension}}101}102 103bool PR21836(_Atomic(int) *x) { // expected-warning {{'_Atomic' is a C11 extension}}104    return *x;105}106 107namespace non_trivially_copyable {108  struct S {109    ~S() {}110  };111  _Atomic S s;  // expected-error {{_Atomic cannot be applied to type 'S' which is not trivially copyable}} \112                // expected-warning {{'_Atomic' is a C11 extension}}113}114