forked from OSchip/llvm-project
Make sure result type of objc++ message expression is
complete before attempting to bind it to a temporary. Fixes PR7386. llvm-svn: 106130
This commit is contained in:
parent
6c0da25129
commit
1d44608cc1
|
@ -1888,6 +1888,8 @@ def err_illegal_decl_array_of_functions : Error<
|
|||
"'%0' declared as array of functions of type %1">;
|
||||
def err_illegal_decl_array_incomplete_type : Error<
|
||||
"array has incomplete element type %0">;
|
||||
def err_illegal_message_expr_incomplete_type : Error<
|
||||
"objective-c message has incomplete result type %0">;
|
||||
def err_illegal_decl_array_of_references : Error<
|
||||
"'%0' declared as array of references of type %1">;
|
||||
def err_array_star_outside_prototype : Error<
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/CXXInheritance.h"
|
||||
#include "clang/AST/ExprCXX.h"
|
||||
#include "clang/AST/ExprObjC.h"
|
||||
#include "clang/AST/TypeLoc.h"
|
||||
#include "clang/Basic/PartialDiagnostic.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
|
@ -2605,6 +2606,16 @@ Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) {
|
|||
if (FTy->getResultType()->isReferenceType())
|
||||
return Owned(E);
|
||||
}
|
||||
else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
|
||||
QualType Ty = ME->getType();
|
||||
if (const PointerType *PT = Ty->getAs<PointerType>())
|
||||
Ty = PT->getPointeeType();
|
||||
else if (const BlockPointerType *BPT = Ty->getAs<BlockPointerType>())
|
||||
Ty = BPT->getPointeeType();
|
||||
if (Ty->isReferenceType())
|
||||
return Owned(E);
|
||||
}
|
||||
|
||||
|
||||
// That should be enough to guarantee that this type is complete.
|
||||
// If it has a trivial destructor, we can avoid the extra copy.
|
||||
|
|
|
@ -1018,6 +1018,11 @@ Sema::OwningExprResult Sema::BuildInstanceMessage(ExprArg ReceiverE,
|
|||
else
|
||||
Result = ObjCMessageExpr::Create(Context, ReturnType, LBracLoc, Receiver,
|
||||
Sel, Method, Args, NumArgs, RBracLoc);
|
||||
if (Context.getLangOptions().CPlusPlus && !ReturnType->isVoidType()) {
|
||||
if (RequireCompleteType(LBracLoc, ReturnType,
|
||||
diag::err_illegal_message_expr_incomplete_type))
|
||||
return ExprError();
|
||||
}
|
||||
return MaybeBindToTemporary(Result);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// PR7386
|
||||
|
||||
@class NSObject;
|
||||
|
||||
class A;
|
||||
template<class T> class V {};
|
||||
|
||||
@protocol Protocol
|
||||
- (V<A*>)protocolMethod;
|
||||
@end
|
||||
|
||||
|
||||
@interface I<Protocol>
|
||||
@end
|
||||
|
||||
|
||||
@implementation I
|
||||
- (void)randomMethod:(id)info {
|
||||
V<A*> vec([self protocolMethod]);
|
||||
}
|
||||
|
||||
- (V<A*>)protocolMethod {
|
||||
V<A*> va; return va;
|
||||
}
|
||||
@end
|
Loading…
Reference in New Issue