brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 93fc1f7 Raw
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