diff options
author | Anders Carlsson <andersca@mac.com> | 2009-10-13 22:22:09 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-10-13 22:22:09 +0000 |
commit | 834facc2b09910403259e8d38788c90ce1a7d5ff (patch) | |
tree | 1fd65a8290cdc38101c1db685bfa605f3dc0a507 /clang/lib | |
parent | f50799412c05c820fef0e8dda54bb772ae5eab47 (diff) | |
download | bcm5719-llvm-834facc2b09910403259e8d38788c90ce1a7d5ff.tar.gz bcm5719-llvm-834facc2b09910403259e8d38788c90ce1a7d5ff.zip |
Check the return type of operator[]() and fix a thinko that lead to a crash in SemaCXX/overloaded-operator.cpp.
llvm-svn: 84041
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 56dd6702333..d8e49c7d694 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1590,6 +1590,8 @@ Sema::ActOnPostfixUnaryOp(Scope *S, SourceLocation OpLoc, if (CheckCallReturnType(FnDecl->getResultType(), OpLoc, TheCall.get(), FnDecl)) return ExprError(); + return Owned(TheCall.release()); + } else { // We matched a built-in operator. Convert the arguments, then // break out so that we will build the appropriate built-in @@ -1700,9 +1702,7 @@ Sema::ActOnArraySubscriptExpr(Scope *S, ExprArg Base, SourceLocation LLoc, } // Determine the result type - QualType ResultTy - = FnDecl->getType()->getAs<FunctionType>()->getResultType(); - ResultTy = ResultTy.getNonReferenceType(); + QualType ResultTy = FnDecl->getResultType().getNonReferenceType(); // Build the actual expression node. Expr *FnExpr = new (Context) DeclRefExpr(FnDecl, FnDecl->getType(), @@ -1713,9 +1713,16 @@ Sema::ActOnArraySubscriptExpr(Scope *S, ExprArg Base, SourceLocation LLoc, Idx.release(); Args[0] = LHSExp; Args[1] = RHSExp; - return Owned(new (Context) CXXOperatorCallExpr(Context, OO_Subscript, - FnExpr, Args, 2, - ResultTy, LLoc)); + + ExprOwningPtr<CXXOperatorCallExpr> + TheCall(this, new (Context) CXXOperatorCallExpr(Context, OO_Subscript, + FnExpr, Args, 2, + ResultTy, RLoc)); + if (CheckCallReturnType(FnDecl->getResultType(), LLoc, TheCall.get(), + FnDecl)) + return ExprError(); + + return Owned(TheCall.release()); } else { // We matched a built-in operator. Convert the arguments, then // break out so that we will build the appropriate built-in |