SemaStmt.cpp revision 390b4cc8b45a05612349269ef08faab3e4688f06
15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//===--- SemaStmt.cpp - Semantic Analysis for Statements ------------------===//
2d0825bca7fe65beaee391d30da42e937db621564Steve Block//
35ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//                     The LLVM Compiler Infrastructure
45ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//
55ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark// This file is distributed under the University of Illinois Open Source
65ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark// License. See LICENSE.TXT for details.
75ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//
85ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//===----------------------------------------------------------------------===//
95ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//
105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//  This file implements semantic analysis for statements.
115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//
125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark//===----------------------------------------------------------------------===//
135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "Sema.h"
155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/APValue.h"
165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/ASTContext.h"
175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/DeclObjC.h"
185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/Expr.h"
195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/StmtObjC.h"
205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/AST/StmtCXX.h"
215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "clang/Basic/TargetInfo.h"
225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace clang;
235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
245ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::OwningStmtResult Sema::ActOnExprStmt(ExprArg expr) {
255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *E = expr.takeAs<Expr>();
265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  assert(E && "ActOnExprStmt(): missing expression");
275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // C99 6.8.3p2: The expression in an expression statement is evaluated as a
295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // void expression for its side effects.  Conversion to void allows any
305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // operand, even incomplete types.
315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Same thing in for stmt first clause (when expr) and third clause.
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  return Owned(static_cast<Stmt*>(E));
345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockSema::OwningStmtResult Sema::ActOnNullStmt(SourceLocation SemiLoc) {
385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) NullStmt(SemiLoc));
395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
415ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::OwningStmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg,
425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                           SourceLocation StartLoc,
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                           SourceLocation EndLoc) {
448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block  DeclGroupRef DG = dg.getAsVal<DeclGroupRef>();
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // If we have an invalid decl, just return an error.
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  if (DG.isNull()) return StmtError();
485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochAction::OwningStmtResult
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockSema::ActOnCompoundStmt(SourceLocation L, SourceLocation R,
545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                        MultiStmtArg elts, bool isStmtExpr) {
555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  unsigned NumElts = elts.size();
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  Stmt **Elts = reinterpret_cast<Stmt**>(elts.release());
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // If we're in C89 mode, check that we don't have any decls after stmts.  If
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // so, emit an extension diagnostic.
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  if (!getLangOptions().C99 && !getLangOptions().CPlusPlus) {
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Note that __extension__ can be around a decl.
615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    unsigned i = 0;
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Skip over all declarations.
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; i != NumElts && isa<DeclStmt>(Elts[i]); ++i)
645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      /*empty*/;
655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // We found the end of the list or a statement.  Scan for another declstmt.
675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    for (; i != NumElts && !isa<DeclStmt>(Elts[i]); ++i)
685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      /*empty*/;
695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (i != NumElts) {
715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Decl *D = *cast<DeclStmt>(Elts[i])->decl_begin();
725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Diag(D->getLocation(), diag::ext_mixed_decls_code);
735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Warn about unused expressions in statements.
765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  for (unsigned i = 0; i != NumElts; ++i) {
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    Expr *E = dyn_cast<Expr>(Elts[i]);
785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!E) continue;
79d0825bca7fe65beaee391d30da42e937db621564Steve Block
80d0825bca7fe65beaee391d30da42e937db621564Steve Block    // Warn about expressions with unused results if they are non-void and if
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    // this not the last stmt in a stmt expr.
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (E->getType()->isVoidType() || (isStmtExpr && i == NumElts-1))
83d0825bca7fe65beaee391d30da42e937db621564Steve Block      continue;
84d0825bca7fe65beaee391d30da42e937db621564Steve Block
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    SourceLocation Loc;
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    SourceRange R1, R2;
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!E->isUnusedResultAWarning(Loc, R1, R2))
88d0825bca7fe65beaee391d30da42e937db621564Steve Block      continue;
89d0825bca7fe65beaee391d30da42e937db621564Steve Block
90d0825bca7fe65beaee391d30da42e937db621564Steve Block    Diag(Loc, diag::warn_unused_expr) << R1 << R2;
915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) CompoundStmt(Context, Elts, NumElts, L, R));
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
965ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
975ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnCaseStmt(SourceLocation CaseLoc, ExprArg lhsval,
985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    SourceLocation DotDotDotLoc, ExprArg rhsval,
99d0825bca7fe65beaee391d30da42e937db621564Steve Block                    SourceLocation ColonLoc) {
100d0825bca7fe65beaee391d30da42e937db621564Steve Block  assert((lhsval.get() != 0) && "missing expression in case statement");
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // C99 6.8.4.2p3: The expression shall be an integer constant.
1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // However, GCC allows any evaluatable integer expression.
104692e5dbf12901edacf14812a6fae25462920af42Steve Block  Expr *LHSVal = static_cast<Expr*>(lhsval.get());
105692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (!LHSVal->isTypeDependent() && !LHSVal->isValueDependent() &&
106692e5dbf12901edacf14812a6fae25462920af42Steve Block      VerifyIntegerConstantExpression(LHSVal))
107692e5dbf12901edacf14812a6fae25462920af42Steve Block    return StmtError();
108692e5dbf12901edacf14812a6fae25462920af42Steve Block
109692e5dbf12901edacf14812a6fae25462920af42Steve Block  // GCC extension: The expression shall be an integer constant.
110692e5dbf12901edacf14812a6fae25462920af42Steve Block
111692e5dbf12901edacf14812a6fae25462920af42Steve Block  Expr *RHSVal = static_cast<Expr*>(rhsval.get());
112692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (RHSVal && !RHSVal->isTypeDependent() && !RHSVal->isValueDependent() &&
113692e5dbf12901edacf14812a6fae25462920af42Steve Block      VerifyIntegerConstantExpression(RHSVal)) {
114692e5dbf12901edacf14812a6fae25462920af42Steve Block    RHSVal = 0;  // Recover by just forgetting about it.
115692e5dbf12901edacf14812a6fae25462920af42Steve Block    rhsval = 0;
116692e5dbf12901edacf14812a6fae25462920af42Steve Block  }
117692e5dbf12901edacf14812a6fae25462920af42Steve Block
118692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (getSwitchStack().empty()) {
119692e5dbf12901edacf14812a6fae25462920af42Steve Block    Diag(CaseLoc, diag::err_case_not_in_switch);
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return StmtError();
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  }
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123692e5dbf12901edacf14812a6fae25462920af42Steve Block  // Only now release the smart pointers.
124692e5dbf12901edacf14812a6fae25462920af42Steve Block  lhsval.release();
125692e5dbf12901edacf14812a6fae25462920af42Steve Block  rhsval.release();
126692e5dbf12901edacf14812a6fae25462920af42Steve Block  CaseStmt *CS = new (Context) CaseStmt(LHSVal, RHSVal, CaseLoc, DotDotDotLoc,
127692e5dbf12901edacf14812a6fae25462920af42Steve Block                                        ColonLoc);
128692e5dbf12901edacf14812a6fae25462920af42Steve Block  getSwitchStack().back()->addSwitchCase(CS);
129692e5dbf12901edacf14812a6fae25462920af42Steve Block  return Owned(CS);
130692e5dbf12901edacf14812a6fae25462920af42Steve Block}
131692e5dbf12901edacf14812a6fae25462920af42Steve Block
132692e5dbf12901edacf14812a6fae25462920af42Steve Block/// ActOnCaseStmtBody - This installs a statement as the body of a case.
133692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid Sema::ActOnCaseStmtBody(StmtTy *caseStmt, StmtArg subStmt) {
134692e5dbf12901edacf14812a6fae25462920af42Steve Block  CaseStmt *CS = static_cast<CaseStmt*>(caseStmt);
135692e5dbf12901edacf14812a6fae25462920af42Steve Block  Stmt *SubStmt = subStmt.takeAs<Stmt>();
136692e5dbf12901edacf14812a6fae25462920af42Steve Block  CS->setSubStmt(SubStmt);
137692e5dbf12901edacf14812a6fae25462920af42Steve Block}
138692e5dbf12901edacf14812a6fae25462920af42Steve Block
139692e5dbf12901edacf14812a6fae25462920af42Steve BlockAction::OwningStmtResult
140692e5dbf12901edacf14812a6fae25462920af42Steve BlockSema::ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc,
141692e5dbf12901edacf14812a6fae25462920af42Steve Block                       StmtArg subStmt, Scope *CurScope) {
142692e5dbf12901edacf14812a6fae25462920af42Steve Block  Stmt *SubStmt = subStmt.takeAs<Stmt>();
143692e5dbf12901edacf14812a6fae25462920af42Steve Block
144692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (getSwitchStack().empty()) {
145692e5dbf12901edacf14812a6fae25462920af42Steve Block    Diag(DefaultLoc, diag::err_default_not_in_switch);
146692e5dbf12901edacf14812a6fae25462920af42Steve Block    return Owned(SubStmt);
147692e5dbf12901edacf14812a6fae25462920af42Steve Block  }
148692e5dbf12901edacf14812a6fae25462920af42Steve Block
149692e5dbf12901edacf14812a6fae25462920af42Steve Block  DefaultStmt *DS = new (Context) DefaultStmt(DefaultLoc, ColonLoc, SubStmt);
150692e5dbf12901edacf14812a6fae25462920af42Steve Block  getSwitchStack().back()->addSwitchCase(DS);
151692e5dbf12901edacf14812a6fae25462920af42Steve Block  return Owned(DS);
152692e5dbf12901edacf14812a6fae25462920af42Steve Block}
153692e5dbf12901edacf14812a6fae25462920af42Steve Block
154692e5dbf12901edacf14812a6fae25462920af42Steve BlockAction::OwningStmtResult
155692e5dbf12901edacf14812a6fae25462920af42Steve BlockSema::ActOnLabelStmt(SourceLocation IdentLoc, IdentifierInfo *II,
156692e5dbf12901edacf14812a6fae25462920af42Steve Block                     SourceLocation ColonLoc, StmtArg subStmt) {
157692e5dbf12901edacf14812a6fae25462920af42Steve Block  Stmt *SubStmt = subStmt.takeAs<Stmt>();
158692e5dbf12901edacf14812a6fae25462920af42Steve Block  // Look up the record for this label identifier.
159692e5dbf12901edacf14812a6fae25462920af42Steve Block  LabelStmt *&LabelDecl = getLabelMap()[II];
160692e5dbf12901edacf14812a6fae25462920af42Steve Block
161692e5dbf12901edacf14812a6fae25462920af42Steve Block  // If not forward referenced or defined already, just create a new LabelStmt.
162692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (LabelDecl == 0)
163692e5dbf12901edacf14812a6fae25462920af42Steve Block    return Owned(LabelDecl = new (Context) LabelStmt(IdentLoc, II, SubStmt));
164692e5dbf12901edacf14812a6fae25462920af42Steve Block
165692e5dbf12901edacf14812a6fae25462920af42Steve Block  assert(LabelDecl->getID() == II && "Label mismatch!");
166692e5dbf12901edacf14812a6fae25462920af42Steve Block
167692e5dbf12901edacf14812a6fae25462920af42Steve Block  // Otherwise, this label was either forward reference or multiply defined.  If
168692e5dbf12901edacf14812a6fae25462920af42Steve Block  // multiply defined, reject it now.
169692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (LabelDecl->getSubStmt()) {
170692e5dbf12901edacf14812a6fae25462920af42Steve Block    Diag(IdentLoc, diag::err_redefinition_of_label) << LabelDecl->getID();
171692e5dbf12901edacf14812a6fae25462920af42Steve Block    Diag(LabelDecl->getIdentLoc(), diag::note_previous_definition);
172692e5dbf12901edacf14812a6fae25462920af42Steve Block    return Owned(SubStmt);
173692e5dbf12901edacf14812a6fae25462920af42Steve Block  }
174692e5dbf12901edacf14812a6fae25462920af42Steve Block
175692e5dbf12901edacf14812a6fae25462920af42Steve Block  // Otherwise, this label was forward declared, and we just found its real
176692e5dbf12901edacf14812a6fae25462920af42Steve Block  // definition.  Fill in the forward definition and return it.
177692e5dbf12901edacf14812a6fae25462920af42Steve Block  LabelDecl->setIdentLoc(IdentLoc);
178692e5dbf12901edacf14812a6fae25462920af42Steve Block  LabelDecl->setSubStmt(SubStmt);
179692e5dbf12901edacf14812a6fae25462920af42Steve Block  return Owned(LabelDecl);
180692e5dbf12901edacf14812a6fae25462920af42Steve Block}
181692e5dbf12901edacf14812a6fae25462920af42Steve Block
182692e5dbf12901edacf14812a6fae25462920af42Steve BlockAction::OwningStmtResult
183692e5dbf12901edacf14812a6fae25462920af42Steve BlockSema::ActOnIfStmt(SourceLocation IfLoc, ExprArg CondVal,
184692e5dbf12901edacf14812a6fae25462920af42Steve Block                  StmtArg ThenVal, SourceLocation ElseLoc,
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                  StmtArg ElseVal) {
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  Expr *condExpr = CondVal.takeAs<Expr>();
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  assert(condExpr && "ActOnIfStmt(): missing expression");
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
190692e5dbf12901edacf14812a6fae25462920af42Steve Block  if (!condExpr->isTypeDependent()) {
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DefaultFunctionArrayConversion(condExpr);
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Take ownership again until we're past the error checking.
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CondVal = condExpr;
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QualType condType = condExpr->getType();
195692e5dbf12901edacf14812a6fae25462920af42Steve Block
196692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (getLangOptions().CPlusPlus) {
197692e5dbf12901edacf14812a6fae25462920af42Steve Block      if (CheckCXXBooleanCondition(condExpr)) // C++ 6.4p4
198692e5dbf12901edacf14812a6fae25462920af42Steve Block        return StmtError();
199692e5dbf12901edacf14812a6fae25462920af42Steve Block    } else if (!condType->isScalarType()) // C99 6.8.4.1p1
200692e5dbf12901edacf14812a6fae25462920af42Steve Block      return StmtError(Diag(IfLoc,
201692e5dbf12901edacf14812a6fae25462920af42Steve Block                            diag::err_typecheck_statement_requires_scalar)
202692e5dbf12901edacf14812a6fae25462920af42Steve Block                       << condType << condExpr->getSourceRange());
203692e5dbf12901edacf14812a6fae25462920af42Steve Block  }
204692e5dbf12901edacf14812a6fae25462920af42Steve Block
205692e5dbf12901edacf14812a6fae25462920af42Steve Block  Stmt *thenStmt = ThenVal.takeAs<Stmt>();
206692e5dbf12901edacf14812a6fae25462920af42Steve Block
2075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Warn if the if block has a null body without an else value.
2085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // this helps prevent bugs due to typos, such as
209ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block  // if (condition);
210ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block  //   do_stuff();
211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  if (!ElseVal.get()) {
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (NullStmt* stmt = dyn_cast<NullStmt>(thenStmt))
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block      Diag(stmt->getSemiLoc(), diag::warn_empty_if_body);
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  }
2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  CondVal.release();
2175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) IfStmt(IfLoc, condExpr, thenStmt,
2185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                    ElseLoc, ElseVal.takeAs<Stmt>()));
219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenAction::OwningStmtResult
2225ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnStartOfSwitchStmt(ExprArg cond) {
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Expr *Cond = cond.takeAs<Expr>();
224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (getLangOptions().CPlusPlus) {
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // C++ 6.4.2.p2:
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // The condition shall be of integral type, enumeration type, or of a class
2285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // type for which a single conversion function to integral or enumeration
2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // type exists (12.3). If the condition is of class type, the condition is
2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // converted by calling that conversion function, and the result of the
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // conversion is used in place of the original condition for the remainder
2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // of this section. Integral promotions are performed.
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!Cond->isTypeDependent()) {
2345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block      QualType Ty = Cond->getType();
2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // FIXME: Handle class types.
2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // If the type is wrong a diagnostic will be emitted later at
2395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // ActOnFinishSwitchStmt.
2405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (Ty->isIntegralType() || Ty->isEnumeralType()) {
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // Integral promotions are performed.
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // FIXME: Integral promotions for C++ are not complete.
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        UsualUnaryConversions(Cond);
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block      }
2455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
2465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  } else {
24706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // C99 6.8.4.2p5 - Integer promotions are performed on the controlling expr.
24806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    UsualUnaryConversions(Cond);
24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen  }
25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen  SwitchStmt *SS = new (Context) SwitchStmt(Cond);
25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen  getSwitchStack().push_back(SS);
25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen  return Owned(SS);
2545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/// ConvertIntegerToTypeWarnOnOverflow - Convert the specified APInt to have
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// the specified width and sign.  If an overflow occurs, detect it and emit
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// the specified diagnostic.
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid Sema::ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &Val,
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                              unsigned NewWidth, bool NewSign,
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                              SourceLocation Loc,
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                                              unsigned DiagID) {
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // Perform a conversion to the promoted condition type if needed.
2645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (NewWidth > Val.getBitWidth()) {
2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // If this is an extension, just do it.
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    llvm::APSInt OldVal(Val);
2675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Val.extend(NewWidth);
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // If the input was signed and negative and the output is unsigned,
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // warn.
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!NewSign && OldVal.isSigned() && OldVal.isNegative())
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      Diag(Loc, DiagID) << OldVal.toString(10) << Val.toString(10);
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Val.setIsSigned(NewSign);
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  } else if (NewWidth < Val.getBitWidth()) {
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If this is a truncation, check for overflow.
2775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    llvm::APSInt ConvVal(Val);
2785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConvVal.trunc(NewWidth);
2795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConvVal.setIsSigned(NewSign);
2805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConvVal.extend(Val.getBitWidth());
2815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConvVal.setIsSigned(Val.isSigned());
2825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (ConvVal != Val)
2835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Diag(Loc, DiagID) << Val.toString(10) << ConvVal.toString(10);
2845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Regardless of whether a diagnostic was emitted, really do the
2865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // truncation.
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Val.trunc(NewWidth);
2885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Val.setIsSigned(NewSign);
2895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  } else if (NewSign != Val.isSigned()) {
2905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Convert the sign to match the sign of the condition.  This can cause
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // overflow as well: unsigned(INTMIN)
2925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    llvm::APSInt OldVal(Val);
2935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Val.setIsSigned(NewSign);
2945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
295692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (Val.isNegative())  // Sign bit changes meaning.
2965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Diag(Loc, DiagID) << OldVal.toString(10) << Val.toString(10);
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  }
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarknamespace {
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  struct CaseCompareFunctor {
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                    const llvm::APSInt &RHS) {
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      return LHS.first < RHS;
305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                    const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      return LHS.first < RHS.first;
309231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
310563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    bool operator()(const llvm::APSInt &LHS,
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                    const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      return LHS < RHS.first;
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  };
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// CmpCaseVals - Comparison predicate for sorting case values.
3185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark///
3195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkstatic bool CmpCaseVals(const std::pair<llvm::APSInt, CaseStmt*>& lhs,
3205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                        const std::pair<llvm::APSInt, CaseStmt*>& rhs) {
3215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (lhs.first < rhs.first)
322563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (lhs.first == rhs.first &&
325ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block      lhs.second->getCaseLoc().getRawEncoding()
326ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block       < rhs.second->getCaseLoc().getRawEncoding())
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  return false;
329d0825bca7fe65beaee391d30da42e937db621564Steve Block}
330d0825bca7fe65beaee391d30da42e937db621564Steve Block
331d0825bca7fe65beaee391d30da42e937db621564Steve BlockAction::OwningStmtResult
332d0825bca7fe65beaee391d30da42e937db621564Steve BlockSema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, StmtArg Switch,
333563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                            StmtArg Body) {
3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Stmt *BodyStmt = Body.takeAs<Stmt>();
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  SwitchStmt *SS = getSwitchStack().back();
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  assert(SS == (SwitchStmt*)Switch.get() && "switch stack missing push/pop!");
338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  SS->setBody(BodyStmt, SwitchLoc);
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  getSwitchStack().pop_back();
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Expr *CondExpr = SS->getCond();
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  QualType CondType = CondExpr->getType();
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (!CondExpr->isTypeDependent() &&
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      !CondType->isIntegerType()) { // C99 6.8.4.2p1
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Diag(SwitchLoc, diag::err_typecheck_statement_requires_integer)
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      << CondType << CondExpr->getSourceRange();
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return StmtError();
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  }
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // Get the bitwidth of the switched-on value before promotions.  We must
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // convert the integer case values to this width before comparison.
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  bool HasDependentValue
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    = CondExpr->isTypeDependent() || CondExpr->isValueDependent();
3565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  unsigned CondWidth
3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    = HasDependentValue? 0
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                       : static_cast<unsigned>(Context.getTypeSize(CondType));
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  bool CondIsSigned = CondType->isSignedIntegerType();
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // Accumulate all of the case values in a vector so that we can sort them
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // and detect duplicates.  This vector contains the APInt for the case after
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // it has been converted to the condition type.
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  typedef llvm::SmallVector<std::pair<llvm::APSInt, CaseStmt*>, 64> CaseValsTy;
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  CaseValsTy CaseVals;
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // Keep track of any GNU case ranges we see.  The APSInt is the low value.
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  std::vector<std::pair<llvm::APSInt, CaseStmt*> > CaseRanges;
3695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  DefaultStmt *TheDefaultStmt = 0;
3715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  bool CaseListIsErroneous = false;
3735e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3745e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block  for (SwitchCase *SC = SS->getSwitchCaseList(); SC && !HasDependentValue;
3755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block       SC = SC->getNextSwitchCase()) {
3765e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3775e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (DefaultStmt *DS = dyn_cast<DefaultStmt>(SC)) {
3785e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block      if (TheDefaultStmt) {
3795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        Diag(DS->getDefaultLoc(), diag::err_multiple_default_labels_defined);
3805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        Diag(TheDefaultStmt->getDefaultLoc(), diag::note_duplicate_case_prev);
3815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // FIXME: Remove the default statement from the switch block so that
3835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // we'll return a valid AST.  This requires recursing down the AST and
3845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // finding it, not something we are set up to do right now.  For now,
385563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // just lop the entire switch stmt out of the AST.
3865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        CaseListIsErroneous = true;
387563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      }
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      TheDefaultStmt = DS;
3895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else {
3915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      CaseStmt *CS = cast<CaseStmt>(SC);
3925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // We already verified that the expression has a i-c-e value (C99
3945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // 6.8.4.2p3) - get that value now.
3955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Expr *Lo = CS->getLHS();
3965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (Lo->isTypeDependent() || Lo->isValueDependent()) {
3985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        HasDependentValue = true;
3995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        break;
4005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      }
4015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      llvm::APSInt LoVal = Lo->EvaluateAsInt(Context);
4035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // Convert the value to the same width/sign as the condition.
4055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      ConvertIntegerToTypeWarnOnOverflow(LoVal, CondWidth, CondIsSigned,
4065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                         CS->getLHS()->getLocStart(),
4075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                         diag::warn_case_value_overflow);
4085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // If the LHS is not the same type as the condition, insert an implicit
4105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // cast.
4115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      ImpCastExprToType(Lo, CondType);
4125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      CS->setLHS(Lo);
4135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // If this is a case range, remember it in CaseRanges, otherwise CaseVals.
4155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (CS->getRHS()) {
4165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (CS->getRHS()->isTypeDependent() ||
4175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            CS->getRHS()->isValueDependent()) {
4185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          HasDependentValue = true;
4195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          break;
4205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
4215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        CaseRanges.push_back(std::make_pair(LoVal, CS));
4225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      } else
4235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        CaseVals.push_back(std::make_pair(LoVal, CS));
4245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
4255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
4265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!HasDependentValue) {
4285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Sort all the scalar case values so we can easily detect duplicates.
4295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    std::stable_sort(CaseVals.begin(), CaseVals.end(), CmpCaseVals);
4305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!CaseVals.empty()) {
4325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      for (unsigned i = 0, e = CaseVals.size()-1; i != e; ++i) {
4335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (CaseVals[i].first == CaseVals[i+1].first) {
4345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          // If we have a duplicate, report it.
4355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          Diag(CaseVals[i+1].second->getLHS()->getLocStart(),
4365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark               diag::err_duplicate_case) << CaseVals[i].first.toString(10);
4375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          Diag(CaseVals[i].second->getLHS()->getLocStart(),
4385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark               diag::note_duplicate_case_prev);
4395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          // FIXME: We really want to remove the bogus case stmt from the
4405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          // substmt, but we have no way to do this right now.
4415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          CaseListIsErroneous = true;
4425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
4435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      }
4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Detect duplicate case ranges, which usually don't exist at all in
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // the first place.
4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!CaseRanges.empty()) {
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // Sort all the case ranges by their low value so we can easily detect
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // overlaps between ranges.
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      std::stable_sort(CaseRanges.begin(), CaseRanges.end());
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // Scan the ranges, computing the high values and removing empty ranges.
4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      std::vector<llvm::APSInt> HiVals;
4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CaseStmt *CR = CaseRanges[i].second;
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Expr *Hi = CR->getRHS();
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        llvm::APSInt HiVal = Hi->EvaluateAsInt(Context);
4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Convert the value to the same width/sign as the condition.
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ConvertIntegerToTypeWarnOnOverflow(HiVal, CondWidth, CondIsSigned,
4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                           CR->getRHS()->getLocStart(),
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                           diag::warn_case_value_overflow);
4645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // If the LHS is not the same type as the condition, insert an implicit
466563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // cast.
467563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ImpCastExprToType(Hi, CondType);
468563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        CR->setRHS(Hi);
469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
470563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // If the low value is bigger than the high value, the case is empty.
471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (CaseRanges[i].first > HiVal) {
472563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          Diag(CR->getLHS()->getLocStart(), diag::warn_case_empty_range)
473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            << SourceRange(CR->getLHS()->getLocStart(),
4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                           CR->getRHS()->getLocEnd());
4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch          CaseRanges.erase(CaseRanges.begin()+i);
4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch          --i, --e;
4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch          continue;
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        HiVals.push_back(HiVal);
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      }
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // Rescan the ranges, looking for overlap with singleton values and other
4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // ranges.  Since the range list is sorted, we only need to compare case
4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // ranges with their neighbors.
4850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
4860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        llvm::APSInt &CRLo = CaseRanges[i].first;
4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        llvm::APSInt &CRHi = HiVals[i];
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CaseStmt *CR = CaseRanges[i].second;
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Check to see whether the case range overlaps with any
491563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // singleton cases.
492563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        CaseStmt *OverlapStmt = 0;
493563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        llvm::APSInt OverlapVal(32);
494563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
495563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Find the smallest value >= the lower bound.  If I is in the
496563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // case range, then we have overlap.
497563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        CaseValsTy::iterator I = std::lower_bound(CaseVals.begin(),
498563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                  CaseVals.end(), CRLo,
499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                                  CaseCompareFunctor());
500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (I != CaseVals.end() && I->first < CRHi) {
501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          OverlapVal  = I->first;   // Found overlap with scalar.
502563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          OverlapStmt = I->second;
503563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
505563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Find the smallest value bigger than the upper bound.
506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        I = std::upper_bound(I, CaseVals.end(), CRHi, CaseCompareFunctor());
507563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (I != CaseVals.begin() && (I-1)->first >= CRLo) {
508563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          OverlapVal  = (I-1)->first;      // Found overlap with scalar.
509563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          OverlapStmt = (I-1)->second;
510563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
512563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Check to see if this case stmt overlaps with the subsequent
513563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // case range.
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (i && CRLo <= HiVals[i-1]) {
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          OverlapVal  = HiVals[i-1];       // Found overlap with range.
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          OverlapStmt = CaseRanges[i-1].second;
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (OverlapStmt) {
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          // If we have a duplicate, report it.
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          Diag(CR->getLHS()->getLocStart(), diag::err_duplicate_case)
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            << OverlapVal.toString(10);
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          Diag(OverlapStmt->getLHS()->getLocStart(),
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block               diag::note_duplicate_case_prev);
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          // FIXME: We really want to remove the bogus case stmt from the
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          // substmt, but we have no way to do this right now.
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          CaseListIsErroneous = true;
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      }
5305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
5315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
5325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // FIXME: If the case list was broken is some way, we don't have a good system
5345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // to patch it up.  Instead, just return the whole substmt as broken.
5355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (CaseListIsErroneous)
5365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError();
537692e5dbf12901edacf14812a6fae25462920af42Steve Block
5385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Switch.release();
5395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(SS);
540692e5dbf12901edacf14812a6fae25462920af42Steve Block}
5415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5425ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
5435ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnWhileStmt(SourceLocation WhileLoc, ExprArg Cond, StmtArg Body) {
5445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *condExpr = Cond.takeAs<Expr>();
5455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  assert(condExpr && "ActOnWhileStmt(): missing expression");
5465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!condExpr->isTypeDependent()) {
5485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    DefaultFunctionArrayConversion(condExpr);
5495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Cond = condExpr;
5505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    QualType condType = condExpr->getType();
5515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (getLangOptions().CPlusPlus) {
5535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (CheckCXXBooleanCondition(condExpr)) // C++ 6.4p4
5545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return StmtError();
5555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else if (!condType->isScalarType()) // C99 6.8.5p2
5565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(WhileLoc,
557692e5dbf12901edacf14812a6fae25462920af42Steve Block                            diag::err_typecheck_statement_requires_scalar)
558692e5dbf12901edacf14812a6fae25462920af42Steve Block                       << condType << condExpr->getSourceRange());
5595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
5605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Cond.release();
5625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) WhileStmt(condExpr, Body.takeAs<Stmt>(),
5635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                       WhileLoc));
5645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5665ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
5675ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnDoStmt(SourceLocation DoLoc, StmtArg Body,
5685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                  SourceLocation WhileLoc, ExprArg Cond) {
5695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *condExpr = Cond.takeAs<Expr>();
5705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  assert(condExpr && "ActOnDoStmt(): missing expression");
5715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!condExpr->isTypeDependent()) {
5735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    DefaultFunctionArrayConversion(condExpr);
5745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Cond = condExpr;
5755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    QualType condType = condExpr->getType();
5765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (getLangOptions().CPlusPlus) {
5785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (CheckCXXBooleanCondition(condExpr)) // C++ 6.4p4
5795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return StmtError();
5805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else if (!condType->isScalarType()) // C99 6.8.5p2
5815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(DoLoc,
5825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                            diag::err_typecheck_statement_requires_scalar)
5835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                       << condType << condExpr->getSourceRange());
5845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
5855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Cond.release();
5875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) DoStmt(Body.takeAs<Stmt>(), condExpr, DoLoc,
5885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                    WhileLoc));
5895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5915ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
5925ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
5935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                   StmtArg first, ExprArg second, ExprArg third,
5945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                   SourceLocation RParenLoc, StmtArg body) {
5955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Stmt *First  = static_cast<Stmt*>(first.get());
5965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *Second = static_cast<Expr*>(second.get());
5975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *Third  = static_cast<Expr*>(third.get());
5985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Stmt *Body  = static_cast<Stmt*>(body.get());
5995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!getLangOptions().CPlusPlus) {
6015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (DeclStmt *DS = dyn_cast_or_null<DeclStmt>(First)) {
6025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // C99 6.8.5p3: The declaration part of a 'for' statement shall only
6035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // declare identifiers for objects having storage class 'auto' or
6045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // 'register'.
6055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE=DS->decl_end();
6065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark           DI!=DE; ++DI) {
6075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        VarDecl *VD = dyn_cast<VarDecl>(*DI);
6085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (VD && VD->isBlockVarDecl() && !VD->hasLocalStorage())
6095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          VD = 0;
6105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (VD == 0)
6115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          Diag((*DI)->getLocation(), diag::err_non_variable_decl_in_for);
6125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // FIXME: mark decl erroneous!
6135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      }
6145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
6155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
6165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (Second && !Second->isTypeDependent()) {
6170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DefaultFunctionArrayConversion(Second);
6185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    QualType SecondType = Second->getType();
6195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (getLangOptions().CPlusPlus) {
6215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (CheckCXXBooleanCondition(Second)) // C++ 6.4p4
622563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return StmtError();
623563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } else if (!SecondType->isScalarType()) // C99 6.8.5p2
6245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(ForLoc,
6255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                            diag::err_typecheck_statement_requires_scalar)
6265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        << SecondType << Second->getSourceRange());
6275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
6285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  first.release();
6295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  second.release();
6305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  third.release();
6315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  body.release();
6325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ForStmt(First, Second, Third, Body, ForLoc,
6335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                     LParenLoc, RParenLoc));
6345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6365ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
6375ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
6385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                 SourceLocation LParenLoc,
6395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                 StmtArg first, ExprArg second,
6405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                 SourceLocation RParenLoc, StmtArg body) {
6415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Stmt *First  = static_cast<Stmt*>(first.get());
6425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *Second = static_cast<Expr*>(second.get());
6435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Stmt *Body  = static_cast<Stmt*>(body.get());
644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (First) {
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    QualType FirstType;
6465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (DeclStmt *DS = dyn_cast<DeclStmt>(First)) {
647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      if (!DS->isSingleDecl())
6485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return StmtError(Diag((*DS->decl_begin())->getLocation(),
6495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                         diag::err_toomany_element_decls));
6505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Decl *D = DS->getSingleDecl();
6525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      FirstType = cast<ValueDecl>(D)->getType();
6535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // C99 6.8.5p3: The declaration part of a 'for' statement shall only
6545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // declare identifiers for objects having storage class 'auto' or
6555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // 'register'.
6565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      VarDecl *VD = cast<VarDecl>(D);
6575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (VD->isBlockVarDecl() && !VD->hasLocalStorage())
658d0825bca7fe65beaee391d30da42e937db621564Steve Block        return StmtError(Diag(VD->getLocation(),
6595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              diag::err_non_variable_decl_in_for));
660d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else {
661d0825bca7fe65beaee391d30da42e937db621564Steve Block      if (cast<Expr>(First)->isLvalue(Context) != Expr::LV_Valid)
662d0825bca7fe65beaee391d30da42e937db621564Steve Block        return StmtError(Diag(First->getLocStart(),
663d0825bca7fe65beaee391d30da42e937db621564Steve Block                   diag::err_selector_element_not_lvalue)
664d0825bca7fe65beaee391d30da42e937db621564Steve Block          << First->getSourceRange());
665d0825bca7fe65beaee391d30da42e937db621564Steve Block
666d0825bca7fe65beaee391d30da42e937db621564Steve Block      FirstType = static_cast<Expr*>(First)->getType();
667d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
668d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!Context.isObjCObjectPointerType(FirstType))
669d0825bca7fe65beaee391d30da42e937db621564Steve Block        Diag(ForLoc, diag::err_selector_element_type)
670d0825bca7fe65beaee391d30da42e937db621564Steve Block          << FirstType << First->getSourceRange();
671d0825bca7fe65beaee391d30da42e937db621564Steve Block  }
672d0825bca7fe65beaee391d30da42e937db621564Steve Block  if (Second) {
673d0825bca7fe65beaee391d30da42e937db621564Steve Block    DefaultFunctionArrayConversion(Second);
674d0825bca7fe65beaee391d30da42e937db621564Steve Block    QualType SecondType = Second->getType();
675d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!Context.isObjCObjectPointerType(SecondType))
676d0825bca7fe65beaee391d30da42e937db621564Steve Block      Diag(ForLoc, diag::err_collection_expr_type)
677d0825bca7fe65beaee391d30da42e937db621564Steve Block        << SecondType << Second->getSourceRange();
678d0825bca7fe65beaee391d30da42e937db621564Steve Block  }
679d0825bca7fe65beaee391d30da42e937db621564Steve Block  first.release();
680d0825bca7fe65beaee391d30da42e937db621564Steve Block  second.release();
681d0825bca7fe65beaee391d30da42e937db621564Steve Block  body.release();
682d0825bca7fe65beaee391d30da42e937db621564Steve Block  return Owned(new (Context) ObjCForCollectionStmt(First, Second, Body,
683d0825bca7fe65beaee391d30da42e937db621564Steve Block                                                   ForLoc, RParenLoc));
684d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6865ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
6875ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
6885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    IdentifierInfo *LabelII) {
6895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // If we are in a block, reject all gotos for now.
6905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (CurBlock)
6915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError(Diag(GotoLoc, diag::err_goto_in_block));
6925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // Look up the record for this label identifier.
6945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  LabelStmt *&LabelDecl = getLabelMap()[LabelII];
6955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // If we haven't seen this label yet, create a forward reference.
6975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (LabelDecl == 0)
6985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    LabelDecl = new (Context) LabelStmt(LabelLoc, LabelII, 0);
6995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) GotoStmt(LabelDecl, GotoLoc, LabelLoc));
7015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7035ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
7045ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc,
7055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                            ExprArg DestExp) {
7065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Convert operand to void*
7075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr* E = DestExp.takeAs<Expr>();
7085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!E->isTypeDependent()) {
7095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    QualType ETy = E->getType();
7105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    AssignConvertType ConvTy =
7115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      CheckSingleAssignmentConstraints(Context.VoidPtrTy, E);
7125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (DiagnoseAssignmentResult(ConvTy, StarLoc, Context.VoidPtrTy, ETy,
7135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                 E, "passing"))
7145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError();
7155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) IndirectGotoStmt(GotoLoc, StarLoc, E));
7175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7195ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
7205ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope) {
721563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  Scope *S = CurScope->getContinueParent();
7225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!S) {
723d0825bca7fe65beaee391d30da42e937db621564Steve Block    // C99 6.8.6.2p1: A break shall appear only in or as a loop body.
7245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError(Diag(ContinueLoc, diag::err_continue_not_in_loop));
7255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ContinueStmt(ContinueLoc));
7285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
729d0825bca7fe65beaee391d30da42e937db621564Steve Block
7305ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
7315ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope) {
7320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Scope *S = CurScope->getBreakParent();
7335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!S) {
7345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // C99 6.8.6.3p1: A break shall appear only in or as a switch/loop body.
7355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError(Diag(BreakLoc, diag::err_break_not_in_loop_or_switch));
7365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) BreakStmt(BreakLoc));
7395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
740cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
741cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/// ActOnBlockReturnStmt - Utility routine to figure out block's return type.
7425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark///
743cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockAction::OwningStmtResult
7445ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnBlockReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
7455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // If this is the first return we've seen in the block, infer the type of
7465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // the block from it.
7475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (CurBlock->ReturnType == 0) {
7485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (RetValExp) {
7495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // Don't call UsualUnaryConversions(), since we don't want to do
7505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // integer promotions here.
7515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      DefaultFunctionArrayConversion(RetValExp);
7525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      CurBlock->ReturnType = RetValExp->getType().getTypePtr();
753cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    } else
7545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      CurBlock->ReturnType = Context.VoidTy.getTypePtr();
7555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  QualType FnRetType = QualType(CurBlock->ReturnType, 0);
7575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (CurBlock->TheDecl->hasAttr<NoReturnAttr>()) {
7595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Diag(ReturnLoc, diag::err_noreturn_block_has_return_expr)
7605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      << getCurFunctionOrMethodDecl()->getDeclName();
7615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError();
7625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Otherwise, verify that this result type matches the previous one.  We are
765231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // pickier with blocks than for normal functions because we don't have GCC
7665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // compatibility to worry about here.
7675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (CurBlock->ReturnType->isVoidType()) {
7685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (RetValExp) {
7695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      Diag(ReturnLoc, diag::err_return_block_has_expr);
770563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      RetValExp->Destroy(Context);
7715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      RetValExp = 0;
7725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp));
7745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
7755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!RetValExp)
7775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError(Diag(ReturnLoc, diag::err_block_return_missing_expr));
7785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!FnRetType->isDependentType() && !RetValExp->isTypeDependent()) {
7805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // we have a non-void block with an expression, continue checking
781d0825bca7fe65beaee391d30da42e937db621564Steve Block    QualType RetValType = RetValExp->getType();
782d0825bca7fe65beaee391d30da42e937db621564Steve Block
7835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // C99 6.8.6.4p3(136): The return statement is not an assignment. The
7845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // overlap restriction of subclause 6.5.16.1 does not apply to the case of
7855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // function return.
7865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7875e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    // In C++ the return statement is handled via a copy initialization.
7885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // the C version of which boils down to CheckSingleAssignmentConstraints.
7895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // FIXME: Leaks RetValExp.
7905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (PerformCopyInitialization(RetValExp, FnRetType, "returning"))
7915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError();
7925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (RetValExp) CheckReturnStackAddr(RetValExp, FnRetType, ReturnLoc);
7945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
795563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp));
797563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/// IsReturnCopyElidable - Whether returning @p RetExpr from a function that
800563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// returns a @p RetType fulfills the criteria for copy elision (C++0x 12.8p15).
801563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool IsReturnCopyElidable(ASTContext &Ctx, QualType RetType,
802563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                 Expr *RetExpr) {
803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  QualType ExprType = RetExpr->getType();
804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  // - in a return statement in a function with ...
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  // ... a class return type ...
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  if (!RetType->isRecordType())
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
8085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // ... the same cv-unqualified type as the function return type ...
809563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (Ctx.getCanonicalType(RetType).getUnqualifiedType() !=
810563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      Ctx.getCanonicalType(ExprType).getUnqualifiedType())
811563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return false;
8125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // ... the expression is the name of a non-volatile automatic object ...
8135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // We ignore parentheses here.
8145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // FIXME: Is this compliant?
8155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(RetExpr->IgnoreParens());
8165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!DR)
8175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return false;
8185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl());
8195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!VD)
8205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return false;
821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  return VD->hasLocalStorage() && !VD->getType()->isReferenceType()
8225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    && !VD->getType().isVolatileQualified();
8235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
824692e5dbf12901edacf14812a6fae25462920af42Steve Block
8255ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
8265ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnReturnStmt(SourceLocation ReturnLoc, ExprArg rex) {
8275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *RetValExp = rex.takeAs<Expr>();
828563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (CurBlock)
829563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return ActOnBlockReturnStmt(ReturnLoc, RetValExp);
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  QualType FnRetType;
832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (const FunctionDecl *FD = getCurFunctionDecl()) {
833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    FnRetType = FD->getResultType();
8345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (FD->hasAttr<NoReturnAttr>()) {
835563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      Diag(ReturnLoc, diag::err_noreturn_function_has_return_expr)
836692e5dbf12901edacf14812a6fae25462920af42Steve Block        << getCurFunctionOrMethodDecl()->getDeclName();
837563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      return StmtError();
838563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
839563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  } else if (ObjCMethodDecl *MD = getCurMethodDecl())
840563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    FnRetType = MD->getResultType();
841563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  else // If we don't have a function/method context, bail.
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return StmtError();
843692e5dbf12901edacf14812a6fae25462920af42Steve Block
8445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (FnRetType->isVoidType()) {
845692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (RetValExp) {// C99 6.8.6.4p1 (ext_ since GCC warns)
8465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      unsigned D = diag::ext_return_has_expr;
8475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (RetValExp->getType()->isVoidType())
8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        D = diag::ext_return_has_void_expr;
8495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // return (some void expression); is legal in C++.
8515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (D != diag::ext_return_has_void_expr ||
8525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          !getLangOptions().CPlusPlus) {
853ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        NamedDecl *CurDecl = getCurFunctionOrMethodDecl();
854ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        Diag(ReturnLoc, D)
855ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block          << CurDecl->getDeclName() << isa<ObjCMethodDecl>(CurDecl)
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          << RetValExp->getSourceRange();
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      }
8585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp));
8605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
8615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!RetValExp && !FnRetType->isDependentType()) {
8635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    unsigned DiagID = diag::warn_return_missing_expr;  // C90 6.6.6.4p4
864563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // C99 6.8.6.4p1 (ext_ since GCC warns)
8650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (getLangOptions().C99) DiagID = diag::ext_return_missing_expr;
8665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
867cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (FunctionDecl *FD = getCurFunctionDecl())
868563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      Diag(ReturnLoc, DiagID) << FD->getIdentifier() << 0/*fn*/;
869563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
8700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      Diag(ReturnLoc, DiagID) << getCurMethodDecl()->getDeclName() << 1/*meth*/;
8710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return Owned(new (Context) ReturnStmt(ReturnLoc, (Expr*)0));
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  }
873563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
874563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  if (!FnRetType->isDependentType() && !RetValExp->isTypeDependent()) {
875563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // we have a non-void function with an expression, continue checking
876563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // C99 6.8.6.4p3(136): The return statement is not an assignment. The
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // overlap restriction of subclause 6.5.16.1 does not apply to the case of
8795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // function return.
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
881563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // C++0x 12.8p15: When certain criteria are met, an implementation is
882563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //   allowed to omit the copy construction of a class object, [...]
883563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //   - in a return statement in a function with a class return type, when
884563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //     the expression is the name of a non-volatile automatic object with
885563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //     the same cv-unqualified type as the function return type, the copy
886563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //     operation can be omitted [...]
887563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // C++0x 12.8p16: When the criteria for elision of a copy operation are met
8885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    //   and the object to be copied is designated by an lvalue, overload
8895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    //   resolution to select the constructor for the copy is first performed
8905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    //   as if the object were designated by an rvalue.
8915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Note that we only compute Elidable if we're in C++0x, since we don't
8925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // care otherwise.
8935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    bool Elidable = getLangOptions().CPlusPlus0x ?
8945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                      IsReturnCopyElidable(Context, FnRetType, RetValExp) :
8955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                      false;
8965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // In C++ the return statement is handled via a copy initialization.
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // the C version of which boils down to CheckSingleAssignmentConstraints.
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME: Leaks RetValExp on error.
900692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (PerformCopyInitialization(RetValExp, FnRetType, "returning", Elidable))
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      return StmtError();
902dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (RetValExp) CheckReturnStackAddr(RetValExp, FnRetType, ReturnLoc);
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  }
9055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ReturnStmt(ReturnLoc, RetValExp));
9075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
9085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/// CheckAsmLValue - GNU C has an extremely ugly extension whereby they silently
910cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block/// ignore "noop" casts in places where an lvalue is required by an inline asm.
9110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/// We emulate this behavior when -fheinous-gnu-extensions is specified, but
9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/// provide a strong guidance to not use it.
9135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark///
914545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch/// This method checks to see if the argument is an acceptable l-value and
9155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/// returns false if it is a case we can handle.
9165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkstatic bool CheckAsmLValue(const Expr *E, Sema &S) {
9170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  if (E->isLvalue(S.Context) == Expr::LV_Valid)
9180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;  // Cool, this is an lvalue.
9195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Okay, this is not an lvalue, but perhaps it is the result of a cast that we
921cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block  // are supposed to allow.
922563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  const Expr *E2 = E->IgnoreParenNoopCasts(S.Context);
9230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  if (E != E2 && E2->isLvalue(S.Context) == Expr::LV_Valid) {
924563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!S.getLangOptions().HeinousExtensions)
9255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      S.Diag(E2->getLocStart(), diag::err_invalid_asm_cast_lvalue)
9265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        << E->getSourceRange();
9275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    else
9285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      S.Diag(E2->getLocStart(), diag::warn_invalid_asm_cast_lvalue)
9295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        << E->getSourceRange();
9305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Accept, even if we emitted an error diagnostic.
9315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return false;
9325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
9330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // None of the above, just randomly invalid non-lvalue.
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  return true;
936692e5dbf12901edacf14812a6fae25462920af42Steve Block}
937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9395ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                          bool IsSimple,
9415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          bool IsVolatile,
9425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          unsigned NumOutputs,
9435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          unsigned NumInputs,
9445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          std::string *Names,
9455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          MultiExprArg constraints,
946cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                          MultiExprArg exprs,
9470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                          ExprArg asmString,
9485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          MultiExprArg clobbers,
9495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          SourceLocation RParenLoc) {
9505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  unsigned NumClobbers = clobbers.size();
9515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  StringLiteral **Constraints =
9520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    reinterpret_cast<StringLiteral**>(constraints.get());
9530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Expr **Exprs = reinterpret_cast<Expr **>(exprs.get());
9545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  StringLiteral *AsmString = cast<StringLiteral>((Expr *)asmString.get());
9555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  StringLiteral **Clobbers = reinterpret_cast<StringLiteral**>(clobbers.get());
956cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
957563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  llvm::SmallVector<TargetInfo::ConstraintInfo, 4> OutputConstraintInfos;
9580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
959563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // The parser verifies that there is a string literal here.
9605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (AsmString->isWide())
9615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError(Diag(AsmString->getLocStart(),diag::err_asm_wide_character)
9625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      << AsmString->getSourceRange());
9635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  for (unsigned i = 0; i != NumOutputs; i++) {
9655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    StringLiteral *Literal = Constraints[i];
9665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (Literal->isWide())
9675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(Literal->getLocStart(),diag::err_asm_wide_character)
9680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        << Literal->getSourceRange());
9690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    TargetInfo::ConstraintInfo Info(Literal->getStrData(),
971692e5dbf12901edacf14812a6fae25462920af42Steve Block                                    Literal->getByteLength(),
972dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                    Names[i]);
973dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!Context.Target.validateOutputConstraint(Info))
9745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(Literal->getLocStart(),
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            diag::err_asm_invalid_output_constraint)
9765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                       << Info.getConstraintStr());
9775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Check that the output exprs are valid lvalues.
9795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Expr *OutputExpr = Exprs[i];
9805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (CheckAsmLValue(OutputExpr, *this)) {
981cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block      return StmtError(Diag(OutputExpr->getLocStart(),
9820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                  diag::err_asm_invalid_lvalue_in_output)
9835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        << OutputExpr->getSourceRange());
9845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
9855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    OutputConstraintInfos.push_back(Info);
9875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
9880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  llvm::SmallVector<TargetInfo::ConstraintInfo, 4> InputConstraintInfos;
9905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  for (unsigned i = NumOutputs, e = NumOutputs + NumInputs; i != e; i++) {
992cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    StringLiteral *Literal = Constraints[i];
993563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (Literal->isWide())
9940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      return StmtError(Diag(Literal->getLocStart(),diag::err_asm_wide_character)
995563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        << Literal->getSourceRange());
9965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    TargetInfo::ConstraintInfo Info(Literal->getStrData(),
9985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                    Literal->getByteLength(),
9995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                    Names[i]);
10005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!Context.Target.validateInputConstraint(&OutputConstraintInfos[0],
10015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                NumOutputs, Info)) {
10025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(Literal->getLocStart(),
10035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                            diag::err_asm_invalid_input_constraint)
10040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                       << Info.getConstraintStr());
10050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1007692e5dbf12901edacf14812a6fae25462920af42Steve Block    Expr *InputExpr = Exprs[i];
1008dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1009dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Only allow void types for memory constraints.
10105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (Info.allowsMemory() && !Info.allowsRegister()) {
1011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      if (CheckAsmLValue(InputExpr, *this))
10125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return StmtError(Diag(InputExpr->getLocStart(),
10135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              diag::err_asm_invalid_lvalue_in_input)
10145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                         << Info.getConstraintStr()
10155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                         << InputExpr->getSourceRange());
10165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
1017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
10180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Info.allowsRegister()) {
10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      if (InputExpr->getType()->isVoidType()) {
10205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return StmtError(Diag(InputExpr->getLocStart(),
10215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                              diag::err_asm_invalid_type_in_input)
10225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          << InputExpr->getType() << Info.getConstraintStr()
10235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          << InputExpr->getSourceRange());
10245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      }
10255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
10265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    DefaultFunctionArrayConversion(Exprs[i]);
1028692e5dbf12901edacf14812a6fae25462920af42Steve Block
1029dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    InputConstraintInfos.push_back(Info);
1030dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  }
10315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  // Check that the clobbers are valid.
10335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  for (unsigned i = 0; i != NumClobbers; i++) {
10345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    StringLiteral *Literal = Clobbers[i];
10355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (Literal->isWide())
10365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(Literal->getLocStart(),diag::err_asm_wide_character)
10375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        << Literal->getSourceRange());
1038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    llvm::SmallString<16> Clobber(Literal->getStrData(),
10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                  Literal->getStrData() +
10415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  Literal->getByteLength());
10425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!Context.Target.isValidGCCRegisterName(Clobber.c_str()))
10445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(Literal->getLocStart(),
10455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                  diag::err_asm_unknown_register_name) << Clobber.c_str());
10465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
10475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  constraints.release();
10490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  exprs.release();
10500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  asmString.release();
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  clobbers.release();
1052692e5dbf12901edacf14812a6fae25462920af42Steve Block  AsmStmt *NS =
1053dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    new (Context) AsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, NumInputs,
1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                          Names, Constraints, Exprs, AsmString, NumClobbers,
10555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                          Clobbers, RParenLoc);
1056dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  // Validate the asm string, ensuring it makes sense given the operands we
10575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // have.
10585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  llvm::SmallVector<AsmStmt::AsmStringPiece, 8> Pieces;
10595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  unsigned DiagOffs;
10605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (unsigned DiagID = NS->AnalyzeAsmString(Pieces, Context, DiagOffs)) {
10615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Diag(getLocationOfStringLiteralByte(AsmString, DiagOffs), DiagID)
1062cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           << AsmString->getSourceRange();
10630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DeleteStmt(NS);
10645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError();
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  }
10665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // Validate tied input operands for type mismatches.
10685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  for (unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {
10695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    TargetInfo::ConstraintInfo &Info = InputConstraintInfos[i];
10705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // If this is a tied constraint, verify that the output and input have
10725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // either exactly the same type, or that they are int/ptr operands with the
10735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // same size (int/long, int*/long, are ok etc).
10745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!Info.hasTiedOperand()) continue;
10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    unsigned TiedTo = Info.getTiedOperand();
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Expr *OutputExpr = Exprs[TiedTo];
1078692e5dbf12901edacf14812a6fae25462920af42Steve Block    Expr *InputExpr = Exprs[i+NumOutputs];
1079dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QualType InTy = InputExpr->getType();
1080dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QualType OutTy = OutputExpr->getType();
10815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (Context.hasSameType(InTy, OutTy))
1082dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      continue;  // All types can be tied to themselves.
10835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Int/ptr operands have some special cases that we allow.
10855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if ((OutTy->isIntegerType() || OutTy->isPointerType()) &&
10865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        (InTy->isIntegerType() || InTy->isPointerType())) {
10875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1088cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block      // They are ok if they are the same size.  Tying void* to int is ok if
10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      // they are the same size, for example.  This also allows tying void* to
10905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // int*.
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      uint64_t OutSize = Context.getTypeSize(OutTy);
10925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      uint64_t InSize = Context.getTypeSize(InTy);
10935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (OutSize == InSize)
10945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        continue;
10955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // If the smaller input/output operand is not mentioned in the asm string,
10975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // then we can promote it and the asm string won't notice.  Check this
10985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // case now.
10995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      bool SmallerValueMentioned = false;
11000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      for (unsigned p = 0, e = Pieces.size(); p != e; ++p) {
11010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        AsmStmt::AsmStringPiece &Piece = Pieces[p];
11020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!Piece.isOperand()) continue;
1103692e5dbf12901edacf14812a6fae25462920af42Steve Block
1104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // If this is a reference to the input and if the input was the smaller
1105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // one, then we have to reject this asm.
11065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (Piece.getOperandNo() == i+NumOutputs) {
1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block          if (InSize < OutSize) {
11085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            SmallerValueMentioned = true;
11095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            break;
11105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          }
11115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
11125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // If this is a reference to the input and if the input was the smaller
11145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // one, then we have to reject this asm.
11155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (Piece.getOperandNo() == TiedTo) {
11165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark          if (InSize > OutSize) {
11175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            SmallerValueMentioned = true;
11185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            break;
11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch          }
11205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
11215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      }
11225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // If the smaller value wasn't mentioned in the asm string, and if the
11245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // output was a register, just extend the shorter one to the size of the
11255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      // larger one.
11265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      if (!SmallerValueMentioned &&
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch          OutputConstraintInfos[TiedTo].allowsRegister())
11280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        continue;
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1130692e5dbf12901edacf14812a6fae25462920af42Steve Block
1131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Diag(InputExpr->getLocStart(),
1132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         diag::err_asm_tying_incompatible_types)
11335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      << InTy << OutTy << OutputExpr->getSourceRange()
1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      << InputExpr->getSourceRange();
11355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    DeleteStmt(NS);
11365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return StmtError();
11375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  }
11385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(NS);
1140cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
11415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11425ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
11435ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCAtCatchStmt(SourceLocation AtLoc,
11445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                           SourceLocation RParen, DeclPtrTy Parm,
11455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                           StmtArg Body, StmtArg catchList) {
11460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Stmt *CatchList = catchList.takeAs<Stmt>();
11475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  ParmVarDecl *PVD = cast_or_null<ParmVarDecl>(Parm.getAs<Decl>());
11485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  // PVD == 0 implies @catch(...).
11505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (PVD) {
11515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // If we already know the decl is invalid, reject it.
11525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (PVD->isInvalidDecl())
11535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError();
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!Context.isObjCObjectPointerType(PVD->getType()))
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      return StmtError(Diag(PVD->getLocation(),
1157692e5dbf12901edacf14812a6fae25462920af42Steve Block                       diag::err_catch_param_not_objc_type));
1158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (PVD->getType()->isObjCQualifiedIdType())
1159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block      return StmtError(Diag(PVD->getLocation(),
11605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                       diag::err_illegal_qualifiers_on_catch_parm));
1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  }
11625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  ObjCAtCatchStmt *CS = new (Context) ObjCAtCatchStmt(AtLoc, RParen,
11645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    PVD, Body.takeAs<Stmt>(), CatchList);
11655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(CatchList ? CatchList : CS);
11665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
1167cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
11685ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
11695ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCAtFinallyStmt(SourceLocation AtLoc, StmtArg Body) {
11705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ObjCAtFinallyStmt(AtLoc,
11715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                           static_cast<Stmt*>(Body.release())));
11725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
11735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11745ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
11755ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCAtTryStmt(SourceLocation AtLoc,
11760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                         StmtArg Try, StmtArg Catch, StmtArg Finally) {
11770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  CurFunctionNeedsScopeChecking = true;
11780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  return Owned(new (Context) ObjCAtTryStmt(AtLoc, Try.takeAs<Stmt>(),
1179692e5dbf12901edacf14812a6fae25462920af42Steve Block                                           Catch.takeAs<Stmt>(),
1180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                                           Finally.takeAs<Stmt>()));
1181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
11825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockAction::OwningStmtResult
11845ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCAtThrowStmt(SourceLocation AtLoc, ExprArg expr,Scope *CurScope) {
11855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  Expr *ThrowExpr = expr.takeAs<Expr>();
11865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!ThrowExpr) {
11875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // @throw without an expression designates a rethrow (which much occur
11885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // in the context of an @catch clause).
1189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Scope *AtCatchParent = CurScope;
11905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    while (AtCatchParent && !AtCatchParent->isAtCatchScope())
11915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      AtCatchParent = AtCatchParent->getParent();
11925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!AtCatchParent)
11935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(AtLoc, diag::error_rethrow_used_outside_catch));
11945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  } else {
11955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    QualType ThrowType = ThrowExpr->getType();
11965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Make sure the expression type is an ObjC pointer or "void *".
11975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!Context.isObjCObjectPointerType(ThrowType)) {
11980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      const PointerType *PT = ThrowType->getAsPointerType();
11990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      if (!PT || !PT->getPointeeType()->isVoidType())
12000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return StmtError(Diag(AtLoc, diag::error_objc_throw_expects_object)
1201692e5dbf12901edacf14812a6fae25462920af42Steve Block                        << ThrowExpr->getType() << ThrowExpr->getSourceRange());
1202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  }
12045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) ObjCAtThrowStmt(AtLoc, ThrowExpr));
1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
12065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12075ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkAction::OwningStmtResult
12085ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkSema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, ExprArg SynchExpr,
12095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  StmtArg SynchBody) {
12105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  CurFunctionNeedsScopeChecking = true;
1211cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
12120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  // Make sure the expression type is an ObjC pointer or "void *".
12130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  Expr *SyncExpr = static_cast<Expr*>(SynchExpr.get());
12145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  if (!Context.isObjCObjectPointerType(SyncExpr->getType())) {
12155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    const PointerType *PT = SyncExpr->getType()->getAsPointerType();
12165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!PT || !PT->getPointeeType()->isVoidType())
12175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark      return StmtError(Diag(AtLoc, diag::error_objc_synchronized_expects_object)
1218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       << SyncExpr->getType() << SyncExpr->getSourceRange());
1219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  }
12200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  return Owned(new (Context) ObjCAtSynchronizedStmt(AtLoc,
12220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                    SynchExpr.takeAs<Stmt>(),
1223692e5dbf12901edacf14812a6fae25462920af42Steve Block                                                    SynchBody.takeAs<Stmt>()));
1224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
1227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/// and creates a proper catch handler from them.
1228563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkAction::OwningStmtResult
1229563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkSema::ActOnCXXCatchBlock(SourceLocation CatchLoc, DeclPtrTy ExDecl,
1230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                         StmtArg HandlerBlock) {
1231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // There's nothing to test that ActOnExceptionDecl didn't already test.
1232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  return Owned(new (Context) CXXCatchStmt(CatchLoc,
1233cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                                  cast_or_null<VarDecl>(ExDecl.getAs<Decl>()),
12340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                          HandlerBlock.takeAs<Stmt>()));
1235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/// ActOnCXXTryBlock - Takes a try compound-statement and a number of
1238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/// handlers and creates a try statement from them.
1239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAction::OwningStmtResult
1240563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkSema::ActOnCXXTryBlock(SourceLocation TryLoc, StmtArg TryBlock,
1241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick                       MultiStmtArg RawHandlers) {
1242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  unsigned NumHandlers = RawHandlers.size();
1243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  assert(NumHandlers > 0 &&
1244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark         "The parser shouldn't call this if there are no handlers.");
1245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  Stmt **Handlers = reinterpret_cast<Stmt**>(RawHandlers.get());
1246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  for(unsigned i = 0; i < NumHandlers - 1; ++i) {
1248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CXXCatchStmt *Handler = llvm::cast<CXXCatchStmt>(Handlers[i]);
1249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!Handler->getExceptionDecl())
1250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark      return StmtError(Diag(Handler->getLocStart(), diag::err_early_catch_all));
1251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  }
1252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // FIXME: We should detect handlers for the same type as an earlier one.
1253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block  // This one is rather easy.
1254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // FIXME: We should detect handlers that cannot catch anything because an
1255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // earlier handler catches a superclass. Need to find a method that is not
1256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // quadratic for this.
1257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // Neither of these are explicitly forbidden, but every compiler detects them
1258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  // and warns.
12590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  CurFunctionNeedsScopeChecking = true;
12610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch  RawHandlers.release();
12625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark  return Owned(new (Context) CXXTryStmt(TryLoc,
12635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                        static_cast<Stmt*>(TryBlock.release()),
12645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                        Handlers, NumHandlers));
1265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
12665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark