diff options
author | Mike Stump <mrs@apple.com> | 2009-04-29 21:40:37 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-04-29 21:40:37 +0000 |
commit | 6c92fa75e62937f9738696840efcb258560f4568 (patch) | |
tree | 35b9cd76fa5c10c396c07f8ab37fdb18eab83d1b /lib/Sema/SemaStmt.cpp | |
parent | 298862dbcc0313766c8d2e25f836b62efcc75c51 (diff) |
Fixup Sema and CodeGen for block literal attributes when the return
type and argument types are missing, and let return type deduction
happen before we give errors for returning from a noreturn block.
Radar 6441502
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70413 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index e44aeb7557..fff7a44bc4 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -706,13 +706,6 @@ Sema::ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope) { /// Action::OwningStmtResult Sema::ActOnBlockReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { - - if (CurBlock->TheDecl->hasAttr<NoReturnAttr>()) { - Diag(ReturnLoc, diag::err_noreturn_block_has_return_expr) - << getCurFunctionOrMethodDecl()->getDeclName(); - return StmtError(); - } - // If this is the first return we've seen in the block, infer the type of // the block from it. if (CurBlock->ReturnType == 0) { @@ -726,6 +719,12 @@ Sema::ActOnBlockReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) { } QualType FnRetType = QualType(CurBlock->ReturnType, 0); + if (CurBlock->TheDecl->hasAttr<NoReturnAttr>()) { + Diag(ReturnLoc, diag::err_noreturn_block_has_return_expr) + << getCurFunctionOrMethodDecl()->getDeclName(); + return StmtError(); + } + // Otherwise, verify that this result type matches the previous one. We are // pickier with blocks than for normal functions because we don't have GCC // compatibility to worry about here. |