diff options
| -rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/cp/parser.c | 5 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/template/crash18.C | 13 |
4 files changed, 28 insertions, 1 deletions
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 <giovannibajo@gcc.gnu.org> + + PR c++/15064 + * parser.c (cp_parser_postfix_expression): typeid operator cannot be + used in integral constant expressions. + 2004-04-22 Mark Mitchell <mark@codesourcery.com> * 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 <giovannibajo@gcc.gnu.org> + + PR c++/15064 + * g++.dg/template/crash18.C: New test. + 2004-04-22 Mark Mitchell <mark@codesourcery.com> * 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: <leif dot lonnblad at thep dot lu dot se> +// PR c++/15064: typeid does not form an integral constant expression + +#include <typeinfo> + +template <typename T> +void dummy() { + const std::type_info& t = typeid(T); + const std::type_info& t2 = typeid(float); +} + +template void dummy<int>(void); |
