1 // RUN: %clang_cc1 %s -verify -fsyntax-only 2 // RUN: %clang_cc1 %s -std=c89 -verify -fsyntax-only 3 // RUN: %clang_cc1 %s -std=c99 -verify -fsyntax-only 4 5 int f() __attribute__((deprecated)); // expected-note 2 {{'f' has been explicitly marked deprecated here}} 6 void g() __attribute__((deprecated));// expected-note {{'g' has been explicitly marked deprecated here}} 7 void g(); 8 9 extern int var __attribute__((deprecated)); // expected-note 2 {{'var' has been explicitly marked deprecated here}} 10 a()11int a() { 12 int (*ptr)() = f; // expected-warning {{'f' is deprecated}} 13 f(); // expected-warning {{'f' is deprecated}} 14 15 // test if attributes propagate to functions 16 g(); // expected-warning {{'g' is deprecated}} 17 18 return var; // expected-warning {{'var' is deprecated}} 19 } 20 21 // test if attributes propagate to variables 22 extern int var; w()23int w() { 24 return var; // expected-warning {{'var' is deprecated}} 25 } 26 27 int old_fn() __attribute__ ((deprecated));// expected-note {{'old_fn' has been explicitly marked deprecated here}} 28 int old_fn(); 29 int (*fn_ptr)() = old_fn; // expected-warning {{'old_fn' is deprecated}} 30 old_fn()31int old_fn() { 32 return old_fn()+1; // no warning, deprecated functions can use deprecated symbols. 33 } 34 35 36 struct foo { 37 int x __attribute__((deprecated)); // expected-note 3 {{'x' has been explicitly marked deprecated here}} 38 }; 39 test1(struct foo * F)40void test1(struct foo *F) { 41 ++F->x; // expected-warning {{'x' is deprecated}} 42 struct foo f1 = { .x = 17 }; // expected-warning {{'x' is deprecated}} 43 struct foo f2 = { 17 }; // expected-warning {{'x' is deprecated}} 44 } 45 46 typedef struct foo foo_dep __attribute__((deprecated)); // expected-note 12 {{'foo_dep' has been explicitly marked deprecated here}} 47 foo_dep *test2; // expected-warning {{'foo_dep' is deprecated}} 48 49 struct __attribute__((deprecated, // expected-note 2 {{'bar_dep' has been explicitly marked deprecated here}} 50 invalid_attribute)) bar_dep ; // expected-warning {{unknown attribute 'invalid_attribute' ignored}} 51 52 struct bar_dep *test3; // expected-warning {{'bar_dep' is deprecated}} 53 54 55 // These should not warn because the actually declaration itself is deprecated. 56 // rdar://6756623 57 foo_dep *test4 __attribute__((deprecated)); 58 struct bar_dep *test5 __attribute__((deprecated)); 59 60 typedef foo_dep test6(struct bar_dep*); // expected-warning {{'foo_dep' is deprecated}} \ 61 // expected-warning {{'bar_dep' is deprecated}} 62 typedef foo_dep test7(struct bar_dep*) __attribute__((deprecated)); 63 test8(char * p)64int test8(char *p) { 65 p += sizeof(foo_dep); // expected-warning {{'foo_dep' is deprecated}} 66 67 foo_dep *ptr; // expected-warning {{'foo_dep' is deprecated}} 68 ptr = (foo_dep*) p; // expected-warning {{'foo_dep' is deprecated}} 69 70 int func(foo_dep *foo); // expected-warning {{'foo_dep' is deprecated}} 71 return func(ptr); 72 } 73 74 foo_dep *test9(void) __attribute__((deprecated)); test9(void)75foo_dep *test9(void) { 76 void* myalloc(unsigned long); 77 78 foo_dep *ptr 79 = (foo_dep*) 80 myalloc(sizeof(foo_dep)); 81 return ptr; 82 } 83 84 void test10(void) __attribute__((deprecated)); test10(void)85void test10(void) { 86 if (sizeof(foo_dep) == sizeof(void*)) { 87 } 88 foo_dep *localfunc(void); 89 foo_dep localvar; 90 } 91 92 char test11[sizeof(foo_dep)] __attribute__((deprecated)); 93 char test12[sizeof(foo_dep)]; // expected-warning {{'foo_dep' is deprecated}} 94 95 int test13(foo_dep *foo) __attribute__((deprecated)); 96 int test14(foo_dep *foo); // expected-warning {{'foo_dep' is deprecated}} 97 98 unsigned long test15 = sizeof(foo_dep); // expected-warning {{'foo_dep' is deprecated}} 99 unsigned long test16 __attribute__((deprecated)) 100 = sizeof(foo_dep); 101 102 foo_dep test17, // expected-warning {{'foo_dep' is deprecated}} 103 test18 __attribute__((deprecated)), 104 test19; 105 106 // rdar://problem/8518751 107 enum __attribute__((deprecated)) Test20 { // expected-note 2 {{'Test20' has been explicitly marked deprecated here}} 108 test20_a __attribute__((deprecated)), // expected-note {{'test20_a' has been explicitly marked deprecated here}} 109 test20_b 110 }; test20()111void test20() { 112 enum Test20 f; // expected-warning {{'Test20' is deprecated}} 113 f = test20_a; // expected-warning {{'test20_a' is deprecated}} 114 f = test20_b; // expected-warning {{'test20_b' is deprecated}} 115 } 116 117 char test21[__has_feature(attribute_deprecated_with_message) ? 1 : -1]; 118 119 struct test22 { 120 foo_dep a __attribute((deprecated)); 121 foo_dep b; // expected-warning {{'foo_dep' is deprecated}} 122 foo_dep c, d __attribute((deprecated)); // expected-warning {{'foo_dep' is deprecated}} 123 __attribute((deprecated)) foo_dep e, f; 124 }; 125 126 typedef int test23_ty __attribute((deprecated)); 127 // Redefining a typedef is a C11 feature. 128 #if __STDC_VERSION__ <= 199901L 129 // expected-note@-3 {{'test23_ty' has been explicitly marked deprecated here}} 130 #else 131 // expected-note@-5 {{'test23_ty' has been explicitly marked deprecated here}} 132 typedef int test23_ty; 133 #endif 134 test23_ty test23_v; // expected-warning {{'test23_ty' is deprecated}} 135