1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify -std=c++11 %s
211e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
311e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// GCC will accept anything as the argument of weakref. Should we
411e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// check for an existing decl?
511e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a1() __attribute__((weakref ("foo")));
611e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a2() __attribute__((weakref, alias ("foo")));
711e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
811e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a3 __attribute__((weakref ("foo")));
911e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a4 __attribute__((weakref, alias ("foo")));
1011e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
1111e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// gcc rejects, clang accepts
1211e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a5 __attribute__((alias ("foo"), weakref));
1311e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
1411e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// this is pointless, but accepted by gcc. We reject it.
1511e8ce7380856abee188b237c2600272df2ed09dRafael Espindolastatic int a6 __attribute__((weakref)); //expected-error {{weakref declaration of 'a6' must also have an alias attribute}}
1611e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
1711e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// gcc warns, clang rejects
1811e8ce7380856abee188b237c2600272df2ed09dRafael Espindolavoid f(void) {
1911e8ce7380856abee188b237c2600272df2ed09dRafael Espindola  static int a __attribute__((weakref ("v2"))); // expected-error {{declaration of 'a' must be in a global context}}
2011e8ce7380856abee188b237c2600272df2ed09dRafael Espindola}
2111e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
2211e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// both gcc and clang reject
2311e8ce7380856abee188b237c2600272df2ed09dRafael Espindolaclass c {
2411e8ce7380856abee188b237c2600272df2ed09dRafael Espindola  static int a __attribute__((weakref ("v2"))); // expected-error {{declaration of 'a' must be in a global context}}
2511e8ce7380856abee188b237c2600272df2ed09dRafael Espindola  static int b() __attribute__((weakref ("f3"))); // expected-error {{declaration of 'b' must be in a global context}}
2611e8ce7380856abee188b237c2600272df2ed09dRafael Espindola};
27332bb2a2e3cd0a5af85758847a8050ae8ceee5f3John McCallint a7() __attribute__((weakref ("f1"))); // expected-error {{weakref declaration must have internal linkage}}
28332bb2a2e3cd0a5af85758847a8050ae8ceee5f3John McCallint a8 __attribute__((weakref ("v1"))); // expected-error {{weakref declaration must have internal linkage}}
2911e8ce7380856abee188b237c2600272df2ed09dRafael Espindola
3011e8ce7380856abee188b237c2600272df2ed09dRafael Espindola// gcc accepts this
314d8a33b4cea46948f86afccf0ad3675aff924148Rafael Espindolaint a9 __attribute__((weakref));  // expected-error {{weakref declaration of 'a9' must also have an alias attribute}}
324d8a33b4cea46948f86afccf0ad3675aff924148Rafael Espindola
334d8a33b4cea46948f86afccf0ad3675aff924148Rafael Espindolastatic int a10();
344d8a33b4cea46948f86afccf0ad3675aff924148Rafael Espindolaint a10() __attribute__((weakref ("foo")));
35422ac9ee19c177fe65e613ff49998bd5a6e55408Aaron Ballman
36422ac9ee19c177fe65e613ff49998bd5a6e55408Aaron Ballmanstatic int v __attribute__((weakref(a1), alias("foo"))); // expected-error {{'weakref' attribute requires a string}}
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__attribute__((weakref ("foo"))) auto a11 = 1; // expected-error {{weakref declaration must have internal linkage}}
39