From c8a32e5ed2aaf0ab7478ffbdd20dcea9e86509b3 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 5 Jan 2017 23:12:16 +0000 Subject: Fix bug where types other than 'cv auto', 'cv auto &', and 'cv auto &&' could incorrectly be deduced from an initializer list in pathological cases. llvm-svn: 291191 --- clang/lib/Sema/SemaTemplateDeduction.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'clang/lib') diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 043e5c37160..b79904c0a70 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -4127,6 +4127,12 @@ Sema::DeduceAutoType(TypeLoc Type, Expr *&Init, QualType &Result, InitListExpr *InitList = dyn_cast(Init); if (InitList) { + // Notionally, we substitute std::initializer_list for 'auto' and deduce + // against that. Such deduction only succeeds if removing cv-qualifiers and + // references results in std::initializer_list. + if (!Type.getType().getNonReferenceType()->getAs()) + return DAR_Failed; + for (unsigned i = 0, e = InitList->getNumInits(); i < e; ++i) { if (DeduceTemplateArgumentsFromCallArgument( *this, TemplateParamsSt.get(), TemplArg, InitList->getInit(i), -- cgit v1.2.3