diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Misc/ast-dump-c-attr.c | 46 | ||||
-rw-r--r-- | clang/test/Parser/c2x-attributes.c | 122 | ||||
-rw-r--r-- | clang/test/Parser/c2x-attributes.m | 21 | ||||
-rw-r--r-- | clang/test/Sema/attr-deprecated-c2x.c | 54 |
4 files changed, 243 insertions, 0 deletions
diff --git a/clang/test/Misc/ast-dump-c-attr.c b/clang/test/Misc/ast-dump-c-attr.c new file mode 100644 index 00000000000..701df78e61f --- /dev/null +++ b/clang/test/Misc/ast-dump-c-attr.c @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -triple x86_64-pc-linux -fdouble-square-bracket-attributes -Wno-deprecated-declarations -ast-dump -ast-dump-filter Test %s | FileCheck --strict-whitespace %s
+
+int Test1 [[deprecated]];
+// CHECK: VarDecl{{.*}}Test1
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:13> "" ""
+
+enum [[deprecated("Frobble")]] Test2 {
+ Test3 [[deprecated]]
+};
+// CHECK: EnumDecl{{.*}}Test2
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:8, col:28> "Frobble" ""
+// CHECK-NEXT: EnumConstantDecl{{.*}}Test3
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:11> "" ""
+
+struct [[deprecated]] Test4 {
+ [[deprecated("Frobble")]] int Test5, Test6;
+ int Test7 [[deprecated]] : 12;
+};
+// CHECK: RecordDecl{{.*}}Test4
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:10> "" ""
+// CHECK-NEXT: FieldDecl{{.*}}Test5
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:5, col:25> "Frobble" ""
+// CHECK-NEXT: FieldDecl{{.*}}Test6
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:5, col:25> "Frobble" ""
+// CHECK-NEXT: FieldDecl{{.*}}Test7
+// CHECK-NEXT: IntegerLiteral{{.*}}'int' 12
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:15> "" ""
+
+struct [[deprecated]] Test8;
+// CHECK: RecordDecl{{.*}}Test8
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:10> "" ""
+
+[[deprecated]] void Test9(int Test10 [[deprecated]]);
+// CHECK: FunctionDecl{{.*}}Test9
+// CHECK-NEXT: ParmVarDecl{{.*}}Test10
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:40> "" ""
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:3> "" ""
+
+void Test11 [[deprecated]](void);
+// CHECK: FunctionDecl{{.*}}Test11
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:15> "" ""
+
+void Test12(void) [[deprecated]] {}
+// CHECK: FunctionDecl{{.*}}Test12
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: DeprecatedAttr 0x{{[^ ]*}} <col:21> "" ""
diff --git a/clang/test/Parser/c2x-attributes.c b/clang/test/Parser/c2x-attributes.c new file mode 100644 index 00000000000..1be69f1ca28 --- /dev/null +++ b/clang/test/Parser/c2x-attributes.c @@ -0,0 +1,122 @@ +// RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s + +enum [[]] E { + One [[]], + Two, + Three [[]] +}; + +enum [[]] { Four }; +[[]] enum E2 { Five }; // expected-error {{an attribute list cannot appear here}} + +// FIXME: this diagnostic can be improved. +enum { [[]] Six }; // expected-error {{expected identifier}} + +// FIXME: this diagnostic can be improved. +enum E3 [[]] { Seven }; // expected-error {{expected identifier or '('}} + +struct [[]] S1 { + int i [[]]; + int [[]] j; + int k[10] [[]]; + int l[[]][10]; + [[]] int m, n; + int o [[]] : 12; +}; + +[[]] struct S2 { int a; }; // expected-error {{an attribute list cannot appear here}} +struct S3 [[]] { int a; }; // expected-error {{an attribute list cannot appear here}} + +union [[]] U { + double d [[]]; + [[]] int i; +}; + +[[]] union U2 { double d; }; // expected-error {{an attribute list cannot appear here}} +union U3 [[]] { double d; }; // expected-error {{an attribute list cannot appear here}} + +struct [[]] IncompleteStruct; +union [[]] IncompleteUnion; +enum [[]] IncompleteEnum; +enum __attribute__((deprecated)) IncompleteEnum2; + +[[]] void f1(void); +void [[]] f2(void); +void f3 [[]] (void); +void f4(void) [[]]; + +void f5(int i [[]], [[]] int j, int [[]] k); + +void f6(a, b) [[]] int a; int b; { // expected-error {{an attribute list cannot appear here}} +} + +// FIXME: technically, an attribute list cannot appear here, but we currently +// parse it as part of the return type of the function, which is reasonable +// behavior given that we *don't* want to parse it as part of the K&R parameter +// declarations. It is disallowed to avoid a parsing ambiguity we already +// handle well. +int (*f7(a, b))(int, int) [[]] int a; int b; { + return 0; +} + +[[]] int a, b; +int c [[]], d [[]]; + +void f8(void) [[]] { + [[]] int i, j; + int k, l [[]]; +} + +[[]] void f9(void) { + int i[10] [[]]; + int (*fp1)(void)[[]]; + int (*fp2 [[]])(void); + + int * [[]] *ipp; +} + +void f10(int j[static 10] [[]], int k[*] [[]]); + +void f11(void) { + [[]] {} + [[]] if (1) {} + + [[]] switch (1) { + [[]] case 1: [[]] break; + [[]] default: break; + } + + goto foo; + [[]] foo: (void)1; + + [[]] for (;;); + [[]] while (1); + [[]] do [[]] { } while(1); + + [[]] (void)1; + + [[]]; + + (void)sizeof(int [4][[]]); + (void)sizeof(struct [[]] S3 { int a [[]]; }); + + [[]] return; +} + +[[attr]] void f12(void); // expected-warning {{unknown attribute 'attr' ignored}} +[[vendor::attr]] void f13(void); // expected-warning {{unknown attribute 'attr' ignored}} + +// Ensure that asm statements properly handle double colons. +void test_asm(void) { + asm("ret" :::); + asm("foo" :: "r" (xx)); // expected-error {{use of undeclared identifier 'xx'}} +} + +// Do not allow 'using' to introduce vendor attribute namespaces. +[[using vendor: attr1, attr2]] void f14(void); // expected-error {{expected ']'}} \ + // expected-warning {{unknown attribute 'vendor' ignored}} \ + // expected-warning {{unknown attribute 'using' ignored}} + +struct [[]] S4 *s; // expected-error {{an attribute list cannot appear here}} +struct S5 {}; +int c = sizeof(struct [[]] S5); // expected-error {{an attribute list cannot appear here}} diff --git a/clang/test/Parser/c2x-attributes.m b/clang/test/Parser/c2x-attributes.m new file mode 100644 index 00000000000..f4610416cdd --- /dev/null +++ b/clang/test/Parser/c2x-attributes.m @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -fdouble-square-bracket-attributes -verify %s +// expected-no-diagnostics + +enum __attribute__((deprecated)) E1 : int; // ok +enum [[deprecated]] E2 : int; + +@interface Base +@end + +@interface S : Base +- (void) bar; +@end + +@interface T : Base +- (S *) foo; +@end + + +void f(T *t) { + [[]][[t foo] bar]; +} diff --git a/clang/test/Sema/attr-deprecated-c2x.c b/clang/test/Sema/attr-deprecated-c2x.c new file mode 100644 index 00000000000..2505f1294c3 --- /dev/null +++ b/clang/test/Sema/attr-deprecated-c2x.c @@ -0,0 +1,54 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only -fdouble-square-bracket-attributes + +int f() [[deprecated]]; // expected-note 2 {{'f' has been explicitly marked deprecated here}} +void g() [[deprecated]];// expected-note {{'g' has been explicitly marked deprecated here}} +void g(); + +extern int var [[deprecated]]; // expected-note 2 {{'var' has been explicitly marked deprecated here}} + +int a() { + int (*ptr)() = f; // expected-warning {{'f' is deprecated}} + f(); // expected-warning {{'f' is deprecated}} + + // test if attributes propagate to functions + g(); // expected-warning {{'g' is deprecated}} + + return var; // expected-warning {{'var' is deprecated}} +} + +// test if attributes propagate to variables +extern int var; +int w() { + return var; // expected-warning {{'var' is deprecated}} +} + +int old_fn() [[deprecated]];// expected-note {{'old_fn' has been explicitly marked deprecated here}} +int old_fn(); +int (*fn_ptr)() = old_fn; // expected-warning {{'old_fn' is deprecated}} + +int old_fn() { + return old_fn()+1; // no warning, deprecated functions can use deprecated symbols. +} + +struct foo { + int x [[deprecated]]; // expected-note 3 {{'x' has been explicitly marked deprecated here}} +}; + +void test1(struct foo *F) { + ++F->x; // expected-warning {{'x' is deprecated}} + struct foo f1 = { .x = 17 }; // expected-warning {{'x' is deprecated}} + struct foo f2 = { 17 }; // expected-warning {{'x' is deprecated}} +} + +typedef struct foo foo_dep [[deprecated]]; // expected-note {{'foo_dep' has been explicitly marked deprecated here}} +foo_dep *test2; // expected-warning {{'foo_dep' is deprecated}} + +struct [[deprecated, // expected-note {{'bar_dep' has been explicitly marked deprecated here}} + invalid_attribute]] bar_dep ; // expected-warning {{unknown attribute 'invalid_attribute' ignored}} + +struct bar_dep *test3; // expected-warning {{'bar_dep' is deprecated}} + +[[deprecated("this is the message")]] int i; // expected-note {{'i' has been explicitly marked deprecated here}} +void test4(void) { + i = 12; // expected-warning {{'i' is deprecated: this is the message}} +} |