re PR c++/51379 ([C++0x] [DR 799] reinterpret_cast is not particularly useful)
authorPaolo Carlini <paolo@gcc.gnu.org>
Sun, 1 Jan 2012 20:21:36 +0000 (20:21 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sun, 1 Jan 2012 20:21:36 +0000 (20:21 +0000)
/cp
2012-01-01  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51379
* typeck.c (build_reinterpret_cast_1): Implement resolution of
DR 799.

/testsuite
2012-01-01  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51379
* g++.dg/conversion/reinterpret4.C: New.
* g++.dg/conversion/reinterpret1.C: Adjust.

From-SVN: r182775

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/conversion/reinterpret1.C
gcc/testsuite/g++.dg/conversion/reinterpret4.C [new file with mode: 0644]

index 3d2c5de..b4a3df4 100644 (file)
@@ -1,4 +1,10 @@
-2011-12-31  Fabien Chêne  <fabien@gcc.gnu.org>
+2012-01-01  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51379
+       * typeck.c (build_reinterpret_cast_1): Implement resolution of
+       DR 799.
+
+2012-01-01  Fabien Chêne  <fabien@gcc.gnu.org>
 
        * parser.c (cp_parser_using_declaration): Add a warning about
        deprecated access declarations when no errors were encountered
index b168963..d9166c9 100644 (file)
@@ -6203,6 +6203,11 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
   else if (TYPE_PTR_P (type) && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))
     /* OK */
     ;
+  else if ((INTEGRAL_OR_ENUMERATION_TYPE_P (type)
+           || TYPE_PTR_P (type) || TYPE_PTR_TO_MEMBER_P (type))
+          && same_type_p (type, intype))
+    /* DR 799 */
+    return fold_if_not_in_template (build_nop (type, expr));
   else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
           || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
     return fold_if_not_in_template (build_nop (type, expr));
index b4c78d1..cfbef8d 100644 (file)
@@ -1,5 +1,11 @@
 2012-01-01  Paolo Carlini  <paolo.carlini@oracle.com>
 
+       PR c++/51379
+       * g++.dg/conversion/reinterpret4.C: New.
+       * g++.dg/conversion/reinterpret1.C: Adjust.
+
+2012-01-01  Paolo Carlini  <paolo.carlini@oracle.com>
+
        * g++.dg/cpp0x/constexpr-delegating2.C: Add missing piece.
 
 2012-01-01  Fabien Chêne  <fabien@gcc.gnu.org>
index d456782..aa55f6f 100644 (file)
@@ -3,4 +3,4 @@
 struct Y { Y(int &); };
 
 int v;
-Y y1(reinterpret_cast<int>(v));  // { dg-error "" }
+Y y1(reinterpret_cast<int>(v));
diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret4.C b/gcc/testsuite/g++.dg/conversion/reinterpret4.C
new file mode 100644 (file)
index 0000000..71575a1
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/51379
+
+unsigned long t1 = 1;
+unsigned long t2 = reinterpret_cast<unsigned long>(t1);