2 /* { dg-require-weak "" } */
3 /* { dg-require-alias "" } */
4 /* { dg-options "-O2" } */
6 extern int undef_var0
, undef_var1
;
7 extern __attribute__ ((weak
)) int weak_undef_var0
;
8 extern __attribute__ ((weak
)) int weak_undef_var1
;
9 __attribute__ ((weak
)) int weak_def_var0
;
10 int def_var0
=0, def_var1
=0;
11 static int alias_var0
__attribute__ ((alias("def_var0")));
12 extern int weak_alias_var0
__attribute__ ((alias("def_var0"))) __attribute__ ((weak
));
21 __attribute__ ((weak
))
22 void weak_def_fn0(void)
25 __attribute__ ((weak
))
26 void weak_def_fn1(void)
29 __attribute__ ((weak
)) void weak_undef_fn0(void);
41 main(int argc
, char **argv
)
43 /* Two definitions are always different unless they can be interposed. */
44 if (!__builtin_constant_p (def_fn0
== def_fn1
))
46 if (def_fn0
== def_fn1
)
49 if (!__builtin_constant_p (&def_var0
== &def_var1
))
51 if (&def_var0
== &def_var1
)
54 /* Same symbol is the same no matter on interposition. */
55 if (!__builtin_constant_p (undef_fn0
!= undef_fn0
))
57 if (undef_fn0
!= undef_fn0
)
60 /* Do not get confused by same offset. */
61 if (!__builtin_constant_p (&undef_var0
+ argc
!= &undef_var0
+ argc
))
63 if (&undef_var0
+ argc
!= &undef_var0
+ argc
)
66 /* Alias and its target is equivalent unless one of them can be interposed. */
67 if (!__builtin_constant_p (&def_var0
!= &alias_var0
))
69 if (&def_var0
!= &alias_var0
)
72 if (__builtin_constant_p (&def_var0
!= &weak_alias_var0
))
74 if (&def_var0
!= &weak_alias_var0
)
77 /* Weak definitions may be both NULL. */
78 if (__builtin_constant_p ((void *)weak_undef_fn0
== (void *)&weak_undef_var0
))
80 if ((void *)weak_undef_fn0
!= (void *)&weak_undef_var0
)
83 /* Variables and functions do not share same memory locations otherwise. */
84 if (!__builtin_constant_p ((void *)undef_fn0
== (void *)&undef_var0
))
86 if ((void *)undef_fn0
== (void *)&undef_var0
)
89 /* This works for cases where one object is just weakly defined, too. */
90 if (!__builtin_constant_p ((void *)weak_undef_fn0
== (void *)&weak_def_var0
))
92 if ((void *)weak_undef_fn0
== (void *)&weak_def_var0
)
95 /* Inline functions are known to be different. */
96 if (!__builtin_constant_p (inline_fn0
!= inline_fn1
))
98 if (inline_fn0
== inline_fn1
)