]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
DR 1423 PR c++/52174
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 3 Jun 2014 17:48:36 +0000 (17:48 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 3 Jun 2014 17:48:36 +0000 (17:48 +0000)
gcc/cp
2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

DR 1423
PR c++/52174
* call.c (standard_conversion): Convert nullptr to bool only
in case of direct-initialization.
(convert_like_real): Provide informative error message.

gcc/testsuite
2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

DR 1423
PR c++/52174
* g++.dg/cpp0x/nullptr31.C: New.
* g++.dg/cpp0x/sfinae-nullptr1.C: Likewise.
* g++.dg/cpp0x/nullptr17.C: Update.

libstdc++-v3
2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>

DR 1423
PR c++/52174
* testsuite/20_util/is_assignable/value.cc: Update.

From-SVN: r211195

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/nullptr17.C
gcc/testsuite/g++.dg/cpp0x/nullptr31.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/sfinae-nullptr1.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/is_assignable/value.cc

index 2fa1549f963f3f4bbb91c9dde8b8fc384fa38b91..9a22842bf17e4bad21672b6f929989ff2451728b 100644 (file)
@@ -1,3 +1,11 @@
+2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       DR 1423
+       PR c++/52174
+       * call.c (standard_conversion): Convert nullptr to bool only
+       in case of direct-initialization.
+       (convert_like_real): Provide informative error message.
+
 2014-06-03  Marek Polacek  <polacek@redhat.com>
 
        PR c/60439
index b60bab775cdd0ad5547bf8f0ac388e92a8995874..75a6a4acc29e56b406f818818d9e6fd413ba640c 100644 (file)
@@ -1311,10 +1311,10 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
     {
       /* [conv.bool]
 
-         An rvalue of arithmetic, unscoped enumeration, pointer, or
-         pointer to member type can be converted to an rvalue of type
-         bool. ... An rvalue of type std::nullptr_t can be converted
-         to an rvalue of type bool;  */
+         A prvalue of arithmetic, unscoped enumeration, pointer, or pointer
+         to member type can be converted to a prvalue of type bool. ...
+         For direct-initialization (8.5 [dcl.init]), a prvalue of type
+         std::nullptr_t can be converted to a prvalue of type bool;  */
       if (ARITHMETIC_TYPE_P (from)
          || UNSCOPED_ENUM_P (from)
          || fcode == POINTER_TYPE
@@ -1328,6 +1328,8 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
                  && conv->rank < cr_pbool)
              || NULLPTR_TYPE_P (from))
            conv->rank = cr_pbool;
+         if (NULLPTR_TYPE_P (from) && (flags & LOOKUP_ONLYCONVERTING))
+           conv->bad_p = true;
          return conv;
        }
 
@@ -6062,6 +6064,14 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
            expr = CONSTRUCTOR_ELT (expr, 0)->value;
        }
 
+      /* Give a helpful error if this is bad because a conversion to bool
+        from std::nullptr_t requires direct-initialization.  */
+      if (NULLPTR_TYPE_P (TREE_TYPE (expr))
+         && TREE_CODE (totype) == BOOLEAN_TYPE)
+       complained = permerror (loc, "converting to %qT from %qT requires "
+                               "direct-initialization",
+                               totype, TREE_TYPE (expr));
+
       for (; t ; t = next_conversion (t))
        {
          if (t->kind == ck_user && t->cand->reason)
index c409d99f21117128c0e22d4100a6be2aa3e96dd1..d3af1482b17126516e387a00e0161d1de57ad4ba 100644 (file)
@@ -1,3 +1,11 @@
+2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       DR 1423
+       PR c++/52174
+       * g++.dg/cpp0x/nullptr31.C: New.
+       * g++.dg/cpp0x/sfinae-nullptr1.C: Likewise.
+       * g++.dg/cpp0x/nullptr17.C: Update.
+
 2014-06-03  Marek Polacek  <polacek@redhat.com>
 
        PR c/60439
index 96fea44b2288bcaa1f342db8e64c4277058bb0d0..616cd67581fcb597c9cfdc7ba3fae31a7277a66c 100644 (file)
@@ -1,6 +1,7 @@
 // { dg-do compile { target c++11 } }
 
-// Test that bool is a better overload match than int
+// Used to test that bool is a better overload match than int
+// Updated for DR 1423
 
 template <typename T, typename U> struct tType_equal;
 template <typename T> struct tType_equal<T, T> { typedef void type; };
@@ -16,7 +17,7 @@ bool i( bool );
 void test_i()
 {
   // Overload to bool, not int
-  type_equal<bool>(i(nullptr));
+  type_equal<bool>(i(nullptr));  // { dg-error "direct" }
   decltype(nullptr) mynull = 0;
-  type_equal<bool>(i(mynull));
+  type_equal<bool>(i(mynull));   // { dg-error "direct" }
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr31.C b/gcc/testsuite/g++.dg/cpp0x/nullptr31.C
new file mode 100644 (file)
index 0000000..01b8339
--- /dev/null
@@ -0,0 +1,11 @@
+// DR 1423, PR c++/52174
+// { dg-do compile { target c++11 } }
+
+bool b1 = nullptr;  // { dg-error "direct" }
+
+bool b2(nullptr);
+bool b3{nullptr};
+
+int  i1 = nullptr;  // { dg-error "cannot convert" }
+int  i2(nullptr);   // { dg-error "cannot convert" }
+int  i3{nullptr};   // { dg-error "cannot convert" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae-nullptr1.C b/gcc/testsuite/g++.dg/cpp0x/sfinae-nullptr1.C
new file mode 100644 (file)
index 0000000..7f3c5c4
--- /dev/null
@@ -0,0 +1,18 @@
+// DR 1423, PR c++/52174
+// { dg-do compile { target c++11 } }
+
+template<class T>
+T&& make();
+
+template<class T>
+void sink(T);
+
+template<class T1, class T2,
+  class = decltype(sink<T2>(make<T1>()))
+>
+auto f(int) -> char(&)[1];
+
+template<class, class>
+auto f(...) -> char(&)[2];
+
+static_assert(sizeof(f<decltype(nullptr), bool>(0)) != 1, "");
index df15a78672c4eb617a278d0c22b8594249334533..976ce975736573a5956f1021a91b67b4ed5b341e 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       DR 1423
+       PR c++/52174
+       * testsuite/20_util/is_assignable/value.cc: Update.
+
 2014-06-02  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/std/condition_variable (condition_variable_any::_Unlock): Do
index ddd73b48b9a0720661f86add779bad0722dd4b5f..e9db58e6d1618099755b6d5538252dd48fb1b644 100644 (file)
@@ -174,7 +174,7 @@ static_assert(!std::is_assignable<bool&, SE>::value, "Error");
 static_assert(std::is_assignable<bool&, void*>::value, "Error");
 static_assert(std::is_assignable<bool&, int B::*>::value, "Error");
 static_assert(std::is_assignable<bool&, void*>::value, "Error");
-static_assert(std::is_assignable<bool&, std::nullptr_t>::value, "Error");
+static_assert(!std::is_assignable<bool&, std::nullptr_t>::value, "Error");
 
 static_assert(std::is_assignable<std::nullptr_t&,
 std::nullptr_t>::value, "Error");