On 08/02/2016 12:34 AM, Thomas Schwinge wrote:
Hi!

On Wed, 6 Jul 2016 16:20:44 -0600, Martin Sebor <mse...@gmail.com> wrote:
PR c++/60760 - arithmetic on null pointers should not be allowed in constant
   expressions
PR c++/71091 - constexpr reference bound to a null pointer dereference
    accepted

[...]
        * g++.dg/cpp0x/constexpr-cast.C: New test.

In x86_64 GNU/Linux testing, I see that one FAIL for the -m32 multilib:

     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++11  (test for errors, line 
10)
     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++11  (test for errors, line 
11)
     +PASS: g++.dg/cpp0x/constexpr-cast.C  -std=c++11  (test for errors, line 
24)
     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++11 (test for excess errors)
     +XFAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++11 bug c++/49171 (test for 
errors, line 8)
     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++14  (test for errors, line 
10)
     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++14  (test for errors, line 
11)
     +PASS: g++.dg/cpp0x/constexpr-cast.C  -std=c++14  (test for errors, line 
24)
     +FAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++14 (test for excess errors)
     +XFAIL: g++.dg/cpp0x/constexpr-cast.C  -std=c++14 bug c++/49171 (test for 
errors, line 8)
     +UNSUPPORTED: g++.dg/cpp0x/constexpr-cast.C  -std=c++98

     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:10:22: error: 
'reinterpret_cast<void*>(1)' is not a constant-expression
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:11:22: error: 
'reinterpret_cast<void*>(1u)' is not a constant-expression
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:24:26:   in 
constexpr expansion of 'f<int>()'
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:24:27: error: 
value '4u' of type 'int*' is not a constant expression

For the -m64 multilib, it looks as follows (all PASSes):

     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:10:47: error: 
value '1u' of type 'void*' is not a constant expression
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:11:22: error: 
'reinterpret_cast<void*>(1ul)' is not a constant-expression
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:24:26:   in 
constexpr expansion of 'f<int>()'
     [...]/source-gcc/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C:24:27: error: 
value '4u' of type 'int*' is not a constant expression

Thanks for pointing it out and for all the detail! I managed to run
into at least two problems with this change: one in the test assuming
that (void*)1 will appear in GCC diagnostics as 1ul, and another in
GCC due to the inconsistent spelling of "constant expression."  Some
errors hyphenate the words, others don't, and depending on which one
triggers a test that assumes one or the other will fail. Let me submit
a patch for this and CC you on it.

Martin


For reference:

--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-cast.C
@@ -0,0 +1,24 @@
+// Test to verify that evaluating reinterpret_cast is diagnosed in
+// constant expressions.
+// { dg-do compile { target c++11 } }
+
+int i;
+
+// The following is accepted due to bug 49171.
+constexpr void *q = reinterpret_cast<void*>(&i);    // { dg-error "" "bug 
c++/49171" { xfail *-*-*-* } }
+
+constexpr void *r0 = reinterpret_cast<void*>(1);    // { dg-error "not a constant 
expression" }
+constexpr void *r1 = reinterpret_cast<void*>(sizeof 'x');  // { dg-error 
".reinterpret_cast<void\\*>\\(1ul\\). is not a constant-expression" }
+
+template <class T>
+constexpr bool f ()
+{
+#if __cplusplus > 201103L
+  T *p = reinterpret_cast<T*>(sizeof (T));
+  return p;
+#else
+  return *reinterpret_cast<T*>(sizeof (T));
+#endif
+}
+
+constexpr bool b = f<int>();   // { dg-error "not a constant expression" }


Grüße
  Thomas


Reply via email to