summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-07 14:26:17 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-07 14:26:17 +0000
commitc402a6aea8853260579bf150f466c9b419f7832f (patch)
treeff3db190c5d351e227a045b4d841b76993ead96d
parent366fde1fe76948d07deb538545306109ac398c9f (diff)
downloadgcc-c402a6aea8853260579bf150f466c9b419f7832f.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204514 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/nullptr30.C40
-rw-r--r--gcc/varasm.c1
4 files changed, 51 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01d10e94a7d..5679435a343 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f6e735f9c23..b45c8f4defc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..3673999d884
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nullptr30.C
@@ -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);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index beafb558c9c..22269122993 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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))