[cfe-commits] r169690 - in /cfe/trunk: lib/Sema/SemaOverload.cpp test/SemaCXX/cxx0x-initializer-aggregates.cpp test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp

Richard Smith richard-llvm at metafoo.co.uk
Sat Dec 8 22:48:56 PST 2012


Author: rsmith
Date: Sun Dec  9 00:48:56 2012
New Revision: 169690

URL: http://llvm.org/viewvc/llvm-project?rev=169690&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Sema/SemaOverload.cpp
    cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp
    cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=169690&r1=169689&r2=169690&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Sun Dec  9 00:48:56 2012
@@ -4377,7 +4377,7 @@
   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()) {

Modified: cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp?rev=169690&r1=169689&r2=169690&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp Sun Dec  9 00:48:56 2012
@@ -115,4 +115,13 @@
   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}}
-}
\ No newline at end of file
+}
+
+namespace multidimensional_array {
+  void g(const int (&)[2][2]) {}
+  void g(const int (&)[2][2][2]) = delete;
+
+  void h() {
+    g({{1,2},{3,4}});
+  }
+}

Modified: cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp?rev=169690&r1=169689&r2=169690&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp Sun Dec  9 00:48:56 2012
@@ -191,3 +191,11 @@
 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}});
+  }
+}





More information about the cfe-commits mailing list