diff options
author | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-04-23 12:57:19 +0000 |
---|---|---|
committer | Giovanni Bajo <giovannibajo@gcc.gnu.org> | 2004-04-23 12:57:19 +0000 |
commit | 4424e0da57fd1562550505beefc2b6b62a733701 (patch) | |
tree | f81ab6c5e87fac23e85d0194f742f571a89d6fa6 /gcc | |
parent | d0fd134432941620ac264dbd55096fdcef0361d6 (diff) | |
download | gcc-4424e0da57fd1562550505beefc2b6b62a733701.zip gcc-4424e0da57fd1562550505beefc2b6b62a733701.tar.gz gcc-4424e0da57fd1562550505beefc2b6b62a733701.tar.bz2 |
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
Diffstat (limited to 'gcc')
-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); |