blob: 9eb42342df31a0e173bcc93016cd901efedc315a [file] [log] [blame]
Aaron Ballmanad672ff2018-10-24 12:26:23 +00001// RUN: %clang_cc1 -std=gnu++17 -fsyntax-only -fms-compatibility -verify %s
2
3void f() {
4 // GNU-style attributes are prohibited in this position.
Aaron Ballman08b06592014-07-22 12:44:22 +00005 auto P = new int * __attribute__((vector_size(8))); // expected-error {{an attribute list cannot appear here}} \
6 // expected-error {{invalid vector element type 'int *'}}
7
8 // Ensure that MS type attribute keywords are still supported in this
9 // position.
10 auto P2 = new int * __sptr; // Ok
11}
12
13void g(int a[static [[]] 5]); // expected-error {{static array size is a C99 feature, not permitted in C++}}
Aaron Ballman5d153e32014-08-04 17:03:51 +000014
15namespace {
16class B {
17public:
Alexander Potapenkoe2e8b0e2014-10-03 09:02:53 +000018 virtual void test() {}
Aaron Ballman5d153e32014-08-04 17:03:51 +000019 virtual void test2() {}
20 virtual void test3() {}
21};
22
23class D : public B {
24public:
Alexander Potapenkoe2e8b0e2014-10-03 09:02:53 +000025 void test() __attribute__((deprecated)) final {} // expected-warning {{GCC does not allow an attribute in this position on a function declaration}}
Aaron Ballman5d153e32014-08-04 17:03:51 +000026 void test2() [[]] override {} // Ok
27 void test3() __attribute__((cf_unknown_transfer)) override {} // Ok, not known to GCC.
28};
29}
Alex Lorenz757a69b2016-10-12 09:36:35 +000030
31template<typename T>
32union Tu { T b; } __attribute__((transparent_union)); // expected-warning {{'transparent_union' attribute ignored}}
33
34template<typename T>
35union Tu2 { int x; T b; } __attribute__((transparent_union)); // expected-warning {{'transparent_union' attribute ignored}}
36
37union Tu3 { int x; } __attribute((transparent_union)); // expected-warning {{'transparent_union' attribute ignored}}
38
39void tuTest1(Tu<int> u); // expected-note {{candidate function not viable: no known conversion from 'int' to 'Tu<int>' for 1st argument}}
40void tuTest2(Tu3 u); // expected-note {{candidate function not viable: no known conversion from 'int' to 'Tu3' for 1st argument}}
41void tu() {
42 int x = 2;
Aaron Ballmanad672ff2018-10-24 12:26:23 +000043 tuTest1(x); // expected-error {{no matching function for call to 'tuTest1'}}
44 tuTest2(x); // expected-error {{no matching function for call to 'tuTest2'}}
45}
46
47[[gnu::__const__]] int f2() { return 12; }
48[[__gnu__::__const__]] int f3() { return 12; }
49[[using __gnu__ : __const__]] int f4() { return 12; }
50
51static_assert(__has_cpp_attribute(gnu::__const__));
52static_assert(__has_cpp_attribute(__gnu__::__const__));