summaryrefslogtreecommitdiffstats
path: root/clang/test/Sema/pass-object-size.c
diff options
context:
space:
mode:
authorGeorge Burgess IV <george.burgess.iv@gmail.com>2016-01-07 02:26:57 +0000
committerGeorge Burgess IV <george.burgess.iv@gmail.com>2016-01-07 02:26:57 +0000
commit7204ed97dd930e0cb159985a5973bc9993740726 (patch)
tree3422df717a6c911af7f97fdc06baca35553b5055 /clang/test/Sema/pass-object-size.c
parent103d2381d67cef5cc0febed84da7bdd01d1a2cb1 (diff)
downloadbcm5719-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.c6
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}}
}
OpenPOWER on IntegriCloud