• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- SemaStmt.cpp - Semantic Analysis for Statements ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements semantic analysis for statements.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Sema/SemaInternal.h"
15 #include "clang/Sema/Scope.h"
16 #include "clang/Sema/ScopeInfo.h"
17 #include "clang/Sema/Initialization.h"
18 #include "clang/Sema/Lookup.h"
19 #include "clang/AST/ASTContext.h"
20 #include "clang/AST/CharUnits.h"
21 #include "clang/AST/DeclObjC.h"
22 #include "clang/AST/EvaluatedExprVisitor.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/StmtObjC.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/TypeLoc.h"
28 #include "clang/Lex/Preprocessor.h"
29 #include "clang/Basic/TargetInfo.h"
30 #include "llvm/ADT/ArrayRef.h"
31 #include "llvm/ADT/STLExtras.h"
32 #include "llvm/ADT/SmallPtrSet.h"
33 #include "llvm/ADT/SmallString.h"
34 #include "llvm/ADT/SmallVector.h"
35 using namespace clang;
36 using namespace sema;
37 
ActOnExprStmt(FullExprArg expr)38 StmtResult Sema::ActOnExprStmt(FullExprArg expr) {
39   Expr *E = expr.get();
40   if (!E) // FIXME: FullExprArg has no error state?
41     return StmtError();
42 
43   // C99 6.8.3p2: The expression in an expression statement is evaluated as a
44   // void expression for its side effects.  Conversion to void allows any
45   // operand, even incomplete types.
46 
47   // Same thing in for stmt first clause (when expr) and third clause.
48   return Owned(static_cast<Stmt*>(E));
49 }
50 
51 
ActOnNullStmt(SourceLocation SemiLoc,bool HasLeadingEmptyMacro)52 StmtResult Sema::ActOnNullStmt(SourceLocation SemiLoc,
53                                bool HasLeadingEmptyMacro) {
54   return Owned(new (Context) NullStmt(SemiLoc, HasLeadingEmptyMacro));
55 }
56 
ActOnDeclStmt(DeclGroupPtrTy dg,SourceLocation StartLoc,SourceLocation EndLoc)57 StmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg, SourceLocation StartLoc,
58                                SourceLocation EndLoc) {
59   DeclGroupRef DG = dg.getAsVal<DeclGroupRef>();
60 
61   // If we have an invalid decl, just return an error.
62   if (DG.isNull()) return StmtError();
63 
64   return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
65 }
66 
ActOnForEachDeclStmt(DeclGroupPtrTy dg)67 void Sema::ActOnForEachDeclStmt(DeclGroupPtrTy dg) {
68   DeclGroupRef DG = dg.getAsVal<DeclGroupRef>();
69 
70   // If we have an invalid decl, just return.
71   if (DG.isNull() || !DG.isSingleDecl()) return;
72   VarDecl *var = cast<VarDecl>(DG.getSingleDecl());
73 
74   // suppress any potential 'unused variable' warning.
75   var->setUsed();
76 
77   // foreach variables are never actually initialized in the way that
78   // the parser came up with.
79   var->setInit(0);
80 
81   // In ARC, we don't need to retain the iteration variable of a fast
82   // enumeration loop.  Rather than actually trying to catch that
83   // during declaration processing, we remove the consequences here.
84   if (getLangOpts().ObjCAutoRefCount) {
85     QualType type = var->getType();
86 
87     // Only do this if we inferred the lifetime.  Inferred lifetime
88     // will show up as a local qualifier because explicit lifetime
89     // should have shown up as an AttributedType instead.
90     if (type.getLocalQualifiers().getObjCLifetime() == Qualifiers::OCL_Strong) {
91       // Add 'const' and mark the variable as pseudo-strong.
92       var->setType(type.withConst());
93       var->setARCPseudoStrong(true);
94     }
95   }
96 }
97 
98 /// \brief Diagnose unused '==' and '!=' as likely typos for '=' or '|='.
99 ///
100 /// Adding a cast to void (or other expression wrappers) will prevent the
101 /// warning from firing.
DiagnoseUnusedComparison(Sema & S,const Expr * E)102 static bool DiagnoseUnusedComparison(Sema &S, const Expr *E) {
103   SourceLocation Loc;
104   bool IsNotEqual, CanAssign;
105 
106   if (const BinaryOperator *Op = dyn_cast<BinaryOperator>(E)) {
107     if (Op->getOpcode() != BO_EQ && Op->getOpcode() != BO_NE)
108       return false;
109 
110     Loc = Op->getOperatorLoc();
111     IsNotEqual = Op->getOpcode() == BO_NE;
112     CanAssign = Op->getLHS()->IgnoreParenImpCasts()->isLValue();
113   } else if (const CXXOperatorCallExpr *Op = dyn_cast<CXXOperatorCallExpr>(E)) {
114     if (Op->getOperator() != OO_EqualEqual &&
115         Op->getOperator() != OO_ExclaimEqual)
116       return false;
117 
118     Loc = Op->getOperatorLoc();
119     IsNotEqual = Op->getOperator() == OO_ExclaimEqual;
120     CanAssign = Op->getArg(0)->IgnoreParenImpCasts()->isLValue();
121   } else {
122     // Not a typo-prone comparison.
123     return false;
124   }
125 
126   // Suppress warnings when the operator, suspicious as it may be, comes from
127   // a macro expansion.
128   if (Loc.isMacroID())
129     return false;
130 
131   S.Diag(Loc, diag::warn_unused_comparison)
132     << (unsigned)IsNotEqual << E->getSourceRange();
133 
134   // If the LHS is a plausible entity to assign to, provide a fixit hint to
135   // correct common typos.
136   if (CanAssign) {
137     if (IsNotEqual)
138       S.Diag(Loc, diag::note_inequality_comparison_to_or_assign)
139         << FixItHint::CreateReplacement(Loc, "|=");
140     else
141       S.Diag(Loc, diag::note_equality_comparison_to_assign)
142         << FixItHint::CreateReplacement(Loc, "=");
143   }
144 
145   return true;
146 }
147 
DiagnoseUnusedExprResult(const Stmt * S)148 void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
149   if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
150     return DiagnoseUnusedExprResult(Label->getSubStmt());
151 
152   const Expr *E = dyn_cast_or_null<Expr>(S);
153   if (!E)
154     return;
155 
156   const Expr *WarnExpr;
157   SourceLocation Loc;
158   SourceRange R1, R2;
159   if (SourceMgr.isInSystemMacro(E->getExprLoc()) ||
160       !E->isUnusedResultAWarning(WarnExpr, Loc, R1, R2, Context))
161     return;
162 
163   // If this is a GNU statement expression expanded from a macro, it is probably
164   // unused because it is a function-like macro that can be used as either an
165   // expression or statement.  Don't warn, because it is almost certainly a
166   // false positive.
167   if (isa<StmtExpr>(E) && Loc.isMacroID())
168     return;
169 
170   // Okay, we have an unused result.  Depending on what the base expression is,
171   // we might want to make a more specific diagnostic.  Check for one of these
172   // cases now.
173   unsigned DiagID = diag::warn_unused_expr;
174   if (const ExprWithCleanups *Temps = dyn_cast<ExprWithCleanups>(E))
175     E = Temps->getSubExpr();
176   if (const CXXBindTemporaryExpr *TempExpr = dyn_cast<CXXBindTemporaryExpr>(E))
177     E = TempExpr->getSubExpr();
178 
179   if (DiagnoseUnusedComparison(*this, E))
180     return;
181 
182   E = WarnExpr;
183   if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
184     if (E->getType()->isVoidType())
185       return;
186 
187     // If the callee has attribute pure, const, or warn_unused_result, warn with
188     // a more specific message to make it clear what is happening.
189     if (const Decl *FD = CE->getCalleeDecl()) {
190       if (FD->getAttr<WarnUnusedResultAttr>()) {
191         Diag(Loc, diag::warn_unused_result) << R1 << R2;
192         return;
193       }
194       if (FD->getAttr<PureAttr>()) {
195         Diag(Loc, diag::warn_unused_call) << R1 << R2 << "pure";
196         return;
197       }
198       if (FD->getAttr<ConstAttr>()) {
199         Diag(Loc, diag::warn_unused_call) << R1 << R2 << "const";
200         return;
201       }
202     }
203   } else if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
204     if (getLangOpts().ObjCAutoRefCount && ME->isDelegateInitCall()) {
205       Diag(Loc, diag::err_arc_unused_init_message) << R1;
206       return;
207     }
208     const ObjCMethodDecl *MD = ME->getMethodDecl();
209     if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
210       Diag(Loc, diag::warn_unused_result) << R1 << R2;
211       return;
212     }
213   } else if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) {
214     const Expr *Source = POE->getSyntacticForm();
215     if (isa<ObjCSubscriptRefExpr>(Source))
216       DiagID = diag::warn_unused_container_subscript_expr;
217     else
218       DiagID = diag::warn_unused_property_expr;
219   } else if (const CXXFunctionalCastExpr *FC
220                                        = dyn_cast<CXXFunctionalCastExpr>(E)) {
221     if (isa<CXXConstructExpr>(FC->getSubExpr()) ||
222         isa<CXXTemporaryObjectExpr>(FC->getSubExpr()))
223       return;
224   }
225   // Diagnose "(void*) blah" as a typo for "(void) blah".
226   else if (const CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(E)) {
227     TypeSourceInfo *TI = CE->getTypeInfoAsWritten();
228     QualType T = TI->getType();
229 
230     // We really do want to use the non-canonical type here.
231     if (T == Context.VoidPtrTy) {
232       PointerTypeLoc TL = cast<PointerTypeLoc>(TI->getTypeLoc());
233 
234       Diag(Loc, diag::warn_unused_voidptr)
235         << FixItHint::CreateRemoval(TL.getStarLoc());
236       return;
237     }
238   }
239 
240   if (E->isGLValue() && E->getType().isVolatileQualified()) {
241     Diag(Loc, diag::warn_unused_volatile) << R1 << R2;
242     return;
243   }
244 
245   DiagRuntimeBehavior(Loc, 0, PDiag(DiagID) << R1 << R2);
246 }
247 
ActOnStartOfCompoundStmt()248 void Sema::ActOnStartOfCompoundStmt() {
249   PushCompoundScope();
250 }
251 
ActOnFinishOfCompoundStmt()252 void Sema::ActOnFinishOfCompoundStmt() {
253   PopCompoundScope();
254 }
255 
getCurCompoundScope() const256 sema::CompoundScopeInfo &Sema::getCurCompoundScope() const {
257   return getCurFunction()->CompoundScopes.back();
258 }
259 
260 StmtResult
ActOnCompoundStmt(SourceLocation L,SourceLocation R,MultiStmtArg elts,bool isStmtExpr)261 Sema::ActOnCompoundStmt(SourceLocation L, SourceLocation R,
262                         MultiStmtArg elts, bool isStmtExpr) {
263   unsigned NumElts = elts.size();
264   Stmt **Elts = elts.data();
265   // If we're in C89 mode, check that we don't have any decls after stmts.  If
266   // so, emit an extension diagnostic.
267   if (!getLangOpts().C99 && !getLangOpts().CPlusPlus) {
268     // Note that __extension__ can be around a decl.
269     unsigned i = 0;
270     // Skip over all declarations.
271     for (; i != NumElts && isa<DeclStmt>(Elts[i]); ++i)
272       /*empty*/;
273 
274     // We found the end of the list or a statement.  Scan for another declstmt.
275     for (; i != NumElts && !isa<DeclStmt>(Elts[i]); ++i)
276       /*empty*/;
277 
278     if (i != NumElts) {
279       Decl *D = *cast<DeclStmt>(Elts[i])->decl_begin();
280       Diag(D->getLocation(), diag::ext_mixed_decls_code);
281     }
282   }
283   // Warn about unused expressions in statements.
284   for (unsigned i = 0; i != NumElts; ++i) {
285     // Ignore statements that are last in a statement expression.
286     if (isStmtExpr && i == NumElts - 1)
287       continue;
288 
289     DiagnoseUnusedExprResult(Elts[i]);
290   }
291 
292   // Check for suspicious empty body (null statement) in `for' and `while'
293   // statements.  Don't do anything for template instantiations, this just adds
294   // noise.
295   if (NumElts != 0 && !CurrentInstantiationScope &&
296       getCurCompoundScope().HasEmptyLoopBodies) {
297     for (unsigned i = 0; i != NumElts - 1; ++i)
298       DiagnoseEmptyLoopBody(Elts[i], Elts[i + 1]);
299   }
300 
301   return Owned(new (Context) CompoundStmt(Context, Elts, NumElts, L, R));
302 }
303 
304 StmtResult
ActOnCaseStmt(SourceLocation CaseLoc,Expr * LHSVal,SourceLocation DotDotDotLoc,Expr * RHSVal,SourceLocation ColonLoc)305 Sema::ActOnCaseStmt(SourceLocation CaseLoc, Expr *LHSVal,
306                     SourceLocation DotDotDotLoc, Expr *RHSVal,
307                     SourceLocation ColonLoc) {
308   assert((LHSVal != 0) && "missing expression in case statement");
309 
310   if (getCurFunction()->SwitchStack.empty()) {
311     Diag(CaseLoc, diag::err_case_not_in_switch);
312     return StmtError();
313   }
314 
315   if (!getLangOpts().CPlusPlus0x) {
316     // C99 6.8.4.2p3: The expression shall be an integer constant.
317     // However, GCC allows any evaluatable integer expression.
318     if (!LHSVal->isTypeDependent() && !LHSVal->isValueDependent()) {
319       LHSVal = VerifyIntegerConstantExpression(LHSVal).take();
320       if (!LHSVal)
321         return StmtError();
322     }
323 
324     // GCC extension: The expression shall be an integer constant.
325 
326     if (RHSVal && !RHSVal->isTypeDependent() && !RHSVal->isValueDependent()) {
327       RHSVal = VerifyIntegerConstantExpression(RHSVal).take();
328       // Recover from an error by just forgetting about it.
329     }
330   }
331 
332   CaseStmt *CS = new (Context) CaseStmt(LHSVal, RHSVal, CaseLoc, DotDotDotLoc,
333                                         ColonLoc);
334   getCurFunction()->SwitchStack.back()->addSwitchCase(CS);
335   return Owned(CS);
336 }
337 
338 /// ActOnCaseStmtBody - This installs a statement as the body of a case.
ActOnCaseStmtBody(Stmt * caseStmt,Stmt * SubStmt)339 void Sema::ActOnCaseStmtBody(Stmt *caseStmt, Stmt *SubStmt) {
340   DiagnoseUnusedExprResult(SubStmt);
341 
342   CaseStmt *CS = static_cast<CaseStmt*>(caseStmt);
343   CS->setSubStmt(SubStmt);
344 }
345 
346 StmtResult
ActOnDefaultStmt(SourceLocation DefaultLoc,SourceLocation ColonLoc,Stmt * SubStmt,Scope * CurScope)347 Sema::ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc,
348                        Stmt *SubStmt, Scope *CurScope) {
349   DiagnoseUnusedExprResult(SubStmt);
350 
351   if (getCurFunction()->SwitchStack.empty()) {
352     Diag(DefaultLoc, diag::err_default_not_in_switch);
353     return Owned(SubStmt);
354   }
355 
356   DefaultStmt *DS = new (Context) DefaultStmt(DefaultLoc, ColonLoc, SubStmt);
357   getCurFunction()->SwitchStack.back()->addSwitchCase(DS);
358   return Owned(DS);
359 }
360 
361 StmtResult
ActOnLabelStmt(SourceLocation IdentLoc,LabelDecl * TheDecl,SourceLocation ColonLoc,Stmt * SubStmt)362 Sema::ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl,
363                      SourceLocation ColonLoc, Stmt *SubStmt) {
364   // If the label was multiply defined, reject it now.
365   if (TheDecl->getStmt()) {
366     Diag(IdentLoc, diag::err_redefinition_of_label) << TheDecl->getDeclName();
367     Diag(TheDecl->getLocation(), diag::note_previous_definition);
368     return Owned(SubStmt);
369   }
370 
371   // Otherwise, things are good.  Fill in the declaration and return it.
372   LabelStmt *LS = new (Context) LabelStmt(IdentLoc, TheDecl, SubStmt);
373   TheDecl->setStmt(LS);
374   if (!TheDecl->isGnuLocal())
375     TheDecl->setLocation(IdentLoc);
376   return Owned(LS);
377 }
378 
ActOnAttributedStmt(SourceLocation AttrLoc,ArrayRef<const Attr * > Attrs,Stmt * SubStmt)379 StmtResult Sema::ActOnAttributedStmt(SourceLocation AttrLoc,
380                                      ArrayRef<const Attr*> Attrs,
381                                      Stmt *SubStmt) {
382   // Fill in the declaration and return it.
383   AttributedStmt *LS = AttributedStmt::Create(Context, AttrLoc, Attrs, SubStmt);
384   return Owned(LS);
385 }
386 
387 StmtResult
ActOnIfStmt(SourceLocation IfLoc,FullExprArg CondVal,Decl * CondVar,Stmt * thenStmt,SourceLocation ElseLoc,Stmt * elseStmt)388 Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal, Decl *CondVar,
389                   Stmt *thenStmt, SourceLocation ElseLoc,
390                   Stmt *elseStmt) {
391   ExprResult CondResult(CondVal.release());
392 
393   VarDecl *ConditionVar = 0;
394   if (CondVar) {
395     ConditionVar = cast<VarDecl>(CondVar);
396     CondResult = CheckConditionVariable(ConditionVar, IfLoc, true);
397     if (CondResult.isInvalid())
398       return StmtError();
399   }
400   Expr *ConditionExpr = CondResult.takeAs<Expr>();
401   if (!ConditionExpr)
402     return StmtError();
403 
404   DiagnoseUnusedExprResult(thenStmt);
405 
406   if (!elseStmt) {
407     DiagnoseEmptyStmtBody(ConditionExpr->getLocEnd(), thenStmt,
408                           diag::warn_empty_if_body);
409   }
410 
411   DiagnoseUnusedExprResult(elseStmt);
412 
413   return Owned(new (Context) IfStmt(Context, IfLoc, ConditionVar, ConditionExpr,
414                                     thenStmt, ElseLoc, elseStmt));
415 }
416 
417 /// ConvertIntegerToTypeWarnOnOverflow - Convert the specified APInt to have
418 /// the specified width and sign.  If an overflow occurs, detect it and emit
419 /// the specified diagnostic.
ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt & Val,unsigned NewWidth,bool NewSign,SourceLocation Loc,unsigned DiagID)420 void Sema::ConvertIntegerToTypeWarnOnOverflow(llvm::APSInt &Val,
421                                               unsigned NewWidth, bool NewSign,
422                                               SourceLocation Loc,
423                                               unsigned DiagID) {
424   // Perform a conversion to the promoted condition type if needed.
425   if (NewWidth > Val.getBitWidth()) {
426     // If this is an extension, just do it.
427     Val = Val.extend(NewWidth);
428     Val.setIsSigned(NewSign);
429 
430     // If the input was signed and negative and the output is
431     // unsigned, don't bother to warn: this is implementation-defined
432     // behavior.
433     // FIXME: Introduce a second, default-ignored warning for this case?
434   } else if (NewWidth < Val.getBitWidth()) {
435     // If this is a truncation, check for overflow.
436     llvm::APSInt ConvVal(Val);
437     ConvVal = ConvVal.trunc(NewWidth);
438     ConvVal.setIsSigned(NewSign);
439     ConvVal = ConvVal.extend(Val.getBitWidth());
440     ConvVal.setIsSigned(Val.isSigned());
441     if (ConvVal != Val)
442       Diag(Loc, DiagID) << Val.toString(10) << ConvVal.toString(10);
443 
444     // Regardless of whether a diagnostic was emitted, really do the
445     // truncation.
446     Val = Val.trunc(NewWidth);
447     Val.setIsSigned(NewSign);
448   } else if (NewSign != Val.isSigned()) {
449     // Convert the sign to match the sign of the condition.  This can cause
450     // overflow as well: unsigned(INTMIN)
451     // We don't diagnose this overflow, because it is implementation-defined
452     // behavior.
453     // FIXME: Introduce a second, default-ignored warning for this case?
454     llvm::APSInt OldVal(Val);
455     Val.setIsSigned(NewSign);
456   }
457 }
458 
459 namespace {
460   struct CaseCompareFunctor {
operator ()__anon02a8bac50111::CaseCompareFunctor461     bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
462                     const llvm::APSInt &RHS) {
463       return LHS.first < RHS;
464     }
operator ()__anon02a8bac50111::CaseCompareFunctor465     bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
466                     const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
467       return LHS.first < RHS.first;
468     }
operator ()__anon02a8bac50111::CaseCompareFunctor469     bool operator()(const llvm::APSInt &LHS,
470                     const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
471       return LHS < RHS.first;
472     }
473   };
474 }
475 
476 /// CmpCaseVals - Comparison predicate for sorting case values.
477 ///
CmpCaseVals(const std::pair<llvm::APSInt,CaseStmt * > & lhs,const std::pair<llvm::APSInt,CaseStmt * > & rhs)478 static bool CmpCaseVals(const std::pair<llvm::APSInt, CaseStmt*>& lhs,
479                         const std::pair<llvm::APSInt, CaseStmt*>& rhs) {
480   if (lhs.first < rhs.first)
481     return true;
482 
483   if (lhs.first == rhs.first &&
484       lhs.second->getCaseLoc().getRawEncoding()
485        < rhs.second->getCaseLoc().getRawEncoding())
486     return true;
487   return false;
488 }
489 
490 /// CmpEnumVals - Comparison predicate for sorting enumeration values.
491 ///
CmpEnumVals(const std::pair<llvm::APSInt,EnumConstantDecl * > & lhs,const std::pair<llvm::APSInt,EnumConstantDecl * > & rhs)492 static bool CmpEnumVals(const std::pair<llvm::APSInt, EnumConstantDecl*>& lhs,
493                         const std::pair<llvm::APSInt, EnumConstantDecl*>& rhs)
494 {
495   return lhs.first < rhs.first;
496 }
497 
498 /// EqEnumVals - Comparison preficate for uniqing enumeration values.
499 ///
EqEnumVals(const std::pair<llvm::APSInt,EnumConstantDecl * > & lhs,const std::pair<llvm::APSInt,EnumConstantDecl * > & rhs)500 static bool EqEnumVals(const std::pair<llvm::APSInt, EnumConstantDecl*>& lhs,
501                        const std::pair<llvm::APSInt, EnumConstantDecl*>& rhs)
502 {
503   return lhs.first == rhs.first;
504 }
505 
506 /// GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of
507 /// potentially integral-promoted expression @p expr.
GetTypeBeforeIntegralPromotion(Expr * & expr)508 static QualType GetTypeBeforeIntegralPromotion(Expr *&expr) {
509   if (ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(expr))
510     expr = cleanups->getSubExpr();
511   while (ImplicitCastExpr *impcast = dyn_cast<ImplicitCastExpr>(expr)) {
512     if (impcast->getCastKind() != CK_IntegralCast) break;
513     expr = impcast->getSubExpr();
514   }
515   return expr->getType();
516 }
517 
518 StmtResult
ActOnStartOfSwitchStmt(SourceLocation SwitchLoc,Expr * Cond,Decl * CondVar)519 Sema::ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, Expr *Cond,
520                              Decl *CondVar) {
521   ExprResult CondResult;
522 
523   VarDecl *ConditionVar = 0;
524   if (CondVar) {
525     ConditionVar = cast<VarDecl>(CondVar);
526     CondResult = CheckConditionVariable(ConditionVar, SourceLocation(), false);
527     if (CondResult.isInvalid())
528       return StmtError();
529 
530     Cond = CondResult.release();
531   }
532 
533   if (!Cond)
534     return StmtError();
535 
536   class SwitchConvertDiagnoser : public ICEConvertDiagnoser {
537     Expr *Cond;
538 
539   public:
540     SwitchConvertDiagnoser(Expr *Cond)
541       : ICEConvertDiagnoser(false, true), Cond(Cond) { }
542 
543     virtual DiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
544                                              QualType T) {
545       return S.Diag(Loc, diag::err_typecheck_statement_requires_integer) << T;
546     }
547 
548     virtual DiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
549                                                  QualType T) {
550       return S.Diag(Loc, diag::err_switch_incomplete_class_type)
551                << T << Cond->getSourceRange();
552     }
553 
554     virtual DiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
555                                                    QualType T,
556                                                    QualType ConvTy) {
557       return S.Diag(Loc, diag::err_switch_explicit_conversion) << T << ConvTy;
558     }
559 
560     virtual DiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
561                                                QualType ConvTy) {
562       return S.Diag(Conv->getLocation(), diag::note_switch_conversion)
563         << ConvTy->isEnumeralType() << ConvTy;
564     }
565 
566     virtual DiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
567                                                 QualType T) {
568       return S.Diag(Loc, diag::err_switch_multiple_conversions) << T;
569     }
570 
571     virtual DiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
572                                             QualType ConvTy) {
573       return S.Diag(Conv->getLocation(), diag::note_switch_conversion)
574       << ConvTy->isEnumeralType() << ConvTy;
575     }
576 
577     virtual DiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc,
578                                                  QualType T,
579                                                  QualType ConvTy) {
580       return DiagnosticBuilder::getEmpty();
581     }
582   } SwitchDiagnoser(Cond);
583 
584   CondResult
585     = ConvertToIntegralOrEnumerationType(SwitchLoc, Cond, SwitchDiagnoser,
586                                          /*AllowScopedEnumerations*/ true);
587   if (CondResult.isInvalid()) return StmtError();
588   Cond = CondResult.take();
589 
590   // C99 6.8.4.2p5 - Integer promotions are performed on the controlling expr.
591   CondResult = UsualUnaryConversions(Cond);
592   if (CondResult.isInvalid()) return StmtError();
593   Cond = CondResult.take();
594 
595   if (!CondVar) {
596     CheckImplicitConversions(Cond, SwitchLoc);
597     CondResult = MaybeCreateExprWithCleanups(Cond);
598     if (CondResult.isInvalid())
599       return StmtError();
600     Cond = CondResult.take();
601   }
602 
603   getCurFunction()->setHasBranchIntoScope();
604 
605   SwitchStmt *SS = new (Context) SwitchStmt(Context, ConditionVar, Cond);
606   getCurFunction()->SwitchStack.push_back(SS);
607   return Owned(SS);
608 }
609 
AdjustAPSInt(llvm::APSInt & Val,unsigned BitWidth,bool IsSigned)610 static void AdjustAPSInt(llvm::APSInt &Val, unsigned BitWidth, bool IsSigned) {
611   if (Val.getBitWidth() < BitWidth)
612     Val = Val.extend(BitWidth);
613   else if (Val.getBitWidth() > BitWidth)
614     Val = Val.trunc(BitWidth);
615   Val.setIsSigned(IsSigned);
616 }
617 
618 StmtResult
ActOnFinishSwitchStmt(SourceLocation SwitchLoc,Stmt * Switch,Stmt * BodyStmt)619 Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
620                             Stmt *BodyStmt) {
621   SwitchStmt *SS = cast<SwitchStmt>(Switch);
622   assert(SS == getCurFunction()->SwitchStack.back() &&
623          "switch stack missing push/pop!");
624 
625   SS->setBody(BodyStmt, SwitchLoc);
626   getCurFunction()->SwitchStack.pop_back();
627 
628   Expr *CondExpr = SS->getCond();
629   if (!CondExpr) return StmtError();
630 
631   QualType CondType = CondExpr->getType();
632 
633   Expr *CondExprBeforePromotion = CondExpr;
634   QualType CondTypeBeforePromotion =
635       GetTypeBeforeIntegralPromotion(CondExprBeforePromotion);
636 
637   // C++ 6.4.2.p2:
638   // Integral promotions are performed (on the switch condition).
639   //
640   // A case value unrepresentable by the original switch condition
641   // type (before the promotion) doesn't make sense, even when it can
642   // be represented by the promoted type.  Therefore we need to find
643   // the pre-promotion type of the switch condition.
644   if (!CondExpr->isTypeDependent()) {
645     // We have already converted the expression to an integral or enumeration
646     // type, when we started the switch statement. If we don't have an
647     // appropriate type now, just return an error.
648     if (!CondType->isIntegralOrEnumerationType())
649       return StmtError();
650 
651     if (CondExpr->isKnownToHaveBooleanValue()) {
652       // switch(bool_expr) {...} is often a programmer error, e.g.
653       //   switch(n && mask) { ... }  // Doh - should be "n & mask".
654       // One can always use an if statement instead of switch(bool_expr).
655       Diag(SwitchLoc, diag::warn_bool_switch_condition)
656           << CondExpr->getSourceRange();
657     }
658   }
659 
660   // Get the bitwidth of the switched-on value before promotions.  We must
661   // convert the integer case values to this width before comparison.
662   bool HasDependentValue
663     = CondExpr->isTypeDependent() || CondExpr->isValueDependent();
664   unsigned CondWidth
665     = HasDependentValue ? 0 : Context.getIntWidth(CondTypeBeforePromotion);
666   bool CondIsSigned
667     = CondTypeBeforePromotion->isSignedIntegerOrEnumerationType();
668 
669   // Accumulate all of the case values in a vector so that we can sort them
670   // and detect duplicates.  This vector contains the APInt for the case after
671   // it has been converted to the condition type.
672   typedef SmallVector<std::pair<llvm::APSInt, CaseStmt*>, 64> CaseValsTy;
673   CaseValsTy CaseVals;
674 
675   // Keep track of any GNU case ranges we see.  The APSInt is the low value.
676   typedef std::vector<std::pair<llvm::APSInt, CaseStmt*> > CaseRangesTy;
677   CaseRangesTy CaseRanges;
678 
679   DefaultStmt *TheDefaultStmt = 0;
680 
681   bool CaseListIsErroneous = false;
682 
683   for (SwitchCase *SC = SS->getSwitchCaseList(); SC && !HasDependentValue;
684        SC = SC->getNextSwitchCase()) {
685 
686     if (DefaultStmt *DS = dyn_cast<DefaultStmt>(SC)) {
687       if (TheDefaultStmt) {
688         Diag(DS->getDefaultLoc(), diag::err_multiple_default_labels_defined);
689         Diag(TheDefaultStmt->getDefaultLoc(), diag::note_duplicate_case_prev);
690 
691         // FIXME: Remove the default statement from the switch block so that
692         // we'll return a valid AST.  This requires recursing down the AST and
693         // finding it, not something we are set up to do right now.  For now,
694         // just lop the entire switch stmt out of the AST.
695         CaseListIsErroneous = true;
696       }
697       TheDefaultStmt = DS;
698 
699     } else {
700       CaseStmt *CS = cast<CaseStmt>(SC);
701 
702       Expr *Lo = CS->getLHS();
703 
704       if (Lo->isTypeDependent() || Lo->isValueDependent()) {
705         HasDependentValue = true;
706         break;
707       }
708 
709       llvm::APSInt LoVal;
710 
711       if (getLangOpts().CPlusPlus0x) {
712         // C++11 [stmt.switch]p2: the constant-expression shall be a converted
713         // constant expression of the promoted type of the switch condition.
714         ExprResult ConvLo =
715           CheckConvertedConstantExpression(Lo, CondType, LoVal, CCEK_CaseValue);
716         if (ConvLo.isInvalid()) {
717           CaseListIsErroneous = true;
718           continue;
719         }
720         Lo = ConvLo.take();
721       } else {
722         // We already verified that the expression has a i-c-e value (C99
723         // 6.8.4.2p3) - get that value now.
724         LoVal = Lo->EvaluateKnownConstInt(Context);
725 
726         // If the LHS is not the same type as the condition, insert an implicit
727         // cast.
728         Lo = DefaultLvalueConversion(Lo).take();
729         Lo = ImpCastExprToType(Lo, CondType, CK_IntegralCast).take();
730       }
731 
732       // Convert the value to the same width/sign as the condition had prior to
733       // integral promotions.
734       //
735       // FIXME: This causes us to reject valid code:
736       //   switch ((char)c) { case 256: case 0: return 0; }
737       // Here we claim there is a duplicated condition value, but there is not.
738       ConvertIntegerToTypeWarnOnOverflow(LoVal, CondWidth, CondIsSigned,
739                                          Lo->getLocStart(),
740                                          diag::warn_case_value_overflow);
741 
742       CS->setLHS(Lo);
743 
744       // If this is a case range, remember it in CaseRanges, otherwise CaseVals.
745       if (CS->getRHS()) {
746         if (CS->getRHS()->isTypeDependent() ||
747             CS->getRHS()->isValueDependent()) {
748           HasDependentValue = true;
749           break;
750         }
751         CaseRanges.push_back(std::make_pair(LoVal, CS));
752       } else
753         CaseVals.push_back(std::make_pair(LoVal, CS));
754     }
755   }
756 
757   if (!HasDependentValue) {
758     // If we don't have a default statement, check whether the
759     // condition is constant.
760     llvm::APSInt ConstantCondValue;
761     bool HasConstantCond = false;
762     if (!HasDependentValue && !TheDefaultStmt) {
763       HasConstantCond
764         = CondExprBeforePromotion->EvaluateAsInt(ConstantCondValue, Context,
765                                                  Expr::SE_AllowSideEffects);
766       assert(!HasConstantCond ||
767              (ConstantCondValue.getBitWidth() == CondWidth &&
768               ConstantCondValue.isSigned() == CondIsSigned));
769     }
770     bool ShouldCheckConstantCond = HasConstantCond;
771 
772     // Sort all the scalar case values so we can easily detect duplicates.
773     std::stable_sort(CaseVals.begin(), CaseVals.end(), CmpCaseVals);
774 
775     if (!CaseVals.empty()) {
776       for (unsigned i = 0, e = CaseVals.size(); i != e; ++i) {
777         if (ShouldCheckConstantCond &&
778             CaseVals[i].first == ConstantCondValue)
779           ShouldCheckConstantCond = false;
780 
781         if (i != 0 && CaseVals[i].first == CaseVals[i-1].first) {
782           // If we have a duplicate, report it.
783           // First, determine if either case value has a name
784           StringRef PrevString, CurrString;
785           Expr *PrevCase = CaseVals[i-1].second->getLHS()->IgnoreParenCasts();
786           Expr *CurrCase = CaseVals[i].second->getLHS()->IgnoreParenCasts();
787           if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(PrevCase)) {
788             PrevString = DeclRef->getDecl()->getName();
789           }
790           if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(CurrCase)) {
791             CurrString = DeclRef->getDecl()->getName();
792           }
793           llvm::SmallString<16> CaseValStr;
794           CaseVals[i-1].first.toString(CaseValStr);
795 
796           if (PrevString == CurrString)
797             Diag(CaseVals[i].second->getLHS()->getLocStart(),
798                  diag::err_duplicate_case) <<
799                  (PrevString.empty() ? CaseValStr.str() : PrevString);
800           else
801             Diag(CaseVals[i].second->getLHS()->getLocStart(),
802                  diag::err_duplicate_case_differing_expr) <<
803                  (PrevString.empty() ? CaseValStr.str() : PrevString) <<
804                  (CurrString.empty() ? CaseValStr.str() : CurrString) <<
805                  CaseValStr;
806 
807           Diag(CaseVals[i-1].second->getLHS()->getLocStart(),
808                diag::note_duplicate_case_prev);
809           // FIXME: We really want to remove the bogus case stmt from the
810           // substmt, but we have no way to do this right now.
811           CaseListIsErroneous = true;
812         }
813       }
814     }
815 
816     // Detect duplicate case ranges, which usually don't exist at all in
817     // the first place.
818     if (!CaseRanges.empty()) {
819       // Sort all the case ranges by their low value so we can easily detect
820       // overlaps between ranges.
821       std::stable_sort(CaseRanges.begin(), CaseRanges.end());
822 
823       // Scan the ranges, computing the high values and removing empty ranges.
824       std::vector<llvm::APSInt> HiVals;
825       for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
826         llvm::APSInt &LoVal = CaseRanges[i].first;
827         CaseStmt *CR = CaseRanges[i].second;
828         Expr *Hi = CR->getRHS();
829         llvm::APSInt HiVal;
830 
831         if (getLangOpts().CPlusPlus0x) {
832           // C++11 [stmt.switch]p2: the constant-expression shall be a converted
833           // constant expression of the promoted type of the switch condition.
834           ExprResult ConvHi =
835             CheckConvertedConstantExpression(Hi, CondType, HiVal,
836                                              CCEK_CaseValue);
837           if (ConvHi.isInvalid()) {
838             CaseListIsErroneous = true;
839             continue;
840           }
841           Hi = ConvHi.take();
842         } else {
843           HiVal = Hi->EvaluateKnownConstInt(Context);
844 
845           // If the RHS is not the same type as the condition, insert an
846           // implicit cast.
847           Hi = DefaultLvalueConversion(Hi).take();
848           Hi = ImpCastExprToType(Hi, CondType, CK_IntegralCast).take();
849         }
850 
851         // Convert the value to the same width/sign as the condition.
852         ConvertIntegerToTypeWarnOnOverflow(HiVal, CondWidth, CondIsSigned,
853                                            Hi->getLocStart(),
854                                            diag::warn_case_value_overflow);
855 
856         CR->setRHS(Hi);
857 
858         // If the low value is bigger than the high value, the case is empty.
859         if (LoVal > HiVal) {
860           Diag(CR->getLHS()->getLocStart(), diag::warn_case_empty_range)
861             << SourceRange(CR->getLHS()->getLocStart(),
862                            Hi->getLocEnd());
863           CaseRanges.erase(CaseRanges.begin()+i);
864           --i, --e;
865           continue;
866         }
867 
868         if (ShouldCheckConstantCond &&
869             LoVal <= ConstantCondValue &&
870             ConstantCondValue <= HiVal)
871           ShouldCheckConstantCond = false;
872 
873         HiVals.push_back(HiVal);
874       }
875 
876       // Rescan the ranges, looking for overlap with singleton values and other
877       // ranges.  Since the range list is sorted, we only need to compare case
878       // ranges with their neighbors.
879       for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
880         llvm::APSInt &CRLo = CaseRanges[i].first;
881         llvm::APSInt &CRHi = HiVals[i];
882         CaseStmt *CR = CaseRanges[i].second;
883 
884         // Check to see whether the case range overlaps with any
885         // singleton cases.
886         CaseStmt *OverlapStmt = 0;
887         llvm::APSInt OverlapVal(32);
888 
889         // Find the smallest value >= the lower bound.  If I is in the
890         // case range, then we have overlap.
891         CaseValsTy::iterator I = std::lower_bound(CaseVals.begin(),
892                                                   CaseVals.end(), CRLo,
893                                                   CaseCompareFunctor());
894         if (I != CaseVals.end() && I->first < CRHi) {
895           OverlapVal  = I->first;   // Found overlap with scalar.
896           OverlapStmt = I->second;
897         }
898 
899         // Find the smallest value bigger than the upper bound.
900         I = std::upper_bound(I, CaseVals.end(), CRHi, CaseCompareFunctor());
901         if (I != CaseVals.begin() && (I-1)->first >= CRLo) {
902           OverlapVal  = (I-1)->first;      // Found overlap with scalar.
903           OverlapStmt = (I-1)->second;
904         }
905 
906         // Check to see if this case stmt overlaps with the subsequent
907         // case range.
908         if (i && CRLo <= HiVals[i-1]) {
909           OverlapVal  = HiVals[i-1];       // Found overlap with range.
910           OverlapStmt = CaseRanges[i-1].second;
911         }
912 
913         if (OverlapStmt) {
914           // If we have a duplicate, report it.
915           Diag(CR->getLHS()->getLocStart(), diag::err_duplicate_case)
916             << OverlapVal.toString(10);
917           Diag(OverlapStmt->getLHS()->getLocStart(),
918                diag::note_duplicate_case_prev);
919           // FIXME: We really want to remove the bogus case stmt from the
920           // substmt, but we have no way to do this right now.
921           CaseListIsErroneous = true;
922         }
923       }
924     }
925 
926     // Complain if we have a constant condition and we didn't find a match.
927     if (!CaseListIsErroneous && ShouldCheckConstantCond) {
928       // TODO: it would be nice if we printed enums as enums, chars as
929       // chars, etc.
930       Diag(CondExpr->getExprLoc(), diag::warn_missing_case_for_condition)
931         << ConstantCondValue.toString(10)
932         << CondExpr->getSourceRange();
933     }
934 
935     // Check to see if switch is over an Enum and handles all of its
936     // values.  We only issue a warning if there is not 'default:', but
937     // we still do the analysis to preserve this information in the AST
938     // (which can be used by flow-based analyes).
939     //
940     const EnumType *ET = CondTypeBeforePromotion->getAs<EnumType>();
941 
942     // If switch has default case, then ignore it.
943     if (!CaseListIsErroneous  && !HasConstantCond && ET) {
944       const EnumDecl *ED = ET->getDecl();
945       typedef SmallVector<std::pair<llvm::APSInt, EnumConstantDecl*>, 64>
946         EnumValsTy;
947       EnumValsTy EnumVals;
948 
949       // Gather all enum values, set their type and sort them,
950       // allowing easier comparison with CaseVals.
951       for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin();
952            EDI != ED->enumerator_end(); ++EDI) {
953         llvm::APSInt Val = EDI->getInitVal();
954         AdjustAPSInt(Val, CondWidth, CondIsSigned);
955         EnumVals.push_back(std::make_pair(Val, *EDI));
956       }
957       std::stable_sort(EnumVals.begin(), EnumVals.end(), CmpEnumVals);
958       EnumValsTy::iterator EIend =
959         std::unique(EnumVals.begin(), EnumVals.end(), EqEnumVals);
960 
961       // See which case values aren't in enum.
962       EnumValsTy::const_iterator EI = EnumVals.begin();
963       for (CaseValsTy::const_iterator CI = CaseVals.begin();
964            CI != CaseVals.end(); CI++) {
965         while (EI != EIend && EI->first < CI->first)
966           EI++;
967         if (EI == EIend || EI->first > CI->first)
968           Diag(CI->second->getLHS()->getExprLoc(), diag::warn_not_in_enum)
969             << CondTypeBeforePromotion;
970       }
971       // See which of case ranges aren't in enum
972       EI = EnumVals.begin();
973       for (CaseRangesTy::const_iterator RI = CaseRanges.begin();
974            RI != CaseRanges.end() && EI != EIend; RI++) {
975         while (EI != EIend && EI->first < RI->first)
976           EI++;
977 
978         if (EI == EIend || EI->first != RI->first) {
979           Diag(RI->second->getLHS()->getExprLoc(), diag::warn_not_in_enum)
980             << CondTypeBeforePromotion;
981         }
982 
983         llvm::APSInt Hi =
984           RI->second->getRHS()->EvaluateKnownConstInt(Context);
985         AdjustAPSInt(Hi, CondWidth, CondIsSigned);
986         while (EI != EIend && EI->first < Hi)
987           EI++;
988         if (EI == EIend || EI->first != Hi)
989           Diag(RI->second->getRHS()->getExprLoc(), diag::warn_not_in_enum)
990             << CondTypeBeforePromotion;
991       }
992 
993       // Check which enum vals aren't in switch
994       CaseValsTy::const_iterator CI = CaseVals.begin();
995       CaseRangesTy::const_iterator RI = CaseRanges.begin();
996       bool hasCasesNotInSwitch = false;
997 
998       SmallVector<DeclarationName,8> UnhandledNames;
999 
1000       for (EI = EnumVals.begin(); EI != EIend; EI++){
1001         // Drop unneeded case values
1002         llvm::APSInt CIVal;
1003         while (CI != CaseVals.end() && CI->first < EI->first)
1004           CI++;
1005 
1006         if (CI != CaseVals.end() && CI->first == EI->first)
1007           continue;
1008 
1009         // Drop unneeded case ranges
1010         for (; RI != CaseRanges.end(); RI++) {
1011           llvm::APSInt Hi =
1012             RI->second->getRHS()->EvaluateKnownConstInt(Context);
1013           AdjustAPSInt(Hi, CondWidth, CondIsSigned);
1014           if (EI->first <= Hi)
1015             break;
1016         }
1017 
1018         if (RI == CaseRanges.end() || EI->first < RI->first) {
1019           hasCasesNotInSwitch = true;
1020           UnhandledNames.push_back(EI->second->getDeclName());
1021         }
1022       }
1023 
1024       if (TheDefaultStmt && UnhandledNames.empty())
1025         Diag(TheDefaultStmt->getDefaultLoc(), diag::warn_unreachable_default);
1026 
1027       // Produce a nice diagnostic if multiple values aren't handled.
1028       switch (UnhandledNames.size()) {
1029       case 0: break;
1030       case 1:
1031         Diag(CondExpr->getExprLoc(), TheDefaultStmt
1032           ? diag::warn_def_missing_case1 : diag::warn_missing_case1)
1033           << UnhandledNames[0];
1034         break;
1035       case 2:
1036         Diag(CondExpr->getExprLoc(), TheDefaultStmt
1037           ? diag::warn_def_missing_case2 : diag::warn_missing_case2)
1038           << UnhandledNames[0] << UnhandledNames[1];
1039         break;
1040       case 3:
1041         Diag(CondExpr->getExprLoc(), TheDefaultStmt
1042           ? diag::warn_def_missing_case3 : diag::warn_missing_case3)
1043           << UnhandledNames[0] << UnhandledNames[1] << UnhandledNames[2];
1044         break;
1045       default:
1046         Diag(CondExpr->getExprLoc(), TheDefaultStmt
1047           ? diag::warn_def_missing_cases : diag::warn_missing_cases)
1048           << (unsigned)UnhandledNames.size()
1049           << UnhandledNames[0] << UnhandledNames[1] << UnhandledNames[2];
1050         break;
1051       }
1052 
1053       if (!hasCasesNotInSwitch)
1054         SS->setAllEnumCasesCovered();
1055     }
1056   }
1057 
1058   DiagnoseEmptyStmtBody(CondExpr->getLocEnd(), BodyStmt,
1059                         diag::warn_empty_switch_body);
1060 
1061   // FIXME: If the case list was broken is some way, we don't have a good system
1062   // to patch it up.  Instead, just return the whole substmt as broken.
1063   if (CaseListIsErroneous)
1064     return StmtError();
1065 
1066   return Owned(SS);
1067 }
1068 
1069 void
DiagnoseAssignmentEnum(QualType DstType,QualType SrcType,Expr * SrcExpr)1070 Sema::DiagnoseAssignmentEnum(QualType DstType, QualType SrcType,
1071                              Expr *SrcExpr) {
1072   unsigned DIAG = diag::warn_not_in_enum_assignement;
1073   if (Diags.getDiagnosticLevel(DIAG, SrcExpr->getExprLoc())
1074       == DiagnosticsEngine::Ignored)
1075     return;
1076 
1077   if (const EnumType *ET = DstType->getAs<EnumType>())
1078     if (!Context.hasSameType(SrcType, DstType) &&
1079         SrcType->isIntegerType()) {
1080       if (!SrcExpr->isTypeDependent() && !SrcExpr->isValueDependent() &&
1081           SrcExpr->isIntegerConstantExpr(Context)) {
1082         // Get the bitwidth of the enum value before promotions.
1083         unsigned DstWith = Context.getIntWidth(DstType);
1084         bool DstIsSigned = DstType->isSignedIntegerOrEnumerationType();
1085 
1086         llvm::APSInt RhsVal = SrcExpr->EvaluateKnownConstInt(Context);
1087         const EnumDecl *ED = ET->getDecl();
1088         typedef SmallVector<std::pair<llvm::APSInt, EnumConstantDecl*>, 64>
1089         EnumValsTy;
1090         EnumValsTy EnumVals;
1091 
1092         // Gather all enum values, set their type and sort them,
1093         // allowing easier comparison with rhs constant.
1094         for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin();
1095              EDI != ED->enumerator_end(); ++EDI) {
1096           llvm::APSInt Val = EDI->getInitVal();
1097           AdjustAPSInt(Val, DstWith, DstIsSigned);
1098           EnumVals.push_back(std::make_pair(Val, *EDI));
1099         }
1100         if (EnumVals.empty())
1101           return;
1102         std::stable_sort(EnumVals.begin(), EnumVals.end(), CmpEnumVals);
1103         EnumValsTy::iterator EIend =
1104         std::unique(EnumVals.begin(), EnumVals.end(), EqEnumVals);
1105 
1106         // See which case values aren't in enum.
1107         EnumValsTy::const_iterator EI = EnumVals.begin();
1108         while (EI != EIend && EI->first < RhsVal)
1109           EI++;
1110         if (EI == EIend || EI->first != RhsVal) {
1111           Diag(SrcExpr->getExprLoc(), diag::warn_not_in_enum_assignement)
1112           << DstType;
1113         }
1114       }
1115     }
1116 }
1117 
1118 StmtResult
ActOnWhileStmt(SourceLocation WhileLoc,FullExprArg Cond,Decl * CondVar,Stmt * Body)1119 Sema::ActOnWhileStmt(SourceLocation WhileLoc, FullExprArg Cond,
1120                      Decl *CondVar, Stmt *Body) {
1121   ExprResult CondResult(Cond.release());
1122 
1123   VarDecl *ConditionVar = 0;
1124   if (CondVar) {
1125     ConditionVar = cast<VarDecl>(CondVar);
1126     CondResult = CheckConditionVariable(ConditionVar, WhileLoc, true);
1127     if (CondResult.isInvalid())
1128       return StmtError();
1129   }
1130   Expr *ConditionExpr = CondResult.take();
1131   if (!ConditionExpr)
1132     return StmtError();
1133 
1134   DiagnoseUnusedExprResult(Body);
1135 
1136   if (isa<NullStmt>(Body))
1137     getCurCompoundScope().setHasEmptyLoopBodies();
1138 
1139   return Owned(new (Context) WhileStmt(Context, ConditionVar, ConditionExpr,
1140                                        Body, WhileLoc));
1141 }
1142 
1143 StmtResult
ActOnDoStmt(SourceLocation DoLoc,Stmt * Body,SourceLocation WhileLoc,SourceLocation CondLParen,Expr * Cond,SourceLocation CondRParen)1144 Sema::ActOnDoStmt(SourceLocation DoLoc, Stmt *Body,
1145                   SourceLocation WhileLoc, SourceLocation CondLParen,
1146                   Expr *Cond, SourceLocation CondRParen) {
1147   assert(Cond && "ActOnDoStmt(): missing expression");
1148 
1149   ExprResult CondResult = CheckBooleanCondition(Cond, DoLoc);
1150   if (CondResult.isInvalid() || CondResult.isInvalid())
1151     return StmtError();
1152   Cond = CondResult.take();
1153 
1154   CheckImplicitConversions(Cond, DoLoc);
1155   CondResult = MaybeCreateExprWithCleanups(Cond);
1156   if (CondResult.isInvalid())
1157     return StmtError();
1158   Cond = CondResult.take();
1159 
1160   DiagnoseUnusedExprResult(Body);
1161 
1162   return Owned(new (Context) DoStmt(Body, Cond, DoLoc, WhileLoc, CondRParen));
1163 }
1164 
1165 namespace {
1166   // This visitor will traverse a conditional statement and store all
1167   // the evaluated decls into a vector.  Simple is set to true if none
1168   // of the excluded constructs are used.
1169   class DeclExtractor : public EvaluatedExprVisitor<DeclExtractor> {
1170     llvm::SmallPtrSet<VarDecl*, 8> &Decls;
1171     llvm::SmallVector<SourceRange, 10> &Ranges;
1172     bool Simple;
1173 public:
1174   typedef EvaluatedExprVisitor<DeclExtractor> Inherited;
1175 
DeclExtractor(Sema & S,llvm::SmallPtrSet<VarDecl *,8> & Decls,llvm::SmallVector<SourceRange,10> & Ranges)1176   DeclExtractor(Sema &S, llvm::SmallPtrSet<VarDecl*, 8> &Decls,
1177                 llvm::SmallVector<SourceRange, 10> &Ranges) :
1178       Inherited(S.Context),
1179       Decls(Decls),
1180       Ranges(Ranges),
1181       Simple(true) {}
1182 
isSimple()1183   bool isSimple() { return Simple; }
1184 
1185   // Replaces the method in EvaluatedExprVisitor.
VisitMemberExpr(MemberExpr * E)1186   void VisitMemberExpr(MemberExpr* E) {
1187     Simple = false;
1188   }
1189 
1190   // Any Stmt not whitelisted will cause the condition to be marked complex.
VisitStmt(Stmt * S)1191   void VisitStmt(Stmt *S) {
1192     Simple = false;
1193   }
1194 
VisitBinaryOperator(BinaryOperator * E)1195   void VisitBinaryOperator(BinaryOperator *E) {
1196     Visit(E->getLHS());
1197     Visit(E->getRHS());
1198   }
1199 
VisitCastExpr(CastExpr * E)1200   void VisitCastExpr(CastExpr *E) {
1201     Visit(E->getSubExpr());
1202   }
1203 
VisitUnaryOperator(UnaryOperator * E)1204   void VisitUnaryOperator(UnaryOperator *E) {
1205     // Skip checking conditionals with derefernces.
1206     if (E->getOpcode() == UO_Deref)
1207       Simple = false;
1208     else
1209       Visit(E->getSubExpr());
1210   }
1211 
VisitConditionalOperator(ConditionalOperator * E)1212   void VisitConditionalOperator(ConditionalOperator *E) {
1213     Visit(E->getCond());
1214     Visit(E->getTrueExpr());
1215     Visit(E->getFalseExpr());
1216   }
1217 
VisitParenExpr(ParenExpr * E)1218   void VisitParenExpr(ParenExpr *E) {
1219     Visit(E->getSubExpr());
1220   }
1221 
VisitBinaryConditionalOperator(BinaryConditionalOperator * E)1222   void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
1223     Visit(E->getOpaqueValue()->getSourceExpr());
1224     Visit(E->getFalseExpr());
1225   }
1226 
VisitIntegerLiteral(IntegerLiteral * E)1227   void VisitIntegerLiteral(IntegerLiteral *E) { }
VisitFloatingLiteral(FloatingLiteral * E)1228   void VisitFloatingLiteral(FloatingLiteral *E) { }
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)1229   void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { }
VisitCharacterLiteral(CharacterLiteral * E)1230   void VisitCharacterLiteral(CharacterLiteral *E) { }
VisitGNUNullExpr(GNUNullExpr * E)1231   void VisitGNUNullExpr(GNUNullExpr *E) { }
VisitImaginaryLiteral(ImaginaryLiteral * E)1232   void VisitImaginaryLiteral(ImaginaryLiteral *E) { }
1233 
VisitDeclRefExpr(DeclRefExpr * E)1234   void VisitDeclRefExpr(DeclRefExpr *E) {
1235     VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
1236     if (!VD) return;
1237 
1238     Ranges.push_back(E->getSourceRange());
1239 
1240     Decls.insert(VD);
1241   }
1242 
1243   }; // end class DeclExtractor
1244 
1245   // DeclMatcher checks to see if the decls are used in a non-evauluated
1246   // context.
1247   class DeclMatcher : public EvaluatedExprVisitor<DeclMatcher> {
1248     llvm::SmallPtrSet<VarDecl*, 8> &Decls;
1249     bool FoundDecl;
1250 
1251 public:
1252   typedef EvaluatedExprVisitor<DeclMatcher> Inherited;
1253 
DeclMatcher(Sema & S,llvm::SmallPtrSet<VarDecl *,8> & Decls,Stmt * Statement)1254   DeclMatcher(Sema &S, llvm::SmallPtrSet<VarDecl*, 8> &Decls, Stmt *Statement) :
1255       Inherited(S.Context), Decls(Decls), FoundDecl(false) {
1256     if (!Statement) return;
1257 
1258     Visit(Statement);
1259   }
1260 
VisitReturnStmt(ReturnStmt * S)1261   void VisitReturnStmt(ReturnStmt *S) {
1262     FoundDecl = true;
1263   }
1264 
VisitBreakStmt(BreakStmt * S)1265   void VisitBreakStmt(BreakStmt *S) {
1266     FoundDecl = true;
1267   }
1268 
VisitGotoStmt(GotoStmt * S)1269   void VisitGotoStmt(GotoStmt *S) {
1270     FoundDecl = true;
1271   }
1272 
VisitCastExpr(CastExpr * E)1273   void VisitCastExpr(CastExpr *E) {
1274     if (E->getCastKind() == CK_LValueToRValue)
1275       CheckLValueToRValueCast(E->getSubExpr());
1276     else
1277       Visit(E->getSubExpr());
1278   }
1279 
CheckLValueToRValueCast(Expr * E)1280   void CheckLValueToRValueCast(Expr *E) {
1281     E = E->IgnoreParenImpCasts();
1282 
1283     if (isa<DeclRefExpr>(E)) {
1284       return;
1285     }
1286 
1287     if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
1288       Visit(CO->getCond());
1289       CheckLValueToRValueCast(CO->getTrueExpr());
1290       CheckLValueToRValueCast(CO->getFalseExpr());
1291       return;
1292     }
1293 
1294     if (BinaryConditionalOperator *BCO =
1295             dyn_cast<BinaryConditionalOperator>(E)) {
1296       CheckLValueToRValueCast(BCO->getOpaqueValue()->getSourceExpr());
1297       CheckLValueToRValueCast(BCO->getFalseExpr());
1298       return;
1299     }
1300 
1301     Visit(E);
1302   }
1303 
VisitDeclRefExpr(DeclRefExpr * E)1304   void VisitDeclRefExpr(DeclRefExpr *E) {
1305     if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()))
1306       if (Decls.count(VD))
1307         FoundDecl = true;
1308   }
1309 
FoundDeclInUse()1310   bool FoundDeclInUse() { return FoundDecl; }
1311 
1312   };  // end class DeclMatcher
1313 
CheckForLoopConditionalStatement(Sema & S,Expr * Second,Expr * Third,Stmt * Body)1314   void CheckForLoopConditionalStatement(Sema &S, Expr *Second,
1315                                         Expr *Third, Stmt *Body) {
1316     // Condition is empty
1317     if (!Second) return;
1318 
1319     if (S.Diags.getDiagnosticLevel(diag::warn_variables_not_in_loop_body,
1320                                    Second->getLocStart())
1321         == DiagnosticsEngine::Ignored)
1322       return;
1323 
1324     PartialDiagnostic PDiag = S.PDiag(diag::warn_variables_not_in_loop_body);
1325     llvm::SmallPtrSet<VarDecl*, 8> Decls;
1326     llvm::SmallVector<SourceRange, 10> Ranges;
1327     DeclExtractor DE(S, Decls, Ranges);
1328     DE.Visit(Second);
1329 
1330     // Don't analyze complex conditionals.
1331     if (!DE.isSimple()) return;
1332 
1333     // No decls found.
1334     if (Decls.size() == 0) return;
1335 
1336     // Don't warn on volatile, static, or global variables.
1337     for (llvm::SmallPtrSet<VarDecl*, 8>::iterator I = Decls.begin(),
1338                                                   E = Decls.end();
1339          I != E; ++I)
1340       if ((*I)->getType().isVolatileQualified() ||
1341           (*I)->hasGlobalStorage()) return;
1342 
1343     if (DeclMatcher(S, Decls, Second).FoundDeclInUse() ||
1344         DeclMatcher(S, Decls, Third).FoundDeclInUse() ||
1345         DeclMatcher(S, Decls, Body).FoundDeclInUse())
1346       return;
1347 
1348     // Load decl names into diagnostic.
1349     if (Decls.size() > 4)
1350       PDiag << 0;
1351     else {
1352       PDiag << Decls.size();
1353       for (llvm::SmallPtrSet<VarDecl*, 8>::iterator I = Decls.begin(),
1354                                                     E = Decls.end();
1355            I != E; ++I)
1356         PDiag << (*I)->getDeclName();
1357     }
1358 
1359     // Load SourceRanges into diagnostic if there is room.
1360     // Otherwise, load the SourceRange of the conditional expression.
1361     if (Ranges.size() <= PartialDiagnostic::MaxArguments)
1362       for (llvm::SmallVector<SourceRange, 10>::iterator I = Ranges.begin(),
1363                                                         E = Ranges.end();
1364            I != E; ++I)
1365         PDiag << *I;
1366     else
1367       PDiag << Second->getSourceRange();
1368 
1369     S.Diag(Ranges.begin()->getBegin(), PDiag);
1370   }
1371 
1372 } // end namespace
1373 
1374 StmtResult
ActOnForStmt(SourceLocation ForLoc,SourceLocation LParenLoc,Stmt * First,FullExprArg second,Decl * secondVar,FullExprArg third,SourceLocation RParenLoc,Stmt * Body)1375 Sema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1376                    Stmt *First, FullExprArg second, Decl *secondVar,
1377                    FullExprArg third,
1378                    SourceLocation RParenLoc, Stmt *Body) {
1379   if (!getLangOpts().CPlusPlus) {
1380     if (DeclStmt *DS = dyn_cast_or_null<DeclStmt>(First)) {
1381       // C99 6.8.5p3: The declaration part of a 'for' statement shall only
1382       // declare identifiers for objects having storage class 'auto' or
1383       // 'register'.
1384       for (DeclStmt::decl_iterator DI=DS->decl_begin(), DE=DS->decl_end();
1385            DI!=DE; ++DI) {
1386         VarDecl *VD = dyn_cast<VarDecl>(*DI);
1387         if (VD && VD->isLocalVarDecl() && !VD->hasLocalStorage())
1388           VD = 0;
1389         if (VD == 0)
1390           Diag((*DI)->getLocation(), diag::err_non_variable_decl_in_for);
1391         // FIXME: mark decl erroneous!
1392       }
1393     }
1394   }
1395 
1396   CheckForLoopConditionalStatement(*this, second.get(), third.get(), Body);
1397 
1398   ExprResult SecondResult(second.release());
1399   VarDecl *ConditionVar = 0;
1400   if (secondVar) {
1401     ConditionVar = cast<VarDecl>(secondVar);
1402     SecondResult = CheckConditionVariable(ConditionVar, ForLoc, true);
1403     if (SecondResult.isInvalid())
1404       return StmtError();
1405   }
1406 
1407   Expr *Third  = third.release().takeAs<Expr>();
1408 
1409   DiagnoseUnusedExprResult(First);
1410   DiagnoseUnusedExprResult(Third);
1411   DiagnoseUnusedExprResult(Body);
1412 
1413   if (isa<NullStmt>(Body))
1414     getCurCompoundScope().setHasEmptyLoopBodies();
1415 
1416   return Owned(new (Context) ForStmt(Context, First,
1417                                      SecondResult.take(), ConditionVar,
1418                                      Third, Body, ForLoc, LParenLoc,
1419                                      RParenLoc));
1420 }
1421 
1422 /// In an Objective C collection iteration statement:
1423 ///   for (x in y)
1424 /// x can be an arbitrary l-value expression.  Bind it up as a
1425 /// full-expression.
ActOnForEachLValueExpr(Expr * E)1426 StmtResult Sema::ActOnForEachLValueExpr(Expr *E) {
1427   // Reduce placeholder expressions here.  Note that this rejects the
1428   // use of pseudo-object l-values in this position.
1429   ExprResult result = CheckPlaceholderExpr(E);
1430   if (result.isInvalid()) return StmtError();
1431   E = result.take();
1432 
1433   CheckImplicitConversions(E);
1434 
1435   result = MaybeCreateExprWithCleanups(E);
1436   if (result.isInvalid()) return StmtError();
1437 
1438   return Owned(static_cast<Stmt*>(result.take()));
1439 }
1440 
1441 ExprResult
CheckObjCForCollectionOperand(SourceLocation forLoc,Expr * collection)1442 Sema::CheckObjCForCollectionOperand(SourceLocation forLoc, Expr *collection) {
1443   if (!collection)
1444     return ExprError();
1445 
1446   // Bail out early if we've got a type-dependent expression.
1447   if (collection->isTypeDependent()) return Owned(collection);
1448 
1449   // Perform normal l-value conversion.
1450   ExprResult result = DefaultFunctionArrayLvalueConversion(collection);
1451   if (result.isInvalid())
1452     return ExprError();
1453   collection = result.take();
1454 
1455   // The operand needs to have object-pointer type.
1456   // TODO: should we do a contextual conversion?
1457   const ObjCObjectPointerType *pointerType =
1458     collection->getType()->getAs<ObjCObjectPointerType>();
1459   if (!pointerType)
1460     return Diag(forLoc, diag::err_collection_expr_type)
1461              << collection->getType() << collection->getSourceRange();
1462 
1463   // Check that the operand provides
1464   //   - countByEnumeratingWithState:objects:count:
1465   const ObjCObjectType *objectType = pointerType->getObjectType();
1466   ObjCInterfaceDecl *iface = objectType->getInterface();
1467 
1468   // If we have a forward-declared type, we can't do this check.
1469   // Under ARC, it is an error not to have a forward-declared class.
1470   if (iface &&
1471       RequireCompleteType(forLoc, QualType(objectType, 0),
1472                           getLangOpts().ObjCAutoRefCount
1473                             ? diag::err_arc_collection_forward
1474                             : 0,
1475                           collection)) {
1476     // Otherwise, if we have any useful type information, check that
1477     // the type declares the appropriate method.
1478   } else if (iface || !objectType->qual_empty()) {
1479     IdentifierInfo *selectorIdents[] = {
1480       &Context.Idents.get("countByEnumeratingWithState"),
1481       &Context.Idents.get("objects"),
1482       &Context.Idents.get("count")
1483     };
1484     Selector selector = Context.Selectors.getSelector(3, &selectorIdents[0]);
1485 
1486     ObjCMethodDecl *method = 0;
1487 
1488     // If there's an interface, look in both the public and private APIs.
1489     if (iface) {
1490       method = iface->lookupInstanceMethod(selector);
1491       if (!method) method = iface->lookupPrivateMethod(selector);
1492     }
1493 
1494     // Also check protocol qualifiers.
1495     if (!method)
1496       method = LookupMethodInQualifiedType(selector, pointerType,
1497                                            /*instance*/ true);
1498 
1499     // If we didn't find it anywhere, give up.
1500     if (!method) {
1501       Diag(forLoc, diag::warn_collection_expr_type)
1502         << collection->getType() << selector << collection->getSourceRange();
1503     }
1504 
1505     // TODO: check for an incompatible signature?
1506   }
1507 
1508   // Wrap up any cleanups in the expression.
1509   return Owned(MaybeCreateExprWithCleanups(collection));
1510 }
1511 
1512 StmtResult
ActOnObjCForCollectionStmt(SourceLocation ForLoc,Stmt * First,Expr * collection,SourceLocation RParenLoc)1513 Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
1514                                  Stmt *First, Expr *collection,
1515                                  SourceLocation RParenLoc) {
1516 
1517   ExprResult CollectionExprResult =
1518     CheckObjCForCollectionOperand(ForLoc, collection);
1519 
1520   if (First) {
1521     QualType FirstType;
1522     if (DeclStmt *DS = dyn_cast<DeclStmt>(First)) {
1523       if (!DS->isSingleDecl())
1524         return StmtError(Diag((*DS->decl_begin())->getLocation(),
1525                          diag::err_toomany_element_decls));
1526 
1527       VarDecl *D = cast<VarDecl>(DS->getSingleDecl());
1528       FirstType = D->getType();
1529       // C99 6.8.5p3: The declaration part of a 'for' statement shall only
1530       // declare identifiers for objects having storage class 'auto' or
1531       // 'register'.
1532       if (!D->hasLocalStorage())
1533         return StmtError(Diag(D->getLocation(),
1534                               diag::err_non_variable_decl_in_for));
1535     } else {
1536       Expr *FirstE = cast<Expr>(First);
1537       if (!FirstE->isTypeDependent() && !FirstE->isLValue())
1538         return StmtError(Diag(First->getLocStart(),
1539                    diag::err_selector_element_not_lvalue)
1540           << First->getSourceRange());
1541 
1542       FirstType = static_cast<Expr*>(First)->getType();
1543     }
1544     if (!FirstType->isDependentType() &&
1545         !FirstType->isObjCObjectPointerType() &&
1546         !FirstType->isBlockPointerType())
1547         return StmtError(Diag(ForLoc, diag::err_selector_element_type)
1548                            << FirstType << First->getSourceRange());
1549   }
1550 
1551   if (CollectionExprResult.isInvalid())
1552     return StmtError();
1553 
1554   return Owned(new (Context) ObjCForCollectionStmt(First,
1555                                                    CollectionExprResult.take(), 0,
1556                                                    ForLoc, RParenLoc));
1557 }
1558 
1559 /// Finish building a variable declaration for a for-range statement.
1560 /// \return true if an error occurs.
FinishForRangeVarDecl(Sema & SemaRef,VarDecl * Decl,Expr * Init,SourceLocation Loc,int diag)1561 static bool FinishForRangeVarDecl(Sema &SemaRef, VarDecl *Decl, Expr *Init,
1562                                   SourceLocation Loc, int diag) {
1563   // Deduce the type for the iterator variable now rather than leaving it to
1564   // AddInitializerToDecl, so we can produce a more suitable diagnostic.
1565   TypeSourceInfo *InitTSI = 0;
1566   if ((!isa<InitListExpr>(Init) && Init->getType()->isVoidType()) ||
1567       SemaRef.DeduceAutoType(Decl->getTypeSourceInfo(), Init, InitTSI) ==
1568           Sema::DAR_Failed)
1569     SemaRef.Diag(Loc, diag) << Init->getType();
1570   if (!InitTSI) {
1571     Decl->setInvalidDecl();
1572     return true;
1573   }
1574   Decl->setTypeSourceInfo(InitTSI);
1575   Decl->setType(InitTSI->getType());
1576 
1577   // In ARC, infer lifetime.
1578   // FIXME: ARC may want to turn this into 'const __unsafe_unretained' if
1579   // we're doing the equivalent of fast iteration.
1580   if (SemaRef.getLangOpts().ObjCAutoRefCount &&
1581       SemaRef.inferObjCARCLifetime(Decl))
1582     Decl->setInvalidDecl();
1583 
1584   SemaRef.AddInitializerToDecl(Decl, Init, /*DirectInit=*/false,
1585                                /*TypeMayContainAuto=*/false);
1586   SemaRef.FinalizeDeclaration(Decl);
1587   SemaRef.CurContext->addHiddenDecl(Decl);
1588   return false;
1589 }
1590 
1591 namespace {
1592 
1593 /// Produce a note indicating which begin/end function was implicitly called
1594 /// by a C++11 for-range statement. This is often not obvious from the code,
1595 /// nor from the diagnostics produced when analysing the implicit expressions
1596 /// required in a for-range statement.
NoteForRangeBeginEndFunction(Sema & SemaRef,Expr * E,Sema::BeginEndFunction BEF)1597 void NoteForRangeBeginEndFunction(Sema &SemaRef, Expr *E,
1598                                   Sema::BeginEndFunction BEF) {
1599   CallExpr *CE = dyn_cast<CallExpr>(E);
1600   if (!CE)
1601     return;
1602   FunctionDecl *D = dyn_cast<FunctionDecl>(CE->getCalleeDecl());
1603   if (!D)
1604     return;
1605   SourceLocation Loc = D->getLocation();
1606 
1607   std::string Description;
1608   bool IsTemplate = false;
1609   if (FunctionTemplateDecl *FunTmpl = D->getPrimaryTemplate()) {
1610     Description = SemaRef.getTemplateArgumentBindingsText(
1611       FunTmpl->getTemplateParameters(), *D->getTemplateSpecializationArgs());
1612     IsTemplate = true;
1613   }
1614 
1615   SemaRef.Diag(Loc, diag::note_for_range_begin_end)
1616     << BEF << IsTemplate << Description << E->getType();
1617 }
1618 
1619 /// Build a variable declaration for a for-range statement.
BuildForRangeVarDecl(Sema & SemaRef,SourceLocation Loc,QualType Type,const char * Name)1620 VarDecl *BuildForRangeVarDecl(Sema &SemaRef, SourceLocation Loc,
1621                               QualType Type, const char *Name) {
1622   DeclContext *DC = SemaRef.CurContext;
1623   IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name);
1624   TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
1625   VarDecl *Decl = VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type,
1626                                   TInfo, SC_Auto, SC_None);
1627   Decl->setImplicit();
1628   return Decl;
1629 }
1630 
1631 }
1632 
ObjCEnumerationCollection(Expr * Collection)1633 static bool ObjCEnumerationCollection(Expr *Collection) {
1634   return !Collection->isTypeDependent()
1635           && Collection->getType()->getAs<ObjCObjectPointerType>() != 0;
1636 }
1637 
1638 /// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
1639 ///
1640 /// C++11 [stmt.ranged]:
1641 ///   A range-based for statement is equivalent to
1642 ///
1643 ///   {
1644 ///     auto && __range = range-init;
1645 ///     for ( auto __begin = begin-expr,
1646 ///           __end = end-expr;
1647 ///           __begin != __end;
1648 ///           ++__begin ) {
1649 ///       for-range-declaration = *__begin;
1650 ///       statement
1651 ///     }
1652 ///   }
1653 ///
1654 /// The body of the loop is not available yet, since it cannot be analysed until
1655 /// we have determined the type of the for-range-declaration.
1656 StmtResult
ActOnCXXForRangeStmt(SourceLocation ForLoc,Stmt * First,SourceLocation ColonLoc,Expr * Range,SourceLocation RParenLoc,bool ShouldTryDeref)1657 Sema::ActOnCXXForRangeStmt(SourceLocation ForLoc,
1658                            Stmt *First, SourceLocation ColonLoc, Expr *Range,
1659                            SourceLocation RParenLoc, bool ShouldTryDeref) {
1660   if (!First || !Range)
1661     return StmtError();
1662 
1663   if (ObjCEnumerationCollection(Range))
1664     return ActOnObjCForCollectionStmt(ForLoc, First, Range, RParenLoc);
1665 
1666   DeclStmt *DS = dyn_cast<DeclStmt>(First);
1667   assert(DS && "first part of for range not a decl stmt");
1668 
1669   if (!DS->isSingleDecl()) {
1670     Diag(DS->getStartLoc(), diag::err_type_defined_in_for_range);
1671     return StmtError();
1672   }
1673   if (DS->getSingleDecl()->isInvalidDecl())
1674     return StmtError();
1675 
1676   if (DiagnoseUnexpandedParameterPack(Range, UPPC_Expression))
1677     return StmtError();
1678 
1679   // Build  auto && __range = range-init
1680   SourceLocation RangeLoc = Range->getLocStart();
1681   VarDecl *RangeVar = BuildForRangeVarDecl(*this, RangeLoc,
1682                                            Context.getAutoRRefDeductType(),
1683                                            "__range");
1684   if (FinishForRangeVarDecl(*this, RangeVar, Range, RangeLoc,
1685                             diag::err_for_range_deduction_failure))
1686     return StmtError();
1687 
1688   // Claim the type doesn't contain auto: we've already done the checking.
1689   DeclGroupPtrTy RangeGroup =
1690     BuildDeclaratorGroup((Decl**)&RangeVar, 1, /*TypeMayContainAuto=*/false);
1691   StmtResult RangeDecl = ActOnDeclStmt(RangeGroup, RangeLoc, RangeLoc);
1692   if (RangeDecl.isInvalid())
1693     return StmtError();
1694 
1695   return BuildCXXForRangeStmt(ForLoc, ColonLoc, RangeDecl.get(),
1696                               /*BeginEndDecl=*/0, /*Cond=*/0, /*Inc=*/0, DS,
1697                               RParenLoc, ShouldTryDeref);
1698 }
1699 
1700 /// \brief Create the initialization, compare, and increment steps for
1701 /// the range-based for loop expression.
1702 /// This function does not handle array-based for loops,
1703 /// which are created in Sema::BuildCXXForRangeStmt.
1704 ///
1705 /// \returns a ForRangeStatus indicating success or what kind of error occurred.
1706 /// BeginExpr and EndExpr are set and FRS_Success is returned on success;
1707 /// CandidateSet and BEF are set and some non-success value is returned on
1708 /// failure.
BuildNonArrayForRange(Sema & SemaRef,Scope * S,Expr * BeginRange,Expr * EndRange,QualType RangeType,VarDecl * BeginVar,VarDecl * EndVar,SourceLocation ColonLoc,OverloadCandidateSet * CandidateSet,ExprResult * BeginExpr,ExprResult * EndExpr,Sema::BeginEndFunction * BEF)1709 static Sema::ForRangeStatus BuildNonArrayForRange(Sema &SemaRef, Scope *S,
1710                                             Expr *BeginRange, Expr *EndRange,
1711                                             QualType RangeType,
1712                                             VarDecl *BeginVar,
1713                                             VarDecl *EndVar,
1714                                             SourceLocation ColonLoc,
1715                                             OverloadCandidateSet *CandidateSet,
1716                                             ExprResult *BeginExpr,
1717                                             ExprResult *EndExpr,
1718                                             Sema::BeginEndFunction *BEF) {
1719   DeclarationNameInfo BeginNameInfo(
1720       &SemaRef.PP.getIdentifierTable().get("begin"), ColonLoc);
1721   DeclarationNameInfo EndNameInfo(&SemaRef.PP.getIdentifierTable().get("end"),
1722                                   ColonLoc);
1723 
1724   LookupResult BeginMemberLookup(SemaRef, BeginNameInfo,
1725                                  Sema::LookupMemberName);
1726   LookupResult EndMemberLookup(SemaRef, EndNameInfo, Sema::LookupMemberName);
1727 
1728   if (CXXRecordDecl *D = RangeType->getAsCXXRecordDecl()) {
1729     // - if _RangeT is a class type, the unqualified-ids begin and end are
1730     //   looked up in the scope of class _RangeT as if by class member access
1731     //   lookup (3.4.5), and if either (or both) finds at least one
1732     //   declaration, begin-expr and end-expr are __range.begin() and
1733     //   __range.end(), respectively;
1734     SemaRef.LookupQualifiedName(BeginMemberLookup, D);
1735     SemaRef.LookupQualifiedName(EndMemberLookup, D);
1736 
1737     if (BeginMemberLookup.empty() != EndMemberLookup.empty()) {
1738       SourceLocation RangeLoc = BeginVar->getLocation();
1739       *BEF = BeginMemberLookup.empty() ? Sema::BEF_end : Sema::BEF_begin;
1740 
1741       SemaRef.Diag(RangeLoc, diag::err_for_range_member_begin_end_mismatch)
1742           << RangeLoc << BeginRange->getType() << *BEF;
1743       return Sema::FRS_DiagnosticIssued;
1744     }
1745   } else {
1746     // - otherwise, begin-expr and end-expr are begin(__range) and
1747     //   end(__range), respectively, where begin and end are looked up with
1748     //   argument-dependent lookup (3.4.2). For the purposes of this name
1749     //   lookup, namespace std is an associated namespace.
1750 
1751   }
1752 
1753   *BEF = Sema::BEF_begin;
1754   Sema::ForRangeStatus RangeStatus =
1755       SemaRef.BuildForRangeBeginEndCall(S, ColonLoc, ColonLoc, BeginVar,
1756                                         Sema::BEF_begin, BeginNameInfo,
1757                                         BeginMemberLookup, CandidateSet,
1758                                         BeginRange, BeginExpr);
1759 
1760   if (RangeStatus != Sema::FRS_Success)
1761     return RangeStatus;
1762   if (FinishForRangeVarDecl(SemaRef, BeginVar, BeginExpr->get(), ColonLoc,
1763                             diag::err_for_range_iter_deduction_failure)) {
1764     NoteForRangeBeginEndFunction(SemaRef, BeginExpr->get(), *BEF);
1765     return Sema::FRS_DiagnosticIssued;
1766   }
1767 
1768   *BEF = Sema::BEF_end;
1769   RangeStatus =
1770       SemaRef.BuildForRangeBeginEndCall(S, ColonLoc, ColonLoc, EndVar,
1771                                         Sema::BEF_end, EndNameInfo,
1772                                         EndMemberLookup, CandidateSet,
1773                                         EndRange, EndExpr);
1774   if (RangeStatus != Sema::FRS_Success)
1775     return RangeStatus;
1776   if (FinishForRangeVarDecl(SemaRef, EndVar, EndExpr->get(), ColonLoc,
1777                             diag::err_for_range_iter_deduction_failure)) {
1778     NoteForRangeBeginEndFunction(SemaRef, EndExpr->get(), *BEF);
1779     return Sema::FRS_DiagnosticIssued;
1780   }
1781   return Sema::FRS_Success;
1782 }
1783 
1784 /// Speculatively attempt to dereference an invalid range expression.
1785 /// This function will not emit diagnostics, but returns StmtError if
1786 /// an error occurs.
RebuildForRangeWithDereference(Sema & SemaRef,Scope * S,SourceLocation ForLoc,Stmt * LoopVarDecl,SourceLocation ColonLoc,Expr * Range,SourceLocation RangeLoc,SourceLocation RParenLoc)1787 static StmtResult RebuildForRangeWithDereference(Sema &SemaRef, Scope *S,
1788                                                  SourceLocation ForLoc,
1789                                                  Stmt *LoopVarDecl,
1790                                                  SourceLocation ColonLoc,
1791                                                  Expr *Range,
1792                                                  SourceLocation RangeLoc,
1793                                                  SourceLocation RParenLoc) {
1794   Sema::SFINAETrap Trap(SemaRef);
1795   ExprResult AdjustedRange = SemaRef.BuildUnaryOp(S, RangeLoc, UO_Deref, Range);
1796   StmtResult SR =
1797     SemaRef.ActOnCXXForRangeStmt(ForLoc, LoopVarDecl, ColonLoc,
1798                                  AdjustedRange.get(), RParenLoc, false);
1799   if (Trap.hasErrorOccurred())
1800     return StmtError();
1801   return SR;
1802 }
1803 
1804 /// BuildCXXForRangeStmt - Build or instantiate a C++0x for-range statement.
1805 StmtResult
BuildCXXForRangeStmt(SourceLocation ForLoc,SourceLocation ColonLoc,Stmt * RangeDecl,Stmt * BeginEnd,Expr * Cond,Expr * Inc,Stmt * LoopVarDecl,SourceLocation RParenLoc,bool ShouldTryDeref)1806 Sema::BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation ColonLoc,
1807                            Stmt *RangeDecl, Stmt *BeginEnd, Expr *Cond,
1808                            Expr *Inc, Stmt *LoopVarDecl,
1809                            SourceLocation RParenLoc, bool ShouldTryDeref) {
1810   Scope *S = getCurScope();
1811 
1812   DeclStmt *RangeDS = cast<DeclStmt>(RangeDecl);
1813   VarDecl *RangeVar = cast<VarDecl>(RangeDS->getSingleDecl());
1814   QualType RangeVarType = RangeVar->getType();
1815 
1816   DeclStmt *LoopVarDS = cast<DeclStmt>(LoopVarDecl);
1817   VarDecl *LoopVar = cast<VarDecl>(LoopVarDS->getSingleDecl());
1818 
1819   StmtResult BeginEndDecl = BeginEnd;
1820   ExprResult NotEqExpr = Cond, IncrExpr = Inc;
1821 
1822   if (!BeginEndDecl.get() && !RangeVarType->isDependentType()) {
1823     SourceLocation RangeLoc = RangeVar->getLocation();
1824 
1825     const QualType RangeVarNonRefType = RangeVarType.getNonReferenceType();
1826 
1827     ExprResult BeginRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
1828                                                 VK_LValue, ColonLoc);
1829     if (BeginRangeRef.isInvalid())
1830       return StmtError();
1831 
1832     ExprResult EndRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
1833                                               VK_LValue, ColonLoc);
1834     if (EndRangeRef.isInvalid())
1835       return StmtError();
1836 
1837     QualType AutoType = Context.getAutoDeductType();
1838     Expr *Range = RangeVar->getInit();
1839     if (!Range)
1840       return StmtError();
1841     QualType RangeType = Range->getType();
1842 
1843     if (RequireCompleteType(RangeLoc, RangeType,
1844                             diag::err_for_range_incomplete_type))
1845       return StmtError();
1846 
1847     // Build auto __begin = begin-expr, __end = end-expr.
1848     VarDecl *BeginVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
1849                                              "__begin");
1850     VarDecl *EndVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
1851                                            "__end");
1852 
1853     // Build begin-expr and end-expr and attach to __begin and __end variables.
1854     ExprResult BeginExpr, EndExpr;
1855     if (const ArrayType *UnqAT = RangeType->getAsArrayTypeUnsafe()) {
1856       // - if _RangeT is an array type, begin-expr and end-expr are __range and
1857       //   __range + __bound, respectively, where __bound is the array bound. If
1858       //   _RangeT is an array of unknown size or an array of incomplete type,
1859       //   the program is ill-formed;
1860 
1861       // begin-expr is __range.
1862       BeginExpr = BeginRangeRef;
1863       if (FinishForRangeVarDecl(*this, BeginVar, BeginRangeRef.get(), ColonLoc,
1864                                 diag::err_for_range_iter_deduction_failure)) {
1865         NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
1866         return StmtError();
1867       }
1868 
1869       // Find the array bound.
1870       ExprResult BoundExpr;
1871       if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(UnqAT))
1872         BoundExpr = Owned(IntegerLiteral::Create(Context, CAT->getSize(),
1873                                                  Context.getPointerDiffType(),
1874                                                  RangeLoc));
1875       else if (const VariableArrayType *VAT =
1876                dyn_cast<VariableArrayType>(UnqAT))
1877         BoundExpr = VAT->getSizeExpr();
1878       else {
1879         // Can't be a DependentSizedArrayType or an IncompleteArrayType since
1880         // UnqAT is not incomplete and Range is not type-dependent.
1881         llvm_unreachable("Unexpected array type in for-range");
1882       }
1883 
1884       // end-expr is __range + __bound.
1885       EndExpr = ActOnBinOp(S, ColonLoc, tok::plus, EndRangeRef.get(),
1886                            BoundExpr.get());
1887       if (EndExpr.isInvalid())
1888         return StmtError();
1889       if (FinishForRangeVarDecl(*this, EndVar, EndExpr.get(), ColonLoc,
1890                                 diag::err_for_range_iter_deduction_failure)) {
1891         NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
1892         return StmtError();
1893       }
1894     } else {
1895       OverloadCandidateSet CandidateSet(RangeLoc);
1896       Sema::BeginEndFunction BEFFailure;
1897       ForRangeStatus RangeStatus =
1898           BuildNonArrayForRange(*this, S, BeginRangeRef.get(),
1899                                 EndRangeRef.get(), RangeType,
1900                                 BeginVar, EndVar, ColonLoc, &CandidateSet,
1901                                 &BeginExpr, &EndExpr, &BEFFailure);
1902 
1903       // If building the range failed, try dereferencing the range expression
1904       // unless a diagnostic was issued or the end function is problematic.
1905       if (ShouldTryDeref && RangeStatus == FRS_NoViableFunction &&
1906           BEFFailure == BEF_begin) {
1907         StmtResult SR = RebuildForRangeWithDereference(*this, S, ForLoc,
1908                                                        LoopVarDecl, ColonLoc,
1909                                                        Range, RangeLoc,
1910                                                        RParenLoc);
1911         if (!SR.isInvalid()) {
1912           // The attempt to dereference would succeed; return the result of
1913           // recovery.
1914           Diag(RangeLoc, diag::err_for_range_dereference)
1915               << RangeLoc << RangeType
1916               << FixItHint::CreateInsertion(RangeLoc, "*");
1917           return SR;
1918         }
1919       }
1920 
1921       // Otherwise, emit diagnostics if we haven't already.
1922       if (RangeStatus == FRS_NoViableFunction) {
1923         Expr *Range = BEFFailure ?  EndRangeRef.get() : BeginRangeRef.get();
1924         Diag(Range->getLocStart(), diag::err_for_range_invalid)
1925             << RangeLoc << Range->getType() << BEFFailure;
1926         CandidateSet.NoteCandidates(*this, OCD_AllCandidates,
1927                                     llvm::makeArrayRef(&Range, /*NumArgs=*/1));
1928       }
1929       // Return an error if no fix was discovered.
1930       if (RangeStatus != FRS_Success)
1931         return StmtError();
1932     }
1933 
1934     assert(!BeginExpr.isInvalid() && !EndExpr.isInvalid() &&
1935            "invalid range expression in for loop");
1936 
1937     // C++11 [dcl.spec.auto]p7: BeginType and EndType must be the same.
1938     QualType BeginType = BeginVar->getType(), EndType = EndVar->getType();
1939     if (!Context.hasSameType(BeginType, EndType)) {
1940       Diag(RangeLoc, diag::err_for_range_begin_end_types_differ)
1941         << BeginType << EndType;
1942       NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
1943       NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
1944     }
1945 
1946     Decl *BeginEndDecls[] = { BeginVar, EndVar };
1947     // Claim the type doesn't contain auto: we've already done the checking.
1948     DeclGroupPtrTy BeginEndGroup =
1949       BuildDeclaratorGroup(BeginEndDecls, 2, /*TypeMayContainAuto=*/false);
1950     BeginEndDecl = ActOnDeclStmt(BeginEndGroup, ColonLoc, ColonLoc);
1951 
1952     const QualType BeginRefNonRefType = BeginType.getNonReferenceType();
1953     ExprResult BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
1954                                            VK_LValue, ColonLoc);
1955     if (BeginRef.isInvalid())
1956       return StmtError();
1957 
1958     ExprResult EndRef = BuildDeclRefExpr(EndVar, EndType.getNonReferenceType(),
1959                                          VK_LValue, ColonLoc);
1960     if (EndRef.isInvalid())
1961       return StmtError();
1962 
1963     // Build and check __begin != __end expression.
1964     NotEqExpr = ActOnBinOp(S, ColonLoc, tok::exclaimequal,
1965                            BeginRef.get(), EndRef.get());
1966     NotEqExpr = ActOnBooleanCondition(S, ColonLoc, NotEqExpr.get());
1967     NotEqExpr = ActOnFinishFullExpr(NotEqExpr.get());
1968     if (NotEqExpr.isInvalid()) {
1969       Diag(RangeLoc, diag::note_for_range_invalid_iterator)
1970         << RangeLoc << 0 << BeginRangeRef.get()->getType();
1971       NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
1972       if (!Context.hasSameType(BeginType, EndType))
1973         NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
1974       return StmtError();
1975     }
1976 
1977     // Build and check ++__begin expression.
1978     BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
1979                                 VK_LValue, ColonLoc);
1980     if (BeginRef.isInvalid())
1981       return StmtError();
1982 
1983     IncrExpr = ActOnUnaryOp(S, ColonLoc, tok::plusplus, BeginRef.get());
1984     IncrExpr = ActOnFinishFullExpr(IncrExpr.get());
1985     if (IncrExpr.isInvalid()) {
1986       Diag(RangeLoc, diag::note_for_range_invalid_iterator)
1987         << RangeLoc << 2 << BeginRangeRef.get()->getType() ;
1988       NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
1989       return StmtError();
1990     }
1991 
1992     // Build and check *__begin  expression.
1993     BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
1994                                 VK_LValue, ColonLoc);
1995     if (BeginRef.isInvalid())
1996       return StmtError();
1997 
1998     ExprResult DerefExpr = ActOnUnaryOp(S, ColonLoc, tok::star, BeginRef.get());
1999     if (DerefExpr.isInvalid()) {
2000       Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2001         << RangeLoc << 1 << BeginRangeRef.get()->getType();
2002       NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2003       return StmtError();
2004     }
2005 
2006     // Attach  *__begin  as initializer for VD.
2007     if (!LoopVar->isInvalidDecl()) {
2008       AddInitializerToDecl(LoopVar, DerefExpr.get(), /*DirectInit=*/false,
2009                            /*TypeMayContainAuto=*/true);
2010       if (LoopVar->isInvalidDecl())
2011         NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2012     }
2013   } else {
2014     // The range is implicitly used as a placeholder when it is dependent.
2015     RangeVar->setUsed();
2016   }
2017 
2018   return Owned(new (Context) CXXForRangeStmt(RangeDS,
2019                                      cast_or_null<DeclStmt>(BeginEndDecl.get()),
2020                                              NotEqExpr.take(), IncrExpr.take(),
2021                                              LoopVarDS, /*Body=*/0, ForLoc,
2022                                              ColonLoc, RParenLoc));
2023 }
2024 
2025 /// FinishObjCForCollectionStmt - Attach the body to a objective-C foreach
2026 /// statement.
FinishObjCForCollectionStmt(Stmt * S,Stmt * B)2027 StmtResult Sema::FinishObjCForCollectionStmt(Stmt *S, Stmt *B) {
2028   if (!S || !B)
2029     return StmtError();
2030   ObjCForCollectionStmt * ForStmt = cast<ObjCForCollectionStmt>(S);
2031 
2032   ForStmt->setBody(B);
2033   return S;
2034 }
2035 
2036 /// FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
2037 /// This is a separate step from ActOnCXXForRangeStmt because analysis of the
2038 /// body cannot be performed until after the type of the range variable is
2039 /// determined.
FinishCXXForRangeStmt(Stmt * S,Stmt * B)2040 StmtResult Sema::FinishCXXForRangeStmt(Stmt *S, Stmt *B) {
2041   if (!S || !B)
2042     return StmtError();
2043 
2044   if (isa<ObjCForCollectionStmt>(S))
2045     return FinishObjCForCollectionStmt(S, B);
2046 
2047   CXXForRangeStmt *ForStmt = cast<CXXForRangeStmt>(S);
2048   ForStmt->setBody(B);
2049 
2050   DiagnoseEmptyStmtBody(ForStmt->getRParenLoc(), B,
2051                         diag::warn_empty_range_based_for_body);
2052 
2053   return S;
2054 }
2055 
ActOnGotoStmt(SourceLocation GotoLoc,SourceLocation LabelLoc,LabelDecl * TheDecl)2056 StmtResult Sema::ActOnGotoStmt(SourceLocation GotoLoc,
2057                                SourceLocation LabelLoc,
2058                                LabelDecl *TheDecl) {
2059   getCurFunction()->setHasBranchIntoScope();
2060   TheDecl->setUsed();
2061   return Owned(new (Context) GotoStmt(TheDecl, GotoLoc, LabelLoc));
2062 }
2063 
2064 StmtResult
ActOnIndirectGotoStmt(SourceLocation GotoLoc,SourceLocation StarLoc,Expr * E)2065 Sema::ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc,
2066                             Expr *E) {
2067   // Convert operand to void*
2068   if (!E->isTypeDependent()) {
2069     QualType ETy = E->getType();
2070     QualType DestTy = Context.getPointerType(Context.VoidTy.withConst());
2071     ExprResult ExprRes = Owned(E);
2072     AssignConvertType ConvTy =
2073       CheckSingleAssignmentConstraints(DestTy, ExprRes);
2074     if (ExprRes.isInvalid())
2075       return StmtError();
2076     E = ExprRes.take();
2077     if (DiagnoseAssignmentResult(ConvTy, StarLoc, DestTy, ETy, E, AA_Passing))
2078       return StmtError();
2079     E = MaybeCreateExprWithCleanups(E);
2080   }
2081 
2082   getCurFunction()->setHasIndirectGoto();
2083 
2084   return Owned(new (Context) IndirectGotoStmt(GotoLoc, StarLoc, E));
2085 }
2086 
2087 StmtResult
ActOnContinueStmt(SourceLocation ContinueLoc,Scope * CurScope)2088 Sema::ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope) {
2089   Scope *S = CurScope->getContinueParent();
2090   if (!S) {
2091     // C99 6.8.6.2p1: A break shall appear only in or as a loop body.
2092     return StmtError(Diag(ContinueLoc, diag::err_continue_not_in_loop));
2093   }
2094 
2095   return Owned(new (Context) ContinueStmt(ContinueLoc));
2096 }
2097 
2098 StmtResult
ActOnBreakStmt(SourceLocation BreakLoc,Scope * CurScope)2099 Sema::ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope) {
2100   Scope *S = CurScope->getBreakParent();
2101   if (!S) {
2102     // C99 6.8.6.3p1: A break shall appear only in or as a switch/loop body.
2103     return StmtError(Diag(BreakLoc, diag::err_break_not_in_loop_or_switch));
2104   }
2105 
2106   return Owned(new (Context) BreakStmt(BreakLoc));
2107 }
2108 
2109 /// \brief Determine whether the given expression is a candidate for
2110 /// copy elision in either a return statement or a throw expression.
2111 ///
2112 /// \param ReturnType If we're determining the copy elision candidate for
2113 /// a return statement, this is the return type of the function. If we're
2114 /// determining the copy elision candidate for a throw expression, this will
2115 /// be a NULL type.
2116 ///
2117 /// \param E The expression being returned from the function or block, or
2118 /// being thrown.
2119 ///
2120 /// \param AllowFunctionParameter Whether we allow function parameters to
2121 /// be considered NRVO candidates. C++ prohibits this for NRVO itself, but
2122 /// we re-use this logic to determine whether we should try to move as part of
2123 /// a return or throw (which does allow function parameters).
2124 ///
2125 /// \returns The NRVO candidate variable, if the return statement may use the
2126 /// NRVO, or NULL if there is no such candidate.
getCopyElisionCandidate(QualType ReturnType,Expr * E,bool AllowFunctionParameter)2127 const VarDecl *Sema::getCopyElisionCandidate(QualType ReturnType,
2128                                              Expr *E,
2129                                              bool AllowFunctionParameter) {
2130   QualType ExprType = E->getType();
2131   // - in a return statement in a function with ...
2132   // ... a class return type ...
2133   if (!ReturnType.isNull()) {
2134     if (!ReturnType->isRecordType())
2135       return 0;
2136     // ... the same cv-unqualified type as the function return type ...
2137     if (!Context.hasSameUnqualifiedType(ReturnType, ExprType))
2138       return 0;
2139   }
2140 
2141   // ... the expression is the name of a non-volatile automatic object
2142   // (other than a function or catch-clause parameter)) ...
2143   const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(E->IgnoreParens());
2144   if (!DR || DR->refersToEnclosingLocal())
2145     return 0;
2146   const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl());
2147   if (!VD)
2148     return 0;
2149 
2150   // ...object (other than a function or catch-clause parameter)...
2151   if (VD->getKind() != Decl::Var &&
2152       !(AllowFunctionParameter && VD->getKind() == Decl::ParmVar))
2153     return 0;
2154   if (VD->isExceptionVariable()) return 0;
2155 
2156   // ...automatic...
2157   if (!VD->hasLocalStorage()) return 0;
2158 
2159   // ...non-volatile...
2160   if (VD->getType().isVolatileQualified()) return 0;
2161   if (VD->getType()->isReferenceType()) return 0;
2162 
2163   // __block variables can't be allocated in a way that permits NRVO.
2164   if (VD->hasAttr<BlocksAttr>()) return 0;
2165 
2166   // Variables with higher required alignment than their type's ABI
2167   // alignment cannot use NRVO.
2168   if (VD->hasAttr<AlignedAttr>() &&
2169       Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VD->getType()))
2170     return 0;
2171 
2172   return VD;
2173 }
2174 
2175 /// \brief Perform the initialization of a potentially-movable value, which
2176 /// is the result of return value.
2177 ///
2178 /// This routine implements C++0x [class.copy]p33, which attempts to treat
2179 /// returned lvalues as rvalues in certain cases (to prefer move construction),
2180 /// then falls back to treating them as lvalues if that failed.
2181 ExprResult
PerformMoveOrCopyInitialization(const InitializedEntity & Entity,const VarDecl * NRVOCandidate,QualType ResultType,Expr * Value,bool AllowNRVO)2182 Sema::PerformMoveOrCopyInitialization(const InitializedEntity &Entity,
2183                                       const VarDecl *NRVOCandidate,
2184                                       QualType ResultType,
2185                                       Expr *Value,
2186                                       bool AllowNRVO) {
2187   // C++0x [class.copy]p33:
2188   //   When the criteria for elision of a copy operation are met or would
2189   //   be met save for the fact that the source object is a function
2190   //   parameter, and the object to be copied is designated by an lvalue,
2191   //   overload resolution to select the constructor for the copy is first
2192   //   performed as if the object were designated by an rvalue.
2193   ExprResult Res = ExprError();
2194   if (AllowNRVO &&
2195       (NRVOCandidate || getCopyElisionCandidate(ResultType, Value, true))) {
2196     ImplicitCastExpr AsRvalue(ImplicitCastExpr::OnStack,
2197                               Value->getType(), CK_NoOp, Value, VK_XValue);
2198 
2199     Expr *InitExpr = &AsRvalue;
2200     InitializationKind Kind
2201       = InitializationKind::CreateCopy(Value->getLocStart(),
2202                                        Value->getLocStart());
2203     InitializationSequence Seq(*this, Entity, Kind, &InitExpr, 1);
2204 
2205     //   [...] If overload resolution fails, or if the type of the first
2206     //   parameter of the selected constructor is not an rvalue reference
2207     //   to the object's type (possibly cv-qualified), overload resolution
2208     //   is performed again, considering the object as an lvalue.
2209     if (Seq) {
2210       for (InitializationSequence::step_iterator Step = Seq.step_begin(),
2211            StepEnd = Seq.step_end();
2212            Step != StepEnd; ++Step) {
2213         if (Step->Kind != InitializationSequence::SK_ConstructorInitialization)
2214           continue;
2215 
2216         CXXConstructorDecl *Constructor
2217         = cast<CXXConstructorDecl>(Step->Function.Function);
2218 
2219         const RValueReferenceType *RRefType
2220           = Constructor->getParamDecl(0)->getType()
2221                                                  ->getAs<RValueReferenceType>();
2222 
2223         // If we don't meet the criteria, break out now.
2224         if (!RRefType ||
2225             !Context.hasSameUnqualifiedType(RRefType->getPointeeType(),
2226                             Context.getTypeDeclType(Constructor->getParent())))
2227           break;
2228 
2229         // Promote "AsRvalue" to the heap, since we now need this
2230         // expression node to persist.
2231         Value = ImplicitCastExpr::Create(Context, Value->getType(),
2232                                          CK_NoOp, Value, 0, VK_XValue);
2233 
2234         // Complete type-checking the initialization of the return type
2235         // using the constructor we found.
2236         Res = Seq.Perform(*this, Entity, Kind, MultiExprArg(&Value, 1));
2237       }
2238     }
2239   }
2240 
2241   // Either we didn't meet the criteria for treating an lvalue as an rvalue,
2242   // above, or overload resolution failed. Either way, we need to try
2243   // (again) now with the return value expression as written.
2244   if (Res.isInvalid())
2245     Res = PerformCopyInitialization(Entity, SourceLocation(), Value);
2246 
2247   return Res;
2248 }
2249 
2250 /// ActOnCapScopeReturnStmt - Utility routine to type-check return statements
2251 /// for capturing scopes.
2252 ///
2253 StmtResult
ActOnCapScopeReturnStmt(SourceLocation ReturnLoc,Expr * RetValExp)2254 Sema::ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
2255   // If this is the first return we've seen, infer the return type.
2256   // [expr.prim.lambda]p4 in C++11; block literals follow a superset of those
2257   // rules which allows multiple return statements.
2258   CapturingScopeInfo *CurCap = cast<CapturingScopeInfo>(getCurFunction());
2259   QualType FnRetType = CurCap->ReturnType;
2260 
2261   // For blocks/lambdas with implicit return types, we check each return
2262   // statement individually, and deduce the common return type when the block
2263   // or lambda is completed.
2264   if (CurCap->HasImplicitReturnType) {
2265     if (RetValExp && !isa<InitListExpr>(RetValExp)) {
2266       ExprResult Result = DefaultFunctionArrayLvalueConversion(RetValExp);
2267       if (Result.isInvalid())
2268         return StmtError();
2269       RetValExp = Result.take();
2270 
2271       if (!RetValExp->isTypeDependent())
2272         FnRetType = RetValExp->getType();
2273       else
2274         FnRetType = CurCap->ReturnType = Context.DependentTy;
2275     } else {
2276       if (RetValExp) {
2277         // C++11 [expr.lambda.prim]p4 bans inferring the result from an
2278         // initializer list, because it is not an expression (even
2279         // though we represent it as one). We still deduce 'void'.
2280         Diag(ReturnLoc, diag::err_lambda_return_init_list)
2281           << RetValExp->getSourceRange();
2282       }
2283 
2284       FnRetType = Context.VoidTy;
2285     }
2286 
2287     // Although we'll properly infer the type of the block once it's completed,
2288     // make sure we provide a return type now for better error recovery.
2289     if (CurCap->ReturnType.isNull())
2290       CurCap->ReturnType = FnRetType;
2291   }
2292   assert(!FnRetType.isNull());
2293 
2294   if (BlockScopeInfo *CurBlock = dyn_cast<BlockScopeInfo>(CurCap)) {
2295     if (CurBlock->FunctionType->getAs<FunctionType>()->getNoReturnAttr()) {
2296       Diag(ReturnLoc, diag::err_noreturn_block_has_return_expr);
2297       return StmtError();
2298     }
2299   } else {
2300     LambdaScopeInfo *LSI = cast<LambdaScopeInfo>(CurCap);
2301     if (LSI->CallOperator->getType()->getAs<FunctionType>()->getNoReturnAttr()){
2302       Diag(ReturnLoc, diag::err_noreturn_lambda_has_return_expr);
2303       return StmtError();
2304     }
2305   }
2306 
2307   // Otherwise, verify that this result type matches the previous one.  We are
2308   // pickier with blocks than for normal functions because we don't have GCC
2309   // compatibility to worry about here.
2310   const VarDecl *NRVOCandidate = 0;
2311   if (FnRetType->isDependentType()) {
2312     // Delay processing for now.  TODO: there are lots of dependent
2313     // types we can conclusively prove aren't void.
2314   } else if (FnRetType->isVoidType()) {
2315     if (RetValExp && !isa<InitListExpr>(RetValExp) &&
2316         !(getLangOpts().CPlusPlus &&
2317           (RetValExp->isTypeDependent() ||
2318            RetValExp->getType()->isVoidType()))) {
2319       if (!getLangOpts().CPlusPlus &&
2320           RetValExp->getType()->isVoidType())
2321         Diag(ReturnLoc, diag::ext_return_has_void_expr) << "literal" << 2;
2322       else {
2323         Diag(ReturnLoc, diag::err_return_block_has_expr);
2324         RetValExp = 0;
2325       }
2326     }
2327   } else if (!RetValExp) {
2328     return StmtError(Diag(ReturnLoc, diag::err_block_return_missing_expr));
2329   } else if (!RetValExp->isTypeDependent()) {
2330     // we have a non-void block with an expression, continue checking
2331 
2332     // C99 6.8.6.4p3(136): The return statement is not an assignment. The
2333     // overlap restriction of subclause 6.5.16.1 does not apply to the case of
2334     // function return.
2335 
2336     // In C++ the return statement is handled via a copy initialization.
2337     // the C version of which boils down to CheckSingleAssignmentConstraints.
2338     NRVOCandidate = getCopyElisionCandidate(FnRetType, RetValExp, false);
2339     InitializedEntity Entity = InitializedEntity::InitializeResult(ReturnLoc,
2340                                                                    FnRetType,
2341                                                           NRVOCandidate != 0);
2342     ExprResult Res = PerformMoveOrCopyInitialization(Entity, NRVOCandidate,
2343                                                      FnRetType, RetValExp);
2344     if (Res.isInvalid()) {
2345       // FIXME: Cleanup temporaries here, anyway?
2346       return StmtError();
2347     }
2348     RetValExp = Res.take();
2349     CheckReturnStackAddr(RetValExp, FnRetType, ReturnLoc);
2350   }
2351 
2352   if (RetValExp) {
2353     CheckImplicitConversions(RetValExp, ReturnLoc);
2354     RetValExp = MaybeCreateExprWithCleanups(RetValExp);
2355   }
2356   ReturnStmt *Result = new (Context) ReturnStmt(ReturnLoc, RetValExp,
2357                                                 NRVOCandidate);
2358 
2359   // If we need to check for the named return value optimization,
2360   // or if we need to infer the return type,
2361   // save the return statement in our scope for later processing.
2362   if (CurCap->HasImplicitReturnType ||
2363       (getLangOpts().CPlusPlus && FnRetType->isRecordType() &&
2364        !CurContext->isDependentContext()))
2365     FunctionScopes.back()->Returns.push_back(Result);
2366 
2367   return Owned(Result);
2368 }
2369 
2370 StmtResult
ActOnReturnStmt(SourceLocation ReturnLoc,Expr * RetValExp)2371 Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
2372   // Check for unexpanded parameter packs.
2373   if (RetValExp && DiagnoseUnexpandedParameterPack(RetValExp))
2374     return StmtError();
2375 
2376   if (isa<CapturingScopeInfo>(getCurFunction()))
2377     return ActOnCapScopeReturnStmt(ReturnLoc, RetValExp);
2378 
2379   QualType FnRetType;
2380   QualType RelatedRetType;
2381   if (const FunctionDecl *FD = getCurFunctionDecl()) {
2382     FnRetType = FD->getResultType();
2383     if (FD->hasAttr<NoReturnAttr>() ||
2384         FD->getType()->getAs<FunctionType>()->getNoReturnAttr())
2385       Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr)
2386         << FD->getDeclName();
2387   } else if (ObjCMethodDecl *MD = getCurMethodDecl()) {
2388     FnRetType = MD->getResultType();
2389     if (MD->hasRelatedResultType() && MD->getClassInterface()) {
2390       // In the implementation of a method with a related return type, the
2391       // type used to type-check the validity of return statements within the
2392       // method body is a pointer to the type of the class being implemented.
2393       RelatedRetType = Context.getObjCInterfaceType(MD->getClassInterface());
2394       RelatedRetType = Context.getObjCObjectPointerType(RelatedRetType);
2395     }
2396   } else // If we don't have a function/method context, bail.
2397     return StmtError();
2398 
2399   ReturnStmt *Result = 0;
2400   if (FnRetType->isVoidType()) {
2401     if (RetValExp) {
2402       if (isa<InitListExpr>(RetValExp)) {
2403         // We simply never allow init lists as the return value of void
2404         // functions. This is compatible because this was never allowed before,
2405         // so there's no legacy code to deal with.
2406         NamedDecl *CurDecl = getCurFunctionOrMethodDecl();
2407         int FunctionKind = 0;
2408         if (isa<ObjCMethodDecl>(CurDecl))
2409           FunctionKind = 1;
2410         else if (isa<CXXConstructorDecl>(CurDecl))
2411           FunctionKind = 2;
2412         else if (isa<CXXDestructorDecl>(CurDecl))
2413           FunctionKind = 3;
2414 
2415         Diag(ReturnLoc, diag::err_return_init_list)
2416           << CurDecl->getDeclName() << FunctionKind
2417           << RetValExp->getSourceRange();
2418 
2419         // Drop the expression.
2420         RetValExp = 0;
2421       } else if (!RetValExp->isTypeDependent()) {
2422         // C99 6.8.6.4p1 (ext_ since GCC warns)
2423         unsigned D = diag::ext_return_has_expr;
2424         if (RetValExp->getType()->isVoidType())
2425           D = diag::ext_return_has_void_expr;
2426         else {
2427           ExprResult Result = Owned(RetValExp);
2428           Result = IgnoredValueConversions(Result.take());
2429           if (Result.isInvalid())
2430             return StmtError();
2431           RetValExp = Result.take();
2432           RetValExp = ImpCastExprToType(RetValExp,
2433                                         Context.VoidTy, CK_ToVoid).take();
2434         }
2435 
2436         // return (some void expression); is legal in C++.
2437         if (D != diag::ext_return_has_void_expr ||
2438             !getLangOpts().CPlusPlus) {
2439           NamedDecl *CurDecl = getCurFunctionOrMethodDecl();
2440 
2441           int FunctionKind = 0;
2442           if (isa<ObjCMethodDecl>(CurDecl))
2443             FunctionKind = 1;
2444           else if (isa<CXXConstructorDecl>(CurDecl))
2445             FunctionKind = 2;
2446           else if (isa<CXXDestructorDecl>(CurDecl))
2447             FunctionKind = 3;
2448 
2449           Diag(ReturnLoc, D)
2450             << CurDecl->getDeclName() << FunctionKind
2451             << RetValExp->getSourceRange();
2452         }
2453       }
2454 
2455       if (RetValExp) {
2456         CheckImplicitConversions(RetValExp, ReturnLoc);
2457         RetValExp = MaybeCreateExprWithCleanups(RetValExp);
2458       }
2459     }
2460 
2461     Result = new (Context) ReturnStmt(ReturnLoc, RetValExp, 0);
2462   } else if (!RetValExp && !FnRetType->isDependentType()) {
2463     unsigned DiagID = diag::warn_return_missing_expr;  // C90 6.6.6.4p4
2464     // C99 6.8.6.4p1 (ext_ since GCC warns)
2465     if (getLangOpts().C99) DiagID = diag::ext_return_missing_expr;
2466 
2467     if (FunctionDecl *FD = getCurFunctionDecl())
2468       Diag(ReturnLoc, DiagID) << FD->getIdentifier() << 0/*fn*/;
2469     else
2470       Diag(ReturnLoc, DiagID) << getCurMethodDecl()->getDeclName() << 1/*meth*/;
2471     Result = new (Context) ReturnStmt(ReturnLoc);
2472   } else {
2473     const VarDecl *NRVOCandidate = 0;
2474     if (!FnRetType->isDependentType() && !RetValExp->isTypeDependent()) {
2475       // we have a non-void function with an expression, continue checking
2476 
2477       if (!RelatedRetType.isNull()) {
2478         // If we have a related result type, perform an extra conversion here.
2479         // FIXME: The diagnostics here don't really describe what is happening.
2480         InitializedEntity Entity =
2481             InitializedEntity::InitializeTemporary(RelatedRetType);
2482 
2483         ExprResult Res = PerformCopyInitialization(Entity, SourceLocation(),
2484                                                    RetValExp);
2485         if (Res.isInvalid()) {
2486           // FIXME: Cleanup temporaries here, anyway?
2487           return StmtError();
2488         }
2489         RetValExp = Res.takeAs<Expr>();
2490       }
2491 
2492       // C99 6.8.6.4p3(136): The return statement is not an assignment. The
2493       // overlap restriction of subclause 6.5.16.1 does not apply to the case of
2494       // function return.
2495 
2496       // In C++ the return statement is handled via a copy initialization,
2497       // the C version of which boils down to CheckSingleAssignmentConstraints.
2498       NRVOCandidate = getCopyElisionCandidate(FnRetType, RetValExp, false);
2499       InitializedEntity Entity = InitializedEntity::InitializeResult(ReturnLoc,
2500                                                                      FnRetType,
2501                                                             NRVOCandidate != 0);
2502       ExprResult Res = PerformMoveOrCopyInitialization(Entity, NRVOCandidate,
2503                                                        FnRetType, RetValExp);
2504       if (Res.isInvalid()) {
2505         // FIXME: Cleanup temporaries here, anyway?
2506         return StmtError();
2507       }
2508 
2509       RetValExp = Res.takeAs<Expr>();
2510       if (RetValExp)
2511         CheckReturnStackAddr(RetValExp, FnRetType, ReturnLoc);
2512     }
2513 
2514     if (RetValExp) {
2515       CheckImplicitConversions(RetValExp, ReturnLoc);
2516       RetValExp = MaybeCreateExprWithCleanups(RetValExp);
2517     }
2518     Result = new (Context) ReturnStmt(ReturnLoc, RetValExp, NRVOCandidate);
2519   }
2520 
2521   // If we need to check for the named return value optimization, save the
2522   // return statement in our scope for later processing.
2523   if (getLangOpts().CPlusPlus && FnRetType->isRecordType() &&
2524       !CurContext->isDependentContext())
2525     FunctionScopes.back()->Returns.push_back(Result);
2526 
2527   return Owned(Result);
2528 }
2529 
2530 StmtResult
ActOnObjCAtCatchStmt(SourceLocation AtLoc,SourceLocation RParen,Decl * Parm,Stmt * Body)2531 Sema::ActOnObjCAtCatchStmt(SourceLocation AtLoc,
2532                            SourceLocation RParen, Decl *Parm,
2533                            Stmt *Body) {
2534   VarDecl *Var = cast_or_null<VarDecl>(Parm);
2535   if (Var && Var->isInvalidDecl())
2536     return StmtError();
2537 
2538   return Owned(new (Context) ObjCAtCatchStmt(AtLoc, RParen, Var, Body));
2539 }
2540 
2541 StmtResult
ActOnObjCAtFinallyStmt(SourceLocation AtLoc,Stmt * Body)2542 Sema::ActOnObjCAtFinallyStmt(SourceLocation AtLoc, Stmt *Body) {
2543   return Owned(new (Context) ObjCAtFinallyStmt(AtLoc, Body));
2544 }
2545 
2546 StmtResult
ActOnObjCAtTryStmt(SourceLocation AtLoc,Stmt * Try,MultiStmtArg CatchStmts,Stmt * Finally)2547 Sema::ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try,
2548                          MultiStmtArg CatchStmts, Stmt *Finally) {
2549   if (!getLangOpts().ObjCExceptions)
2550     Diag(AtLoc, diag::err_objc_exceptions_disabled) << "@try";
2551 
2552   getCurFunction()->setHasBranchProtectedScope();
2553   unsigned NumCatchStmts = CatchStmts.size();
2554   return Owned(ObjCAtTryStmt::Create(Context, AtLoc, Try,
2555                                      CatchStmts.data(),
2556                                      NumCatchStmts,
2557                                      Finally));
2558 }
2559 
BuildObjCAtThrowStmt(SourceLocation AtLoc,Expr * Throw)2560 StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw) {
2561   if (Throw) {
2562     ExprResult Result = DefaultLvalueConversion(Throw);
2563     if (Result.isInvalid())
2564       return StmtError();
2565 
2566     Throw = MaybeCreateExprWithCleanups(Result.take());
2567     QualType ThrowType = Throw->getType();
2568     // Make sure the expression type is an ObjC pointer or "void *".
2569     if (!ThrowType->isDependentType() &&
2570         !ThrowType->isObjCObjectPointerType()) {
2571       const PointerType *PT = ThrowType->getAs<PointerType>();
2572       if (!PT || !PT->getPointeeType()->isVoidType())
2573         return StmtError(Diag(AtLoc, diag::error_objc_throw_expects_object)
2574                          << Throw->getType() << Throw->getSourceRange());
2575     }
2576   }
2577 
2578   return Owned(new (Context) ObjCAtThrowStmt(AtLoc, Throw));
2579 }
2580 
2581 StmtResult
ActOnObjCAtThrowStmt(SourceLocation AtLoc,Expr * Throw,Scope * CurScope)2582 Sema::ActOnObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw,
2583                            Scope *CurScope) {
2584   if (!getLangOpts().ObjCExceptions)
2585     Diag(AtLoc, diag::err_objc_exceptions_disabled) << "@throw";
2586 
2587   if (!Throw) {
2588     // @throw without an expression designates a rethrow (which much occur
2589     // in the context of an @catch clause).
2590     Scope *AtCatchParent = CurScope;
2591     while (AtCatchParent && !AtCatchParent->isAtCatchScope())
2592       AtCatchParent = AtCatchParent->getParent();
2593     if (!AtCatchParent)
2594       return StmtError(Diag(AtLoc, diag::error_rethrow_used_outside_catch));
2595   }
2596   return BuildObjCAtThrowStmt(AtLoc, Throw);
2597 }
2598 
2599 ExprResult
ActOnObjCAtSynchronizedOperand(SourceLocation atLoc,Expr * operand)2600 Sema::ActOnObjCAtSynchronizedOperand(SourceLocation atLoc, Expr *operand) {
2601   ExprResult result = DefaultLvalueConversion(operand);
2602   if (result.isInvalid())
2603     return ExprError();
2604   operand = result.take();
2605 
2606   // Make sure the expression type is an ObjC pointer or "void *".
2607   QualType type = operand->getType();
2608   if (!type->isDependentType() &&
2609       !type->isObjCObjectPointerType()) {
2610     const PointerType *pointerType = type->getAs<PointerType>();
2611     if (!pointerType || !pointerType->getPointeeType()->isVoidType())
2612       return Diag(atLoc, diag::error_objc_synchronized_expects_object)
2613                << type << operand->getSourceRange();
2614   }
2615 
2616   // The operand to @synchronized is a full-expression.
2617   return MaybeCreateExprWithCleanups(operand);
2618 }
2619 
2620 StmtResult
ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc,Expr * SyncExpr,Stmt * SyncBody)2621 Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, Expr *SyncExpr,
2622                                   Stmt *SyncBody) {
2623   // We can't jump into or indirect-jump out of a @synchronized block.
2624   getCurFunction()->setHasBranchProtectedScope();
2625   return Owned(new (Context) ObjCAtSynchronizedStmt(AtLoc, SyncExpr, SyncBody));
2626 }
2627 
2628 /// ActOnCXXCatchBlock - Takes an exception declaration and a handler block
2629 /// and creates a proper catch handler from them.
2630 StmtResult
ActOnCXXCatchBlock(SourceLocation CatchLoc,Decl * ExDecl,Stmt * HandlerBlock)2631 Sema::ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl,
2632                          Stmt *HandlerBlock) {
2633   // There's nothing to test that ActOnExceptionDecl didn't already test.
2634   return Owned(new (Context) CXXCatchStmt(CatchLoc,
2635                                           cast_or_null<VarDecl>(ExDecl),
2636                                           HandlerBlock));
2637 }
2638 
2639 StmtResult
ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc,Stmt * Body)2640 Sema::ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body) {
2641   getCurFunction()->setHasBranchProtectedScope();
2642   return Owned(new (Context) ObjCAutoreleasePoolStmt(AtLoc, Body));
2643 }
2644 
2645 namespace {
2646 
2647 class TypeWithHandler {
2648   QualType t;
2649   CXXCatchStmt *stmt;
2650 public:
TypeWithHandler(const QualType & type,CXXCatchStmt * statement)2651   TypeWithHandler(const QualType &type, CXXCatchStmt *statement)
2652   : t(type), stmt(statement) {}
2653 
2654   // An arbitrary order is fine as long as it places identical
2655   // types next to each other.
operator <(const TypeWithHandler & y) const2656   bool operator<(const TypeWithHandler &y) const {
2657     if (t.getAsOpaquePtr() < y.t.getAsOpaquePtr())
2658       return true;
2659     if (t.getAsOpaquePtr() > y.t.getAsOpaquePtr())
2660       return false;
2661     else
2662       return getTypeSpecStartLoc() < y.getTypeSpecStartLoc();
2663   }
2664 
operator ==(const TypeWithHandler & other) const2665   bool operator==(const TypeWithHandler& other) const {
2666     return t == other.t;
2667   }
2668 
getCatchStmt() const2669   CXXCatchStmt *getCatchStmt() const { return stmt; }
getTypeSpecStartLoc() const2670   SourceLocation getTypeSpecStartLoc() const {
2671     return stmt->getExceptionDecl()->getTypeSpecStartLoc();
2672   }
2673 };
2674 
2675 }
2676 
2677 /// ActOnCXXTryBlock - Takes a try compound-statement and a number of
2678 /// handlers and creates a try statement from them.
2679 StmtResult
ActOnCXXTryBlock(SourceLocation TryLoc,Stmt * TryBlock,MultiStmtArg RawHandlers)2680 Sema::ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock,
2681                        MultiStmtArg RawHandlers) {
2682   // Don't report an error if 'try' is used in system headers.
2683   if (!getLangOpts().CXXExceptions &&
2684       !getSourceManager().isInSystemHeader(TryLoc))
2685       Diag(TryLoc, diag::err_exceptions_disabled) << "try";
2686 
2687   unsigned NumHandlers = RawHandlers.size();
2688   assert(NumHandlers > 0 &&
2689          "The parser shouldn't call this if there are no handlers.");
2690   Stmt **Handlers = RawHandlers.data();
2691 
2692   SmallVector<TypeWithHandler, 8> TypesWithHandlers;
2693 
2694   for (unsigned i = 0; i < NumHandlers; ++i) {
2695     CXXCatchStmt *Handler = cast<CXXCatchStmt>(Handlers[i]);
2696     if (!Handler->getExceptionDecl()) {
2697       if (i < NumHandlers - 1)
2698         return StmtError(Diag(Handler->getLocStart(),
2699                               diag::err_early_catch_all));
2700 
2701       continue;
2702     }
2703 
2704     const QualType CaughtType = Handler->getCaughtType();
2705     const QualType CanonicalCaughtType = Context.getCanonicalType(CaughtType);
2706     TypesWithHandlers.push_back(TypeWithHandler(CanonicalCaughtType, Handler));
2707   }
2708 
2709   // Detect handlers for the same type as an earlier one.
2710   if (NumHandlers > 1) {
2711     llvm::array_pod_sort(TypesWithHandlers.begin(), TypesWithHandlers.end());
2712 
2713     TypeWithHandler prev = TypesWithHandlers[0];
2714     for (unsigned i = 1; i < TypesWithHandlers.size(); ++i) {
2715       TypeWithHandler curr = TypesWithHandlers[i];
2716 
2717       if (curr == prev) {
2718         Diag(curr.getTypeSpecStartLoc(),
2719              diag::warn_exception_caught_by_earlier_handler)
2720           << curr.getCatchStmt()->getCaughtType().getAsString();
2721         Diag(prev.getTypeSpecStartLoc(),
2722              diag::note_previous_exception_handler)
2723           << prev.getCatchStmt()->getCaughtType().getAsString();
2724       }
2725 
2726       prev = curr;
2727     }
2728   }
2729 
2730   getCurFunction()->setHasBranchProtectedScope();
2731 
2732   // FIXME: We should detect handlers that cannot catch anything because an
2733   // earlier handler catches a superclass. Need to find a method that is not
2734   // quadratic for this.
2735   // Neither of these are explicitly forbidden, but every compiler detects them
2736   // and warns.
2737 
2738   return Owned(CXXTryStmt::Create(Context, TryLoc, TryBlock,
2739                                   Handlers, NumHandlers));
2740 }
2741 
2742 StmtResult
ActOnSEHTryBlock(bool IsCXXTry,SourceLocation TryLoc,Stmt * TryBlock,Stmt * Handler)2743 Sema::ActOnSEHTryBlock(bool IsCXXTry,
2744                        SourceLocation TryLoc,
2745                        Stmt *TryBlock,
2746                        Stmt *Handler) {
2747   assert(TryBlock && Handler);
2748 
2749   getCurFunction()->setHasBranchProtectedScope();
2750 
2751   return Owned(SEHTryStmt::Create(Context,IsCXXTry,TryLoc,TryBlock,Handler));
2752 }
2753 
2754 StmtResult
ActOnSEHExceptBlock(SourceLocation Loc,Expr * FilterExpr,Stmt * Block)2755 Sema::ActOnSEHExceptBlock(SourceLocation Loc,
2756                           Expr *FilterExpr,
2757                           Stmt *Block) {
2758   assert(FilterExpr && Block);
2759 
2760   if(!FilterExpr->getType()->isIntegerType()) {
2761     return StmtError(Diag(FilterExpr->getExprLoc(),
2762                      diag::err_filter_expression_integral)
2763                      << FilterExpr->getType());
2764   }
2765 
2766   return Owned(SEHExceptStmt::Create(Context,Loc,FilterExpr,Block));
2767 }
2768 
2769 StmtResult
ActOnSEHFinallyBlock(SourceLocation Loc,Stmt * Block)2770 Sema::ActOnSEHFinallyBlock(SourceLocation Loc,
2771                            Stmt *Block) {
2772   assert(Block);
2773   return Owned(SEHFinallyStmt::Create(Context,Loc,Block));
2774 }
2775 
BuildMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,NestedNameSpecifierLoc QualifierLoc,DeclarationNameInfo NameInfo,Stmt * Nested)2776 StmtResult Sema::BuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2777                                             bool IsIfExists,
2778                                             NestedNameSpecifierLoc QualifierLoc,
2779                                             DeclarationNameInfo NameInfo,
2780                                             Stmt *Nested)
2781 {
2782   return new (Context) MSDependentExistsStmt(KeywordLoc, IsIfExists,
2783                                              QualifierLoc, NameInfo,
2784                                              cast<CompoundStmt>(Nested));
2785 }
2786 
2787 
ActOnMSDependentExistsStmt(SourceLocation KeywordLoc,bool IsIfExists,CXXScopeSpec & SS,UnqualifiedId & Name,Stmt * Nested)2788 StmtResult Sema::ActOnMSDependentExistsStmt(SourceLocation KeywordLoc,
2789                                             bool IsIfExists,
2790                                             CXXScopeSpec &SS,
2791                                             UnqualifiedId &Name,
2792                                             Stmt *Nested) {
2793   return BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2794                                     SS.getWithLocInContext(Context),
2795                                     GetNameFromUnqualifiedId(Name),
2796                                     Nested);
2797 }
2798