From 1cd1f73f09c6ddcf01e3a287d6604cd705190d14 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 8 Apr 2013 18:25:02 +0000 Subject: [PATCH] Cope with deduced 'auto' in a C++11 for-range loop that is actually an Objective-C fast enumeration loop. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179035 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaStmt.cpp | 27 +++++++++++++++++++++++++++ test/SemaObjCXX/foreach.mm | 2 ++ 2 files changed, 29 insertions(+) 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(First); if (!FirstE->isTypeDependent() && !FirstE->isLValue()) diff --git a/test/SemaObjCXX/foreach.mm b/test/SemaObjCXX/foreach.mm index 3c4b908eab..ec6ed0550e 100644 --- a/test/SemaObjCXX/foreach.mm +++ b/test/SemaObjCXX/foreach.mm @@ -12,6 +12,8 @@ void f(NSArray *a) { // expected-warning {{expression result unused}} for (id thisKey : keys); + + for (auto thisKey : keys) { } // expected-warning{{'auto' deduced as 'id' in declaration of 'thisKey'}} } /* // rdar://9072298 */ -- 2.40.0