1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-pc-linux -fsyntax-only -verify -emit-llvm-only %s 2*67e74705SXin Li 3*67e74705SXin Li void f1(void) __attribute__((alias("g1"))); g1(void)4*67e74705SXin Livoid g1(void) { 5*67e74705SXin Li } 6*67e74705SXin Li 7*67e74705SXin Li void f2(void) __attribute__((alias("g2"))); // expected-error {{alias must point to a defined variable or function}} 8*67e74705SXin Li 9*67e74705SXin Li 10*67e74705SXin Li void f3(void) __attribute__((alias("g3"))); // expected-error {{alias must point to a defined variable or function}} 11*67e74705SXin Li void g3(void); 12*67e74705SXin Li 13*67e74705SXin Li 14*67e74705SXin Li void f4() __attribute__((alias("g4"))); g4()15*67e74705SXin Livoid g4() {} 16*67e74705SXin Li void h4() __attribute__((alias("f4"))); 17*67e74705SXin Li 18*67e74705SXin Li void f5() __attribute__((alias("g5"))); 19*67e74705SXin Li void h5() __attribute__((alias("f5"))); g5()20*67e74705SXin Livoid g5() {} 21*67e74705SXin Li g6()22*67e74705SXin Livoid g6() {} 23*67e74705SXin Li void f6() __attribute__((alias("g6"))); 24*67e74705SXin Li void h6() __attribute__((alias("f6"))); 25*67e74705SXin Li g7()26*67e74705SXin Livoid g7() {} 27*67e74705SXin Li void h7() __attribute__((alias("f7"))); 28*67e74705SXin Li void f7() __attribute__((alias("g7"))); 29*67e74705SXin Li 30*67e74705SXin Li void h8() __attribute__((alias("f8"))); g8()31*67e74705SXin Livoid g8() {} 32*67e74705SXin Li void f8() __attribute__((alias("g8"))); 33*67e74705SXin Li 34*67e74705SXin Li void h9() __attribute__((alias("f9"))); 35*67e74705SXin Li void f9() __attribute__((alias("g9"))); g9()36*67e74705SXin Livoid g9() {} 37*67e74705SXin Li 38*67e74705SXin Li void f10() __attribute__((alias("g10"))); // expected-error {{alias definition is part of a cycle}} 39*67e74705SXin Li void g10() __attribute__((alias("f10"))); // expected-error {{alias definition is part of a cycle}} 40*67e74705SXin Li 41*67e74705SXin Li // FIXME: This could be a bit better, h10 is not part of the cycle, it points 42*67e74705SXin Li // to it. 43*67e74705SXin Li void h10() __attribute__((alias("g10"))); // expected-error {{alias definition is part of a cycle}} 44*67e74705SXin Li 45*67e74705SXin Li extern int a1 __attribute__((alias("b1"))); 46*67e74705SXin Li int b1 = 42; 47*67e74705SXin Li 48*67e74705SXin Li extern int a2 __attribute__((alias("b2"))); // expected-error {{alias must point to a defined variable or function}} 49*67e74705SXin Li 50*67e74705SXin Li extern int a3 __attribute__((alias("b3"))); // expected-error {{alias must point to a defined variable or function}} 51*67e74705SXin Li extern int b3; 52*67e74705SXin Li 53*67e74705SXin Li extern int a4 __attribute__((alias("b4"))); // expected-error {{alias must point to a defined variable or function}} 54*67e74705SXin Li typedef int b4; 55*67e74705SXin Li test2_bar()56*67e74705SXin Livoid test2_bar() {} 57*67e74705SXin Li void test2_foo() __attribute__((weak, alias("test2_bar"))); 58*67e74705SXin Li void test2_zed() __attribute__((alias("test2_foo"))); // expected-warning {{alias will always resolve to test2_bar even if weak definition of test2_foo is overridden}} 59*67e74705SXin Li test3_bar()60*67e74705SXin Livoid test3_bar() { } 61*67e74705SXin Li void test3_foo() __attribute__((section("test"))); // expected-warning {{alias will not be in section 'test' but in the same section as the aliasee}} 62*67e74705SXin Li void test3_foo() __attribute__((alias("test3_bar"))); 63*67e74705SXin Li test4_bar()64*67e74705SXin Li__attribute__((section("test"))) void test4_bar() { } 65*67e74705SXin Li void test4_foo() __attribute__((section("test"))); 66*67e74705SXin Li void test4_foo() __attribute__((alias("test4_bar"))); 67*67e74705SXin Li 68*67e74705SXin Li int test5_bar = 0; 69*67e74705SXin Li extern struct incomplete_type test5_foo __attribute__((alias("test5_bar"))); 70