]> granicus.if.org Git - clang/commitdiff
[Sema][ObjC] Ensure that the return type of an ObjC method is a complete
authorAkira Hatanaka <ahatanaka@apple.com>
Thu, 12 Apr 2018 06:01:41 +0000 (06:01 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Thu, 12 Apr 2018 06:01:41 +0000 (06:01 +0000)
type.

Copy the code in ActOnStartOfFunctionDef that checks a function's return
type to ActOnStartOfObjCMethodDef. This fixes an assertion failure in
IRGen caused by an uninstantiated return type.

rdar://problem/38691818

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@329879 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclObjC.cpp
test/CodeGenObjCXX/instantiate-return.mm [new file with mode: 0644]
test/SemaObjCXX/instantiate-method-return.mm

index 7b92898b9934f8176e9e2f887a22f0154b198437..75c5ff56be6fd4f275d43326e3db6c8d11ac86fc 100644 (file)
@@ -341,6 +341,13 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
   if (!MDecl)
     return;
 
+  QualType ResultType = MDecl->getReturnType();
+  if (!ResultType->isDependentType() && !ResultType->isVoidType() &&
+      !MDecl->isInvalidDecl() &&
+      RequireCompleteType(MDecl->getLocation(), ResultType,
+                          diag::err_func_def_incomplete_result))
+    MDecl->setInvalidDecl();
+
   // Allow all of Sema to see that we are entering a method definition.
   PushDeclContext(FnBodyScope, MDecl);
   PushFunctionScope();
diff --git a/test/CodeGenObjCXX/instantiate-return.mm b/test/CodeGenObjCXX/instantiate-return.mm
new file mode 100644 (file)
index 0000000..fe59602
--- /dev/null
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++11 -o - %s | FileCheck %s
+
+template <class T>
+struct TemplateClass {
+  int a = 0;
+};
+
+struct S0;
+
+@interface C1
+- (TemplateClass<S0>)m1;
+@end
+
+// This code used to assert in CodeGen because the return type TemplateClass<S0>
+// wasn't instantiated.
+
+// CHECK: define internal i32 @"\01-[C1 m1]"(
+
+@implementation C1
+- (TemplateClass<S0>)m1 {
+}
+@end
index 9fad82feaeb7523538bfaf26c395a818188da485..74faa7f58257c7b739bff69a1dee775ad9fc2615 100644 (file)
@@ -1,14 +1,14 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
-// expected-no-diagnostics
 // PR7386
 
 @class NSObject;
 
-class A;
-template<class T> class V {};
+class A; // expected-note {{forward declaration of 'A'}}
+template<class T> class V { T x; }; // expected-error {{field has incomplete type 'A'}}
 
 @protocol Protocol
 - (V<A*>)protocolMethod;
+- (V<A>)method2;
 @end
 
 
@@ -24,4 +24,6 @@ template<class T> class V {};
 - (V<A*>)protocolMethod {
   V<A*> va; return va;
 }
+- (V<A>)method2 { // expected-note {{in instantiation of}}
+}
 @end