39 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fsyntax-only -verify -std=c++11 %s2 3// GCC will accept anything as the argument of weakref. Should we4// check for an existing decl?5static int a1() __attribute__((weakref ("foo")));6static int a2() __attribute__((weakref, alias ("foo")));7 8static int a3 __attribute__((weakref ("foo")));9static int a4 __attribute__((weakref, alias ("foo")));10 11// gcc rejects, clang accepts12static int a5 __attribute__((alias ("foo"), weakref));13 14// this is pointless, but accepted by gcc. We reject it.15static int a6 __attribute__((weakref)); //expected-error {{weakref declaration of 'a6' must also have an alias attribute}}16 17// gcc warns, clang rejects18void f(void) {19 static int a __attribute__((weakref ("v2"))); // expected-error {{declaration of 'a' must be in a global context}}20}21 22// both gcc and clang reject23class c {24 static int a __attribute__((weakref ("v2"))); // expected-error {{declaration of 'a' must be in a global context}}25 static int b() __attribute__((weakref ("f3"))); // expected-error {{declaration of 'b' must be in a global context}}26};27int a7() __attribute__((weakref ("f1"))); // expected-error {{weakref declaration must have internal linkage}}28int a8 __attribute__((weakref ("v1"))); // expected-error {{weakref declaration must have internal linkage}}29 30// gcc accepts this31int a9 __attribute__((weakref)); // expected-error {{weakref declaration of 'a9' must also have an alias attribute}}32 33static int a10();34int a10() __attribute__((weakref ("foo")));35 36static int v __attribute__((weakref(a1), alias("foo"))); // expected-error {{expected string literal as argument of 'weakref' attribute}}37 38__attribute__((weakref ("foo"))) auto a11 = 1; // expected-error {{weakref declaration must have internal linkage}}39