diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-11 03:23:19 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-11 03:23:19 +0000 |
commit | 483dd2f55ee53bc765123ead3428aa4ad2682cf3 (patch) | |
tree | dd5e20960b6b045332f30d3598e0ce9a58a4039a | |
parent | 21371ea7cf647f4f0f783faac325925cb8febb1c (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.cpp | 14 | ||||
-rw-r--r-- | test/SemaObjCXX/message.mm | 13 |
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]; +} |