diff options
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index ff1db821b6..dea01d5be2 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1570,6 +1570,33 @@ Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc, if (!D->hasLocalStorage()) return StmtError(Diag(D->getLocation(), diag::err_non_variable_decl_in_for)); + + // If the type contained 'auto', deduce the 'auto' to 'id'. + if (FirstType->getContainedAutoType()) { + TypeSourceInfo *DeducedType = 0; + OpaqueValueExpr OpaqueId(D->getLocation(), Context.getObjCIdType(), + VK_RValue); + Expr *DeducedInit = &OpaqueId; + if (DeduceAutoType(D->getTypeSourceInfo(), DeducedInit, DeducedType) + == DAR_Failed) { + DiagnoseAutoDeductionFailure(D, DeducedInit); + } + if (!DeducedType) { + D->setInvalidDecl(); + return StmtError(); + } + + D->setTypeSourceInfo(DeducedType); + D->setType(DeducedType->getType()); + FirstType = DeducedType->getType(); + + if (ActiveTemplateInstantiations.empty()) { + SourceLocation Loc = DeducedType->getTypeLoc().getBeginLoc(); + Diag(Loc, diag::warn_auto_var_is_id) + << D->getDeclName(); + } + } + } else { Expr *FirstE = cast<Expr>(First); if (!FirstE->isTypeDependent() && !FirstE->isLValue()) |