diff options
author | George Burgess IV <george.burgess.iv@gmail.com> | 2016-01-07 02:26:57 +0000 |
---|---|---|
committer | George Burgess IV <george.burgess.iv@gmail.com> | 2016-01-07 02:26:57 +0000 |
commit | 7204ed97dd930e0cb159985a5973bc9993740726 (patch) | |
tree | 3422df717a6c911af7f97fdc06baca35553b5055 /clang/test/Sema/pass-object-size.c | |
parent | 103d2381d67cef5cc0febed84da7bdd01d1a2cb1 (diff) | |
download | bcm5719-llvm-7204ed97dd930e0cb159985a5973bc9993740726.tar.gz bcm5719-llvm-7204ed97dd930e0cb159985a5973bc9993740726.zip |
[Sema] Teach overload resolution about unaddressable functions.
Given an expression like `(&Foo)();`, we perform overload resolution as
if we are calling `Foo` directly. This causes problems if `Foo` is a
function that can't have its address taken. This patch teaches overload
resolution to ignore functions that can't have their address taken in
such cases.
Differential Revision: http://reviews.llvm.org/D15590
llvm-svn: 257016
Diffstat (limited to 'clang/test/Sema/pass-object-size.c')
-rw-r--r-- | clang/test/Sema/pass-object-size.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/clang/test/Sema/pass-object-size.c b/clang/test/Sema/pass-object-size.c index e4f460b1785..6f375c0e94d 100644 --- a/clang/test/Sema/pass-object-size.c +++ b/clang/test/Sema/pass-object-size.c @@ -33,7 +33,7 @@ void TakeFnOvl(void (*)(int *)) overloaded; void NotOverloaded(void *p PS(0)); void IsOverloaded(void *p PS(0)) overloaded; -void IsOverloaded(char *p) overloaded; +void IsOverloaded(char *p) overloaded; // char* inestead of void* is intentional void FunctionPtrs() { void (*p)(void *) = NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} void (*p2)(void *) = &NotOverloaded; //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} @@ -49,4 +49,8 @@ void FunctionPtrs() { TakeFnOvl(NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} TakeFnOvl(&NotOverloaded); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} + + int P; + (&NotOverloaded)(&P); //expected-error{{cannot take address of function 'NotOverloaded' because parameter 1 has pass_object_size attribute}} + (&IsOverloaded)(&P); //expected-error{{no matching function}} expected-note@35{{candidate address cannot be taken because parameter 1 has pass_object_size attribute}} expected-note@36{{candidate function not viable: no known conversion from 'int *' to 'char *' for 1st argument}} } |