1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-windows -fsyntax-only -verify %s 2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-linux -fsyntax-only -verify -emit-llvm-only -DCHECK_ALIASES %s 3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-linux -fsyntax-only -verify -emit-llvm-only %s 4*67e74705SXin Li 5*67e74705SXin Li #if defined(_WIN32) foo()6*67e74705SXin Livoid foo() {} 7*67e74705SXin Li void bar() __attribute__((ifunc("foo"))); 8*67e74705SXin Li //expected-warning@-1 {{'ifunc' attribute ignored}} 9*67e74705SXin Li 10*67e74705SXin Li #else 11*67e74705SXin Li #if defined(CHECK_ALIASES) 12*67e74705SXin Li void* f1_ifunc(); 13*67e74705SXin Li void f1() __attribute__((ifunc("f1_ifunc"))); 14*67e74705SXin Li //expected-error@-1 {{ifunc must point to a defined function}} 15*67e74705SXin Li 16*67e74705SXin Li void* f2_a() __attribute__((ifunc("f2_b"))); 17*67e74705SXin Li //expected-error@-1 {{ifunc definition is part of a cycle}} 18*67e74705SXin Li void* f2_b() __attribute__((ifunc("f2_a"))); 19*67e74705SXin Li //expected-error@-1 {{ifunc definition is part of a cycle}} 20*67e74705SXin Li 21*67e74705SXin Li void* f3_a() __attribute__((ifunc("f3_b"))); 22*67e74705SXin Li //expected-warning@-1 {{ifunc will always resolve to f3_c even if weak definition of f3_b is overridden}} 23*67e74705SXin Li void* f3_b() __attribute__((weak, alias("f3_c"))); f3_c()24*67e74705SXin Livoid* f3_c() { return 0; } 25*67e74705SXin Li f4_ifunc()26*67e74705SXin Livoid f4_ifunc() {} 27*67e74705SXin Li void f4() __attribute__((ifunc("f4_ifunc"))); 28*67e74705SXin Li //expected-error@-1 {{ifunc resolver function must return a pointer}} 29*67e74705SXin Li f5_ifunc(int i)30*67e74705SXin Livoid* f5_ifunc(int i) { return 0; } 31*67e74705SXin Li void f5() __attribute__((ifunc("f5_ifunc"))); 32*67e74705SXin Li //expected-error@-1 {{ifunc resolver function must have no parameters}} 33*67e74705SXin Li 34*67e74705SXin Li #else 35*67e74705SXin Li void f1a() __asm("f1"); f1a()36*67e74705SXin Livoid f1a() {} 37*67e74705SXin Li //expected-note@-1 {{previous definition is here}} 38*67e74705SXin Li void f1() __attribute__((ifunc("f1_ifunc"))); 39*67e74705SXin Li //expected-error@-1 {{definition with same mangled name as another definition}} f1_ifunc()40*67e74705SXin Livoid* f1_ifunc() { return 0; } 41*67e74705SXin Li 42*67e74705SXin Li #endif 43*67e74705SXin Li #endif 44