From 8c0672ff889f51799324cc4cb2a3f1b396768349 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 8 Mar 2011 12:30:36 -0500 Subject: [PATCH] re PR c++/47705 (internal compiler error: in convert_nontype_argument, at cp/pt.c:5006) PR c++/47705 * pt.c (convert_nontype_argument): Don't crash on non-pointer argument to pointer parameter. From-SVN: r170782 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 23 ++++++++++++++--------- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/template/nontype21.C | 7 +++++++ 4 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/nontype21.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 319bdf3d7a3..e99a53a67c3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-03-08 Jason Merrill + PR c++/47705 + * pt.c (convert_nontype_argument): Don't crash on non-pointer + argument to pointer parameter. + PR c++/45651 * pt.c (instantiate_decl): Don't clear DECL_INTERFACE_KNOWN on !TREE_PUBLIC decls. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 48f93822274..cda9df8d1be 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5369,15 +5369,20 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) qualification conversion. Let's strip everything. */ else if (TYPE_PTROBV_P (type)) { - STRIP_NOPS (expr); - gcc_assert (TREE_CODE (expr) == ADDR_EXPR); - gcc_assert (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE); - /* Skip the ADDR_EXPR only if it is part of the decay for - an array. Otherwise, it is part of the original argument - in the source code. */ - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == ARRAY_TYPE) - expr = TREE_OPERAND (expr, 0); - expr_type = TREE_TYPE (expr); + tree sub = expr; + STRIP_NOPS (sub); + if (TREE_CODE (sub) == ADDR_EXPR) + { + gcc_assert (TREE_CODE (TREE_TYPE (sub)) == POINTER_TYPE); + /* Skip the ADDR_EXPR only if it is part of the decay for + an array. Otherwise, it is part of the original argument + in the source code. */ + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (sub, 0))) == ARRAY_TYPE) + expr = TREE_OPERAND (sub, 0); + else + expr = sub; + expr_type = TREE_TYPE (expr); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 28caa917a72..bfc0e9d2e1b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-03-08 Jason Merrill + * g++.dg/template/nontype21.C: New. + * g++.dg/template/anon5.C: New. 2011-03-08 Jakub Jelinek diff --git a/gcc/testsuite/g++.dg/template/nontype21.C b/gcc/testsuite/g++.dg/template/nontype21.C new file mode 100644 index 00000000000..c0f53199b1b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype21.C @@ -0,0 +1,7 @@ +// PR c++/47705 + +template class Something { }; + +extern char const xyz; + +class SomethingElse:public Something { }; // { dg-error "const char *" } -- 2.30.2