forked from OSchip/llvm-project
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:
parent
f86b5dc700
commit
0db1ea5f68
|
@ -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()) {
|
||||
|
|
|
@ -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}});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue