]> granicus.if.org Git - clang/commitdiff
Ensure that the result type of an Objective-C class message send is
authorDouglas Gregor <dgregor@apple.com>
Tue, 11 Jan 2011 03:23:19 +0000 (03:23 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 11 Jan 2011 03:23:19 +0000 (03:23 +0000)
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

lib/Sema/SemaExprObjC.cpp
test/SemaObjCXX/message.mm

index f4c593b0daee0a7920e5515d4309cf413116fbd3..5a257eaa33f82d83b8766e49a8dc229a04b100a8 100644 (file)
@@ -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;
index fce546304f26e99d0932536dfcdea81d61fbca40..4f7f8bca5eb1974631d1f21d51e1b0e8fead4044 100644 (file)
@@ -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];
+}