diff options
Diffstat (limited to 'clang/lib/Sema/SemaStmt.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 5502a041d23..7feb96f6a64 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -2368,23 +2368,8 @@ Sema::ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { // For blocks/lambdas with implicit return types, we check each return // statement individually, and deduce the common return type when the block // or lambda is completed. - if (AutoType *AT = - FnRetType.isNull() ? 0 : FnRetType->getContainedAutoType()) { - // In C++1y, the return type may involve 'auto'. - FunctionDecl *FD = cast<LambdaScopeInfo>(CurCap)->CallOperator; - if (CurContext->isDependentContext()) { - // C++1y [dcl.spec.auto]p12: - // Return type deduction [...] occurs when the definition is - // instantiated even if the function body contains a return - // statement with a non-type-dependent operand. - CurCap->ReturnType = FnRetType = Context.DependentTy; - } else if (DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) { - FD->setInvalidDecl(); - return StmtError(); - } else - CurCap->ReturnType = FnRetType = FD->getResultType(); - } else if (CurCap->HasImplicitReturnType) { - // FIXME: Fold this into the 'auto' codepath above. + if (CurCap->HasImplicitReturnType) { + // FIXME: Fold this into the 'auto' codepath below. if (RetValExp && !isa<InitListExpr>(RetValExp)) { ExprResult Result = DefaultFunctionArrayLvalueConversion(RetValExp); if (Result.isInvalid()) @@ -2411,6 +2396,21 @@ Sema::ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { // make sure we provide a return type now for better error recovery. if (CurCap->ReturnType.isNull()) CurCap->ReturnType = FnRetType; + } else if (AutoType *AT = + FnRetType.isNull() ? 0 : FnRetType->getContainedAutoType()) { + // In C++1y, the return type may involve 'auto'. + FunctionDecl *FD = cast<LambdaScopeInfo>(CurCap)->CallOperator; + if (CurContext->isDependentContext()) { + // C++1y [dcl.spec.auto]p12: + // Return type deduction [...] occurs when the definition is + // instantiated even if the function body contains a return + // statement with a non-type-dependent operand. + CurCap->ReturnType = FnRetType = Context.DependentTy; + } else if (DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) { + FD->setInvalidDecl(); + return StmtError(); + } else + CurCap->ReturnType = FnRetType = FD->getResultType(); } assert(!FnRetType.isNull()); |