summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaTemplateDeduction.cpp6
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp10
2 files changed, 16 insertions, 0 deletions
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<InitListExpr>(Init);
if (InitList) {
+ // Notionally, we substitute std::initializer_list<T> for 'auto' and deduce
+ // against that. Such deduction only succeeds if removing cv-qualifiers and
+ // references results in std::initializer_list<T>.
+ if (!Type.getType().getNonReferenceType()->getAs<AutoType>())
+ return DAR_Failed;
+
for (unsigned i = 0, e = InitList->getNumInits(); i < e; ++i) {
if (DeduceTemplateArgumentsFromCallArgument(
*this, TemplateParamsSt.get(), TemplArg, InitList->getInit(i),
diff --git a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
index 01d498a5e95..9b8fadd2f52 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
@@ -337,3 +337,13 @@ namespace update_rbrace_loc_crash {
Explode<ContainsIncomplete, 4>([](int) {});
}
}
+
+namespace no_conversion_after_auto_list_deduction {
+ // We used to deduce 'auto' == 'std::initializer_list<X>' here, and then
+ // incorrectly accept the declaration of 'x'.
+ struct X { using T = std::initializer_list<X> X::*; operator T(); };
+ auto X::*x = { X() }; // expected-error {{from initializer list}}
+
+ struct Y { using T = std::initializer_list<Y>(*)(); operator T(); };
+ auto (*y)() = { Y() }; // expected-error {{from initializer list}}
+}
OpenPOWER on IntegriCloud