re PR c++/58176 (ICE in output_constant, at varasm.c:4658)
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 7 Nov 2013 14:26:17 +0000 (14:26 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 7 Nov 2013 14:26:17 +0000 (14:26 +0000)
2013-11-07  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58176
* varasm.c (output_constant): Handle NULLPTR_TYPE.

/testsuite
2013-11-07  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/58176
* g++.dg/cpp0x/nullptr30.C: New.

From-SVN: r204514

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/nullptr30.C [new file with mode: 0644]
gcc/varasm.c

index 01d10e9..5679435 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58176
+       * varasm.c (output_constant): Handle NULLPTR_TYPE.
+
 2013-11-07  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.c (ix86_expand_set_or_movmem): Don't set
index f6e735f..b45c8f4 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-07  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/58176
+       * g++.dg/cpp0x/nullptr30.C: New.
+
 2013-11-07  Yury Gribov  <y.gribov@samsung.com>
            Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr30.C b/gcc/testsuite/g++.dg/cpp0x/nullptr30.C
new file mode 100644 (file)
index 0000000..3673999
--- /dev/null
@@ -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 beafb55..2226912 100644 (file)
@@ -4685,6 +4685,7 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
     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))