1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -verify -fsyntax-only
2ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
3c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedmanint f() __attribute__((deprecated)); // expected-note 2 {{declared here}}
4ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnervoid g() __attribute__((deprecated));
5350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanianvoid g(); // expected-note {{declared here}}
6ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
7350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanianextern int var __attribute__((deprecated)); // expected-note {{declared here}}
8ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
9ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerint a() {
10ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  int (*ptr)() = f; // expected-warning {{'f' is deprecated}}
11ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  f(); // expected-warning {{'f' is deprecated}}
12ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
13ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  // test if attributes propagate to functions
14ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  g(); // expected-warning {{'g' is deprecated}}
15ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
16ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner  return var; // expected-warning {{'var' is deprecated}}
17ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}
18ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner
19ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner// test if attributes propagate to variables
20350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanianextern int var; // expected-note {{declared here}}
21ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattnerint w() {
221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return var; // expected-warning {{'var' is deprecated}}
23ddee4231e9bdfbac1e1f5385ff1a17fd0e0b0e39Chris Lattner}
244238254b9846589e401019349badbad9aa8b6fe6Chris Lattner
254238254b9846589e401019349badbad9aa8b6fe6Chris Lattnerint old_fn() __attribute__ ((deprecated));
26c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedmanint old_fn(); // expected-note {{declared here}}
274238254b9846589e401019349badbad9aa8b6fe6Chris Lattnerint (*fn_ptr)() = old_fn; // expected-warning {{'old_fn' is deprecated}}
284238254b9846589e401019349badbad9aa8b6fe6Chris Lattner
294238254b9846589e401019349badbad9aa8b6fe6Chris Lattnerint old_fn() {
3061a0f17301f889260de739219c3e1d4c8039210eChris Lattner  return old_fn()+1;  // no warning, deprecated functions can use deprecated symbols.
314238254b9846589e401019349badbad9aa8b6fe6Chris Lattner}
324238254b9846589e401019349badbad9aa8b6fe6Chris Lattner
33cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattner
34cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattnerstruct foo {
35c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedman  int x __attribute__((deprecated)); // expected-note 3 {{declared here}}
36cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattner};
37cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattner
38cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattnervoid test1(struct foo *F) {
39cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattner  ++F->x;  // expected-warning {{'x' is deprecated}}
4054001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor  struct foo f1 = { .x = 17 }; // expected-warning {{'x' is deprecated}}
4154001c1e6a87b792b0711b822def2b1bfe1ad4a1Douglas Gregor  struct foo f2 = { 17 }; // expected-warning {{'x' is deprecated}}
42cfdff38e8e931c0020dff10a32221d8fedb287a6Chris Lattner}
43553905db4c758883345efa3c4c07e1dba2c74a2fChris Lattner
44f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedmantypedef struct foo foo_dep __attribute__((deprecated)); // expected-note 12 {{declared here}}
4522bd905673a73ccb9b5e45a7038ec060c9650ffeChris Lattnerfoo_dep *test2;    // expected-warning {{'foo_dep' is deprecated}}
46d451f836be2d2839f6ac87181c5a52f4f6be397eChris Lattner
47fc038e9ef8ed262724f42597ca5c844de97b1202Eli Friedmanstruct __attribute__((deprecated,
48c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedman                      invalid_attribute)) bar_dep ;  // expected-warning {{unknown attribute 'invalid_attribute' ignored}} expected-note 2 {{declared here}}
49d451f836be2d2839f6ac87181c5a52f4f6be397eChris Lattner
50d451f836be2d2839f6ac87181c5a52f4f6be397eChris Lattnerstruct bar_dep *test3;   // expected-warning {{'bar_dep' is deprecated}}
51d451f836be2d2839f6ac87181c5a52f4f6be397eChris Lattner
52523382640e9b099dd64ba0875a60a9356845b068Chris Lattner
53523382640e9b099dd64ba0875a60a9356845b068Chris Lattner// These should not warn because the actually declaration itself is deprecated.
54523382640e9b099dd64ba0875a60a9356845b068Chris Lattner// rdar://6756623
55523382640e9b099dd64ba0875a60a9356845b068Chris Lattnerfoo_dep *test4 __attribute__((deprecated));
56523382640e9b099dd64ba0875a60a9356845b068Chris Lattnerstruct bar_dep *test5 __attribute__((deprecated));
57523382640e9b099dd64ba0875a60a9356845b068Chris Lattner
5854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCalltypedef foo_dep test6(struct bar_dep*); // expected-warning {{'foo_dep' is deprecated}} \
5954abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall                                        // expected-warning {{'bar_dep' is deprecated}}
6054abf7d4fa3123b8324c09d2a4dfb789fd818403John McCalltypedef foo_dep test7(struct bar_dep*) __attribute__((deprecated));
6154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
6254abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallint test8(char *p) {
6354abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  p += sizeof(foo_dep); // expected-warning {{'foo_dep' is deprecated}}
6454abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
6554abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  foo_dep *ptr;         // expected-warning {{'foo_dep' is deprecated}}
6654abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  ptr = (foo_dep*) p;   // expected-warning {{'foo_dep' is deprecated}}
6754abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
6854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  int func(foo_dep *foo); // expected-warning {{'foo_dep' is deprecated}}
6954abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  return func(ptr);
7054abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall}
7154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
7254abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallfoo_dep *test9(void) __attribute__((deprecated));
7354abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallfoo_dep *test9(void) {
7454abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  void* myalloc(unsigned long);
7554abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
7654abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  foo_dep *ptr
7754abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall    = (foo_dep*)
7854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall        myalloc(sizeof(foo_dep));
7954abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  return ptr;
8054abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall}
8154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
8254abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallvoid test10(void) __attribute__((deprecated));
8354abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallvoid test10(void) {
8454abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  if (sizeof(foo_dep) == sizeof(void*)) {
8554abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  }
8654abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  foo_dep *localfunc(void);
8754abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  foo_dep localvar;
8854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall}
8954abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
9054abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallchar test11[sizeof(foo_dep)] __attribute__((deprecated));
9154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallchar test12[sizeof(foo_dep)]; // expected-warning {{'foo_dep' is deprecated}}
9254abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
9354abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallint test13(foo_dep *foo) __attribute__((deprecated));
9454abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallint test14(foo_dep *foo); // expected-warning {{'foo_dep' is deprecated}}
9554abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
9654abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallunsigned long test15 = sizeof(foo_dep); // expected-warning {{'foo_dep' is deprecated}}
9754abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallunsigned long test16 __attribute__((deprecated))
9854abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall  = sizeof(foo_dep);
9954abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall
10054abf7d4fa3123b8324c09d2a4dfb789fd818403John McCallfoo_dep test17, // expected-warning {{'foo_dep' is deprecated}}
10154abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall        test18 __attribute__((deprecated)),
10254abf7d4fa3123b8324c09d2a4dfb789fd818403John McCall        test19;
1035b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall
1045b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall// rdar://problem/8518751
105c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedmanenum __attribute__((deprecated)) Test20 { // expected-note {{declared here}}
106350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian  test20_a __attribute__((deprecated)), // expected-note {{declared here}}
107350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian  test20_b // expected-note {{declared here}}
1085b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall};
1095b629aa86c987f276d00453b6c9ab8424f7903feJohn McCallvoid test20() {
1105b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall  enum Test20 f; // expected-warning {{'Test20' is deprecated}}
1115b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall  f = test20_a; // expected-warning {{'test20_a' is deprecated}}
11239b4fc888d2b9b8fe1a9c982964b5054ba1c3c73Fariborz Jahanian  f = test20_b; // expected-warning {{'test20_b' is deprecated}}
1135b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall}
1144820908be98f340a4c2a563a622ae693a7219c50John McCall
1154820908be98f340a4c2a563a622ae693a7219c50John McCallchar test21[__has_feature(attribute_deprecated_with_message) ? 1 : -1];
116f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman
117f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedmanstruct test22 {
118f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman  foo_dep a __attribute((deprecated));
119f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman  foo_dep b; // expected-warning {{'foo_dep' is deprecated}}
120f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman  foo_dep c, d __attribute((deprecated)); // expected-warning {{'foo_dep' is deprecated}}
121f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman  __attribute((deprecated)) foo_dep e, f;
122f66a0dda541cd859a928193efba6dc5d7ba8fe54Eli Friedman};
123