diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-12-06 04:59:55 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-12-06 04:59:55 +0000 |
commit | eeb23c11c0f58d2927f94cae3dac10848507420c (patch) | |
tree | d246e242b1f8237a1d1682441733732a069e218f | |
parent | 6a40fb21e1af1dc1eb1df6e4fa92dc3cbac15ac6 (diff) | |
download | gcc-eeb23c11c0f58d2927f94cae3dac10848507420c.zip gcc-eeb23c11c0f58d2927f94cae3dac10848507420c.tar.gz gcc-eeb23c11c0f58d2927f94cae3dac10848507420c.tar.bz2 |
re PR c++/13314 (ICE when omitting template parameter of a sub-class)
PR c++/13314
* emit-rtl.c (set_mem_attributes_minus_bitpos): Robustify.
PR c++/13314
* parser.c (cp_parser_class_specifier): Match push_scope/pop_scope
calls.
(cp_parser_class_head): Likewise.
PR c++/13314
* g++.dg/template/error7.C: New test.
From-SVN: r74359
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 9 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/error7.C | 6 |
6 files changed, 32 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9649c83..9cd85d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-12-05 Mark Mitchell <mark@codesourcery.com> + + PR c++/13314 + * emit-rtl.c (set_mem_attributes_minus_bitpos): Robustify. + 2003-12-05 Andrew Pinski <pinskia@physics.uc.edu> PR driver/13211 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6e2239b..39dd385d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-12-05 Mark Mitchell <mark@codesourcery.com> + + PR c++/13314 + * parser.c (cp_parser_class_specifier): Match push_scope/pop_scope + calls. + (cp_parser_class_head): Likewise. + 2003-12-05 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> PR c++/13166 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 5f1b473..97d3283 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -11447,6 +11447,8 @@ cp_parser_class_specifier (cp_parser* parser) parser->num_template_parameter_lists = 0; /* Start the class. */ + if (nested_name_specifier_p) + push_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (type))); type = begin_class_definition (type); if (type == error_mark_node) /* If the type is erroneous, skip the entire body of the class. */ @@ -11737,7 +11739,7 @@ cp_parser_class_head (cp_parser* parser, it is not, try to recover gracefully. */ if (at_namespace_scope_p () && parser->num_template_parameter_lists == 0 - && num_templates == 1) + && template_id_p) { error ("an explicit specialization must be preceded by 'template <>'"); invalid_explicit_specialization_p = true; @@ -11836,7 +11838,10 @@ cp_parser_class_head (cp_parser* parser, type = push_template_decl (type); type = TREE_TYPE (type); if (nested_name_specifier) - *nested_name_specifier_p = true; + { + *nested_name_specifier_p = true; + pop_scope (nested_name_specifier); + } } /* Indicate whether this class was declared as a `class' or as a `struct'. */ diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 0f7e677..8be71ae 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1826,6 +1826,8 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, return; type = TYPE_P (t) ? t : TREE_TYPE (t); + if (type == error_mark_node) + return; /* If we have already set DECL_RTL = ref, get_alias_set will get the wrong answer, as it assumes that DECL_RTL already has the right alias diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2000b1c..aba0ad3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-12-05 Mark Mitchell <mark@codesourcery.com> + + PR c++/13314 + * g++.dg/template/error7.C: New test. + 2003-12-05 Stuart Menefy <stuart.menefy@st.com> J"orn Rennecke <joern.rennecke@superh.com> diff --git a/gcc/testsuite/g++.dg/template/error7.C b/gcc/testsuite/g++.dg/template/error7.C new file mode 100644 index 0000000..3c1a0e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error7.C @@ -0,0 +1,6 @@ +// PR c++/13314 +// { dg-options "-O2" } + +struct A { template <int> struct B; }; +struct A::B {}; // { dg-error "" } +A::B<0> b; // { dg-error "" } |