aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-11 03:23:19 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-11 03:23:19 +0000
commit483dd2f55ee53bc765123ead3428aa4ad2682cf3 (patch)
treedd5e20960b6b045332f30d3598e0ce9a58a4039a
parent21371ea7cf647f4f0f783faac325925cb8febb1c (diff)
Ensure that the result type of an Objective-C class message send is
complete. However, if it returns a reference type, don't require the type it refers to to be complete. Fixes <rdar://problem/8807070>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123214 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaExprObjC.cpp14
-rw-r--r--test/SemaObjCXX/message.mm13
2 files changed, 22 insertions, 5 deletions
diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp
index f4c593b0da..5a257eaa33 100644
--- a/lib/Sema/SemaExprObjC.cpp
+++ b/lib/Sema/SemaExprObjC.cpp
@@ -840,6 +840,11 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
LBracLoc, RBracLoc, ReturnType, VK))
return ExprError();
+ if (Method && !Method->getResultType()->isVoidType() &&
+ RequireCompleteType(LBracLoc, Method->getResultType(),
+ diag::err_illegal_message_expr_incomplete_type))
+ return ExprError();
+
// Construct the appropriate ObjCMessageExpr.
Expr *Result;
if (SuperLoc.isValid())
@@ -1105,11 +1110,10 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
LBracLoc, RBracLoc, ReturnType, VK))
return ExprError();
- if (!ReturnType->isVoidType()) {
- if (RequireCompleteType(LBracLoc, ReturnType,
- diag::err_illegal_message_expr_incomplete_type))
- return ExprError();
- }
+ if (Method && !Method->getResultType()->isVoidType() &&
+ RequireCompleteType(LBracLoc, Method->getResultType(),
+ diag::err_illegal_message_expr_incomplete_type))
+ return ExprError();
// Construct the appropriate ObjCMessageExpr instance.
Expr *Result;
diff --git a/test/SemaObjCXX/message.mm b/test/SemaObjCXX/message.mm
index fce546304f..4f7f8bca5e 100644
--- a/test/SemaObjCXX/message.mm
+++ b/test/SemaObjCXX/message.mm
@@ -112,3 +112,16 @@ void foo(void)
A *im = [A create:(void (*)(void *cgl_ctx, X r, void *data)) fun
callbackData:ptr];
}
+
+// <rdar://problem/8807070>
+template<typename T> struct X1; // expected-note{{template is declared here}}
+
+@interface B
++ (X1<int>)blah;
++ (X1<float>&)blarg;
+@end
+
+void f() {
+ [B blah]; // expected-error{{implicit instantiation of undefined template 'X1<int>'}}
+ [B blarg];
+}