From: Giovanni Bajo Date: Fri, 23 Apr 2004 12:57:19 +0000 (+0000) Subject: re PR c++/15064 (typeid of template parameter gives ICE) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4424e0da57fd1562550505beefc2b6b62a733701;p=platform%2Fupstream%2Fgcc.git re PR c++/15064 (typeid of template parameter gives ICE) PR c++/15064 * parser.c (cp_parser_postfix_expression): typeid operator cannot be used in integral constant expressions. PR c++/15064 * g++.dg/template/crash18.C: New test. From-SVN: r81088 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f654b18..59402a0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-04-23 Giovanni Bajo + + PR c++/15064 + * parser.c (cp_parser_postfix_expression): typeid operator cannot be + used in integral constant expressions. + 2004-04-22 Mark Mitchell * init.c (build_aggr_init): Fix accidental use of C99 construct in diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0732a65..6fb8da5 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3594,7 +3594,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p) /* Look for the `)' token. */ cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"); } - + /* `typeid' may not appear in an integral constant expression. */ + if (cp_parser_non_integral_constant_expression(parser, + "`typeid' operator")) + return error_mark_node; /* Restore the saved message. */ parser->type_definition_forbidden_message = saved_message; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa479b4..b57694e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-04-23 Giovanni Bajo + + PR c++/15064 + * g++.dg/template/crash18.C: New test. + 2004-04-22 Mark Mitchell * g++.dg/ext/complit3.C: New test. diff --git a/gcc/testsuite/g++.dg/template/crash18.C b/gcc/testsuite/g++.dg/template/crash18.C new file mode 100644 index 0000000..5eb9292 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash18.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Contributed by: +// PR c++/15064: typeid does not form an integral constant expression + +#include + +template +void dummy() { + const std::type_info& t = typeid(T); + const std::type_info& t2 = typeid(float); +} + +template void dummy(void);