From 1d7a22e6a9660e6d3c660acd01ab2ee1c0e61290 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 9 Nov 2011 17:53:12 +0000 Subject: [PATCH] * pt.c (convert_nontype_argument): Only integral arguments get early folding. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181219 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 22 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c97553092de..095f671f51e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-11-09 Jason Merrill + * pt.c (convert_nontype_argument): Only integral arguments + get early folding. + * parser.c (cp_parser_alias_declaration): Don't do semantic processing if parsing failed. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e53e90ffbed..a804fda494a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5681,10 +5681,24 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) && (TYPE_PTR_P (type) || TYPE_PTR_TO_MEMBER_P (type))) expr = convert (type, expr); - /* In C++11, non-type template arguments can be arbitrary constant - expressions. But don't fold a PTRMEM_CST to a CONSTRUCTOR yet. */ - if (cxx_dialect >= cxx0x && TREE_CODE (expr) != PTRMEM_CST) - expr = maybe_constant_value (expr); + /* In C++11, integral or enumeration non-type template arguments can be + arbitrary constant expressions. Pointer and pointer to + member arguments can be general constant expressions that evaluate + to a null value, but otherwise still need to be of a specific form. */ + if (cxx_dialect >= cxx0x) + { + if (INTEGRAL_OR_ENUMERATION_TYPE_P (type)) + expr = maybe_constant_value (expr); + else if (TYPE_PTR_P (type) + || (TYPE_PTR_TO_MEMBER_P (type) + && TREE_CODE (expr) != PTRMEM_CST)) + { + tree folded = maybe_constant_value (expr); + if (TYPE_PTR_P (type) ? integer_zerop (folded) + : null_member_pointer_value_p (folded)) + expr = folded; + } + } /* HACK: Due to double coercion, we can get a NOP_EXPR(ADDR_EXPR (arg)) here, -- 2.11.0