]> granicus.if.org Git - clang/commitdiff
Single- and zero-element initializer lists to scalars are list-initializations. Fixes...
authorSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 28 Feb 2012 23:36:38 +0000 (23:36 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 28 Feb 2012 23:36:38 +0000 (23:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151666 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/SemaCXX/cxx0x-initializer-scalars.cpp

index dd781a86031ef26c62f904d1fdb377430f941e14..91e8defcd45f4def0126237ff4131d89180822bd 100644 (file)
@@ -4404,6 +4404,7 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
       Result.setStandard();
       Result.Standard.setAsIdentityConversion();
     }
+    Result.setListInitializationSequence();
     return Result;
   }
 
index 8d25443da8accb571db010b87e2f8ffa86af4657..91fbaad8b1e6672263975175f2d603c163c1aca7 100644 (file)
@@ -3,6 +3,38 @@
 struct one { char c[1]; };
 struct two { char c[2]; };
 
+namespace std {
+  typedef decltype(sizeof(int)) size_t;
+
+  // libc++'s implementation
+  template <class _E>
+  class initializer_list
+  {
+    const _E* __begin_;
+    size_t    __size_;
+
+    initializer_list(const _E* __b, size_t __s)
+      : __begin_(__b),
+        __size_(__s)
+    {}
+
+  public:
+    typedef _E        value_type;
+    typedef const _E& reference;
+    typedef const _E& const_reference;
+    typedef size_t    size_type;
+
+    typedef const _E* iterator;
+    typedef const _E* const_iterator;
+
+    initializer_list() : __begin_(nullptr), __size_(0) {}
+
+    size_t    size()  const {return __size_;}
+    const _E* begin() const {return __begin_;}
+    const _E* end()   const {return __begin_ + __size_;}
+  };
+}
+
 namespace integral {
 
   void initialization() {
@@ -65,3 +97,13 @@ namespace integral {
     new int({0});  // expected-error {{cannot initialize}}
   }
 }
+
+namespace PR12118 {
+  void test() {
+    one f(std::initializer_list<int>); 
+    two f(int); 
+
+    // to initializer_list is preferred
+    static_assert(sizeof(f({0})) == sizeof(one), "bad overload");
+  }
+}