96 lines · c
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-pc-linux-gnu | FileCheck %s2 3// Verifying that we do, in fact, select the correct function in the following4// cases.5 6void foo(int m) __attribute__((overloadable, enable_if(m > 0, "")));7void foo(int m) __attribute__((overloadable));8 9// CHECK-LABEL: define{{.*}} void @test110void test1(void) {11 // CHECK: store ptr @_Z3fooi12 void (*p)(int) = foo;13 // CHECK: store ptr @_Z3fooi14 void (*p2)(int) = &foo;15 // CHECK: store ptr @_Z3fooi16 p = foo;17 // CHECK: store ptr @_Z3fooi18 p = &foo;19 20 // CHECK: store ptr @_Z3fooi21 void *vp1 = (void*)&foo;22 // CHECK: store ptr @_Z3fooi23 void *vp2 = (void*)foo;24 // CHECK: store ptr @_Z3fooi25 vp1 = (void*)&foo;26 // CHECK: store ptr @_Z3fooi27 vp1 = (void*)foo;28}29 30void bar(int m) __attribute__((overloadable, enable_if(m > 0, "")));31void bar(int m) __attribute__((overloadable, enable_if(1, "")));32// CHECK-LABEL: define{{.*}} void @test233void test2(void) {34 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi35 void (*p)(int) = bar;36 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi37 void (*p2)(int) = &bar;38 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi39 p = bar;40 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi41 p = &bar;42 43 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi44 void *vp1 = (void*)&bar;45 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi46 void *vp2 = (void*)bar;47 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi48 vp1 = (void*)&bar;49 // CHECK: store ptr @_Z3barUa9enable_ifILi1EEi50 vp1 = (void*)bar;51}52 53void baz(int m) __attribute__((overloadable, enable_if(1, "")));54void baz(int m) __attribute__((overloadable));55// CHECK-LABEL: define{{.*}} void @test356void test3(void) {57 // CHECK: store ptr @_Z3bazUa9enable_ifILi1EEi58 void (*p)(int) = baz;59 // CHECK: store ptr @_Z3bazUa9enable_ifILi1EEi60 void (*p2)(int) = &baz;61 // CHECK: store ptr @_Z3bazUa9enable_ifILi1EEi62 p = baz;63 // CHECK: store ptr @_Z3bazUa9enable_ifILi1EEi64 p = &baz;65}66 67 68enum { TRUEFACTS = 1 };69void qux(int m) __attribute__((overloadable, enable_if(1, ""),70 enable_if(TRUEFACTS, "")));71void qux(int m) __attribute__((overloadable, enable_if(1, "")));72// CHECK-LABEL: define{{.*}} void @test473void test4(void) {74 // CHECK: store ptr @_Z3quxUa9enable_ifILi1ELi1EEi75 void (*p)(int) = qux;76 // CHECK: store ptr @_Z3quxUa9enable_ifILi1ELi1EEi77 void (*p2)(int) = &qux;78 // CHECK: store ptr @_Z3quxUa9enable_ifILi1ELi1EEi79 p = qux;80 // CHECK: store ptr @_Z3quxUa9enable_ifILi1ELi1EEi81 p = &qux;82}83 84// There was a bug where, when enable_if was present, overload resolution85// wouldn't pay attention to lower-priority attributes.86// (N.B. `foo` with pass_object_size should always be preferred)87// CHECK-LABEL: define{{.*}} void @test588void test5(void) {89 int foo(char *i) __attribute__((enable_if(1, ""), overloadable));90 int foo(char *i __attribute__((pass_object_size(0))))91 __attribute__((enable_if(1, ""), overloadable));92 93 // CHECK: call i32 @_Z3fooUa9enable_ifILi1EEPcU17pass_object_size094 foo((void*)0);95}96