diff options
author | Jason Merrill <jason@redhat.com> | 2011-08-28 11:38:29 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-08-28 11:38:29 -0400 |
commit | e90abaa0a28ccc5581f5b7c7abc789c8fb84764c (patch) | |
tree | 66c53e1699feba9e99d474d7b0964f8cd338cec1 /gcc/cp/mangle.c | |
parent | 2aef967bc8e30972f0ddf792e6045d716078b55a (diff) | |
download | gcc-e90abaa0a28ccc5581f5b7c7abc789c8fb84764c.zip gcc-e90abaa0a28ccc5581f5b7c7abc789c8fb84764c.tar.gz gcc-e90abaa0a28ccc5581f5b7c7abc789c8fb84764c.tar.bz2 |
Core DR 342 PR c++/48582
Core DR 342
PR c++/48582
* pt.c (check_valid_ptrmem_cst_expr): A null member pointer value
is valid in C++11.
(convert_nontype_argument): Likewise. Implicitly convert nullptr
and do constant folding.
* mangle.c (write_template_arg_literal): Mangle null member
pointer values as 0.
* call.c (null_member_pointer_value_p): New.
* cp-tree.h: Declare it.
From-SVN: r178144
Diffstat (limited to 'gcc/cp/mangle.c')
-rw-r--r-- | gcc/cp/mangle.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 4c7cc79..1fcd999 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2762,29 +2762,34 @@ write_template_arg_literal (const tree value) write_char ('L'); write_type (TREE_TYPE (value)); - switch (TREE_CODE (value)) - { - case CONST_DECL: - write_integer_cst (DECL_INITIAL (value)); - break; + /* Write a null member pointer value as (type)0, regardless of its + real representation. */ + if (null_member_pointer_value_p (value)) + write_integer_cst (integer_zero_node); + else + switch (TREE_CODE (value)) + { + case CONST_DECL: + write_integer_cst (DECL_INITIAL (value)); + break; - case INTEGER_CST: - gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) - || integer_zerop (value) || integer_onep (value)); - write_integer_cst (value); - break; + case INTEGER_CST: + gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node) + || integer_zerop (value) || integer_onep (value)); + write_integer_cst (value); + break; - case REAL_CST: - write_real_cst (value); - break; + case REAL_CST: + write_real_cst (value); + break; - case STRING_CST: - sorry ("string literal in function template signature"); - break; + case STRING_CST: + sorry ("string literal in function template signature"); + break; - default: - gcc_unreachable (); - } + default: + gcc_unreachable (); + } write_char ('E'); } @@ -2845,7 +2850,8 @@ write_template_arg (tree node) /* A template appearing as a template arg is a template template arg. */ write_template_template_arg (node); else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST) - || (abi_version_at_least (2) && code == CONST_DECL)) + || (abi_version_at_least (2) && code == CONST_DECL) + || null_member_pointer_value_p (node)) write_template_arg_literal (node); else if (DECL_P (node)) { |