From c006d94230a09a466742fe90e2c0c58341f2da3c Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Thu, 23 Jan 2003 06:05:20 +0000 Subject: [PATCH] re PR c++/9354 ([New parser?] segfault in template definition) PR c++/9354 * init.c (build_new): Set the type of the new-expression, even when processing_templte_decl. PR c++/9216 * parser.c (cp_parser_primary_expression): Improve error message for templates used in an expression context. PR c++/8696 * parser.c (cp_parser_decl_specifier_seq): Commit to tentative parse when encountering "typedef". PR c++/9354 * g++.dg/parse/new1.C: New test. PR c++/9216 * g++.dg/parse/template2.C: New test. PR c++/9354 * g++.dg/parse/typedef2.C: New test. From-SVN: r61643 --- gcc/cp/ChangeLog | 14 ++++++++++++++ gcc/cp/init.c | 3 ++- gcc/cp/parser.c | 15 +++++++++++---- gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/g++.dg/parse/new1.C | 7 +++++++ gcc/testsuite/g++.dg/parse/template2.C | 7 +++++++ gcc/testsuite/g++.dg/parse/typedef2.C | 3 +++ 7 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/new1.C create mode 100644 gcc/testsuite/g++.dg/parse/template2.C create mode 100644 gcc/testsuite/g++.dg/parse/typedef2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 367111942b4..be97c508b19 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,17 @@ +2003-01-22 Mark Mitchell + + PR c++/9354 + * init.c (build_new): Set the type of the new-expression, even + when processing_templte_decl. + + PR c++/9216 + * parser.c (cp_parser_primary_expression): Improve error message + for templates used in an expression context. + + PR c++/8696 + * parser.c (cp_parser_decl_specifier_seq): Commit to tentative + parse when encountering "typedef". + 2003-01-22 Nathanael Nerode * class.c, parser.c: ANSIfy function definitions and declarations. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index c82251660b9..493f9b8e918 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2024,7 +2024,8 @@ build_new (placement, decl, init, use_global_new) else t = type; - rval = build_min_nt (NEW_EXPR, placement, t, init); + rval = build_min (NEW_EXPR, build_pointer_type (type), + placement, t, init); NEW_EXPR_USE_GLOBAL (rval) = use_global_new; return rval; } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8e5dc333403..4d809b81012 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2562,10 +2562,14 @@ cp_parser_primary_expression (cp_parser *parser, /* If we didn't find anything, or what we found was a type, then this wasn't really an id-expression. */ - if (TREE_CODE (decl) == TYPE_DECL - || TREE_CODE (decl) == NAMESPACE_DECL - || (TREE_CODE (decl) == TEMPLATE_DECL - && !DECL_FUNCTION_TEMPLATE_P (decl))) + if (TREE_CODE (decl) == TEMPLATE_DECL + && !DECL_FUNCTION_TEMPLATE_P (decl)) + { + cp_parser_error (parser, "missing template arguments"); + return error_mark_node; + } + else if (TREE_CODE (decl) == TYPE_DECL + || TREE_CODE (decl) == NAMESPACE_DECL) { cp_parser_error (parser, "expected primary-expression"); @@ -6582,6 +6586,9 @@ cp_parser_decl_specifier_seq (cp_parser* parser, cp_lexer_consume_token (parser->lexer); /* A constructor declarator cannot appear in a typedef. */ constructor_possible_p = false; + /* The "typedef" keyword can only occur in a declaration; we + may as well commit at this point. */ + cp_parser_commit_to_tentative_parse (parser); break; /* storage-class-specifier: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb0a778d25e..5dcd1d1bd60 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,14 @@ 2003-01-22 Mark Mitchell + PR c++/9354 + * g++.dg/parse/new1.C: New test. + + PR c++/9216 + * g++.dg/parse/template2.C: New test. + + PR c++/9354 + * g++.dg/parse/typedef2.C: New test. + PR c++/9328 * g++.dg/ext/typeof3.C: New test. diff --git a/gcc/testsuite/g++.dg/parse/new1.C b/gcc/testsuite/g++.dg/parse/new1.C new file mode 100644 index 00000000000..31dad773935 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new1.C @@ -0,0 +1,7 @@ +struct T; +T* manage(T* t); +template struct ObjectSlot0_ { + void create() { + void* tmp = manage(new T()); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template2.C b/gcc/testsuite/g++.dg/parse/template2.C new file mode 100644 index 00000000000..6689c8bfa1d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template2.C @@ -0,0 +1,7 @@ +namespace N { + template < typename T > class C : T {}; +} + +int main() { + N::C(); // { dg-error "template" } +} diff --git a/gcc/testsuite/g++.dg/parse/typedef2.C b/gcc/testsuite/g++.dg/parse/typedef2.C new file mode 100644 index 00000000000..3ae347d7542 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef2.C @@ -0,0 +1,3 @@ +template struct B { typedef typename T::X X; }; +template struct A { typedef B::X::Y Z; }; // { dg-error "" } + -- 2.30.2