From: Volker Reichelt Date: Wed, 16 Nov 2005 13:03:13 +0000 (+0000) Subject: backport: re PR c++/23797 (ICE on typename outside template) X-Git-Tag: releases/gcc-3.4.5~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f145af17fd78616cc6d424d2af241d1b619d481;p=thirdparty%2Fgcc.git backport: re PR c++/23797 (ICE on typename outside template) Backport from mainline: 2005-10-12 Nathan Sidwell PR c++/23797 * parser.c (cp_parser_functional_cast): Cope when TYPE is not a TYPE_DECL. Use dependent_type_p to check type. * pt.c (uses_template_parms_p): Use dependent_type_p for a TYPE_DECL. (type_dependent_expression_p): Assert we've not been given a TYPE_DECL. * g++.dg/parse/typename8.C: New test. * g++.dg/parse/typename9.C: Likewise. From-SVN: r107081 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 27bd94771911..7913b5fca257 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2005-11-16 Volker Reichelt + + Backport from mainline: + 2005-10-12 Nathan Sidwell + + PR c++/23797 + * parser.c (cp_parser_functional_cast): Cope when TYPE is not a + TYPE_DECL. Use dependent_type_p to check type. + * pt.c (uses_template_parms_p): Use dependent_type_p for a + TYPE_DECL. + (type_dependent_expression_p): Assert we've not been given a + TYPE_DECL. + 2005-11-15 Volker Reichelt PR c++/19253 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 70218f92f5ec..c52fa16a3003 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14614,8 +14614,10 @@ cp_parser_functional_cast (cp_parser* parser, tree type) cast = build_functional_cast (type, expression_list); /* [expr.const]/1: In an integral constant expression "only type conversions to integral or enumeration type can be used". */ - if (cast != error_mark_node && !type_dependent_expression_p (type) - && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (type))) + if (TREE_CODE (type) == TYPE_DECL) + type = TREE_TYPE (type); + if (cast != error_mark_node && !dependent_type_p (type) + && !INTEGRAL_OR_ENUMERATION_TYPE_P (type)) { if (cp_parser_non_integral_constant_expression (parser, "a call to a constructor")) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b877fbbe5eef..0e4a7b9d3461 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4805,6 +4805,8 @@ uses_template_parms (tree t) else if (TREE_CODE (t) == TREE_LIST) dependent_p = (uses_template_parms (TREE_VALUE (t)) || uses_template_parms (TREE_CHAIN (t))); + else if (TREE_CODE (t) == TYPE_DECL) + dependent_p = dependent_type_p (TREE_TYPE (t)); else if (DECL_P (t) || EXPR_P (t) || TREE_CODE (t) == TEMPLATE_PARM_INDEX @@ -12043,6 +12045,8 @@ type_dependent_expression_p (tree expression) abort (); } + my_friendly_assert (TREE_CODE (expression) != TYPE_DECL, 20051116); + return (dependent_type_p (TREE_TYPE (expression))); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b41dcceda451..dae4f0f59a04 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-11-16 Volker Reichelt + + PR c++/23797 + Backport from mainline: + * g++.dg/parse/typename8.C: New test. + * g++.dg/parse/typename9.C: Likewise. + 2005-11-15 Volker Reichelt Backport from mainline: diff --git a/gcc/testsuite/g++.dg/parse/typename8.C b/gcc/testsuite/g++.dg/parse/typename8.C new file mode 100644 index 000000000000..e8e762709b4b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename8.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 + +// PR 23797:ICE +// Origin: Volker Reichelt + +// { dg-options "-fpermissive -w" } + +struct A { typedef int X; }; + +int i = typename A::X(); diff --git a/gcc/testsuite/g++.dg/parse/typename9.C b/gcc/testsuite/g++.dg/parse/typename9.C new file mode 100644 index 000000000000..aa72cd6c5849 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename9.C @@ -0,0 +1,3 @@ +struct A { typedef int X; }; + +int i = typename A::X(); // { dg-error "typename" }