Fix overload resolution for the initialization of a multi-dimensional

array from a braced-init-list. There seems to be a core wording wart
here (it suggests we should be testing whether the elements of the init
list are implicitly convertible to the array element type, not whether
there is an implicit conversion sequence) but our prior behavior appears
to be a bug, not a deliberate effort to implement the standard as written.

llvm-svn: 169690
This commit is contained in:
Richard Smith 2012-12-09 06:48:56 +00:00
parent f86b5dc700
commit 0db1ea5f68
3 changed files with 19 additions and 2 deletions

View File

@ -4377,7 +4377,7 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
bool toStdInitializerList = false;
QualType X;
if (ToType->isArrayType())
X = S.Context.getBaseElementType(ToType);
X = S.Context.getAsArrayType(ToType)->getElementType();
else
toStdInitializerList = S.isStdInitializerList(ToType, &X);
if (!X.isNull()) {

View File

@ -115,4 +115,13 @@ namespace sub_constructor {
Aggr invalid { {} , {&ok1} , {0,0} }; // expected-error {{no matching constructor for initialization}}
NoDefaultConstructor2 array_ok[] = { {0,0} , {0,1} };
NoDefaultConstructor2 array_error[] = { {0,0} , {0} }; // expected-error {{no matching constructor for initialization}}
}
}
namespace multidimensional_array {
void g(const int (&)[2][2]) {}
void g(const int (&)[2][2][2]) = delete;
void h() {
g({{1,2},{3,4}});
}
}

View File

@ -191,3 +191,11 @@ namespace rdar11948732 {
namespace PR14272 {
auto x { { 0, 0 } }; // expected-error {{cannot deduce actual type for variable 'x' with type 'auto' from initializer list}}
}
namespace initlist_of_array {
void f(std::initializer_list<int[2]>) {}
void f(std::initializer_list<int[2][2]>) = delete;
void h() {
f({{1,2},{3,4}});
}
}