Patchwork [C++,Patch/RFC] PR 58176 (ICE with nullptr at -O0 in output_constant)

login
register
mail settings
Submitter Paolo Carlini
Date Nov. 7, 2013, 1:21 p.m.
Message ID <527B93BC.8020101@oracle.com>
Download mbox | patch
Permalink /patch/289330/
State New
Headers show

Comments

Paolo Carlini - Nov. 7, 2013, 1:21 p.m.
Hi,

at -O0 we ICE for this valid testcase in output_constant because 
NULLPTR_TYPE is not handled. Should I dig further because we never want 
nullptr to reach varasm? Because otherwise the patchlet works fine, I 
checked that expand_expr can cope perfectly well with NULLPTR_TYPE as 
TREE_TYPE of the INTEGER_CST (generally, we are already handling 
NULLPTR_TYPE in a number of places outside /cp)

Thanks,
Paolo.

////////////////////
Jason Merrill - Nov. 7, 2013, 2:01 p.m.
OK.

Patch

Index: testsuite/g++.dg/cpp0x/nullptr30.C
===================================================================
--- testsuite/g++.dg/cpp0x/nullptr30.C	(revision 0)
+++ testsuite/g++.dg/cpp0x/nullptr30.C	(working copy)
@@ -0,0 +1,40 @@ 
+// PR c++/58176
+// { dg-do compile { target c++11 } }
+
+// Nil
+struct nil_ { constexpr nil_ () {} };
+constexpr nil_ nil;
+
+// Cons
+template <class H, class T = nil_>
+struct cons_ {
+    using head_ = H;
+    using tail_ = T;
+
+    H head;
+    T tail;
+
+    constexpr cons_() {}
+    constexpr cons_(H const &h, T const &t) : head(h), tail(t) {}
+};
+template <class H, class T = nil_>
+constexpr cons_<H, T> cons (H const &h, T const &t = nil) { return
+cons_<H,T>(h,t); }
+
+// List
+template <class... T> struct list_s;
+template <class H, class... T>
+struct list_s<H, T...> {
+    using type = cons_<H, typename list_s<T...>::type>;
+};
+template <>
+struct list_s<> {
+    using type = nil_;
+};
+template <class... T>
+using list_ = typename list_s<T...>::type;
+constexpr nil_ list () { return nil; }
+template <class H, class... T>
+constexpr list_<H, T...> list (H h, T... t) { return cons(h, list(t...)); }
+
+constexpr auto l1 = list("monkey", 123.4, cons(1, 2), nullptr);
Index: varasm.c
===================================================================
--- varasm.c	(revision 204508)
+++ varasm.c	(working copy)
@@ -4685,6 +4685,7 @@  output_constant (tree exp, unsigned HOST_WIDE_INT
     case OFFSET_TYPE:
     case FIXED_POINT_TYPE:
     case POINTER_BOUNDS_TYPE:
+    case NULLPTR_TYPE:
       if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
 					   EXPAND_INITIALIZER),
 			      MIN (size, thissize), align, 0))