* symtab.c (symtab_node::equal_address_to): New function.
[official-gcc.git] / gcc / testsuite / gcc.dg / addr_equal-1.c
blobb033f50bfe756e2b92eb34718456cfe6d58f7abd
1 /* { dg-do run } */
2 /* { dg-require-weak "" } */
3 /* { dg-require-alias "" } */
4 /* { dg-options "-O2" } */
5 void abort (void);
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));
13 void undef_fn0(void);
14 void undef_fn1(void);
15 void def_fn0(void)
18 void def_fn1(void)
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);
31 inline
32 void inline_fn0(void)
35 inline
36 void inline_fn1(void)
40 int
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))
45 abort();
46 if (def_fn0 == def_fn1)
47 abort();
49 if (!__builtin_constant_p (&def_var0 == &def_var1))
50 abort();
51 if (&def_var0 == &def_var1)
52 abort();
54 /* Same symbol is the same no matter on interposition. */
55 if (!__builtin_constant_p (undef_fn0 != undef_fn0))
56 abort ();
57 if (undef_fn0 != undef_fn0)
58 abort ();
60 /* Do not get confused by same offset. */
61 if (!__builtin_constant_p (&undef_var0 + argc != &undef_var0 + argc))
62 abort ();
63 if (&undef_var0 + argc != &undef_var0 + argc)
64 abort ();
66 /* Alias and its target is equivalent unless one of them can be interposed. */
67 if (!__builtin_constant_p (&def_var0 != &alias_var0))
68 abort ();
69 if (&def_var0 != &alias_var0 )
70 abort ();
72 if (__builtin_constant_p (&def_var0 != &weak_alias_var0))
73 abort ();
74 if (&def_var0 != &weak_alias_var0)
75 abort ();
77 /* Weak definitions may be both NULL. */
78 if (__builtin_constant_p ((void *)weak_undef_fn0 == (void *)&weak_undef_var0))
79 abort ();
80 if ((void *)weak_undef_fn0 != (void *)&weak_undef_var0)
81 abort ();
83 /* Variables and functions do not share same memory locations otherwise. */
84 if (!__builtin_constant_p ((void *)undef_fn0 == (void *)&undef_var0))
85 abort ();
86 if ((void *)undef_fn0 == (void *)&undef_var0)
87 abort ();
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))
91 abort ();
92 if ((void *)weak_undef_fn0 == (void *)&weak_def_var0)
93 abort ();
95 /* Inline functions are known to be different. */
96 if (!__builtin_constant_p (inline_fn0 != inline_fn1))
97 abort ();
98 if (inline_fn0 == inline_fn1)
99 abort ();
100 return 0;