diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-10-20 12:42:37 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-10-20 12:42:37 +0000 |
commit | 11325dcdbdad0d7744dd92d65174777555e8531e (patch) | |
tree | 3889a0af25f3e42e85de9eb3f6a37620a052feda /gcc | |
parent | adccacc41df4afbdaaa6a5b45364a51708e56088 (diff) | |
download | gcc-11325dcdbdad0d7744dd92d65174777555e8531e.zip gcc-11325dcdbdad0d7744dd92d65174777555e8531e.tar.gz gcc-11325dcdbdad0d7744dd92d65174777555e8531e.tar.bz2 |
PR c++/9781, c++/10583, c++/11862
PR c++/9781, c++/10583, c++/11862
* decl.c (cp_finish_decl): Exit immediately if decl is an
error_mark_node.
* pt.c (push_template_decl_real): Return error_mark_node for
invalid template declaration of variable.
* g++.dg/parse/crash13.C: New test.
From-SVN: r72701
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/decl.c | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/crash13.C | 22 |
5 files changed, 42 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 344083a..ca19a4b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-10-20 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9781, c++/10583, c++/11862 + * decl.c (cp_finish_decl): Exit immediately if decl is an + error_mark_node. + * pt.c (push_template_decl_real): Return error_mark_node for + invalid template declaration of variable. + 2003-10-18 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> PR c++/12495 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 227c773..8ca69d1 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4658,7 +4658,9 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) const char *asmspec = NULL; int was_readonly = 0; - if (! decl) + if (decl == error_mark_node) + return; + else if (! decl) { if (init) error ("assignment (not initialization) in declaration"); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 32b146f..3470193 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2690,7 +2690,10 @@ push_template_decl_real (tree decl, int is_friend) || TREE_CODE (decl) == FUNCTION_DECL) /* OK */; else - error ("template declaration of `%#D'", decl); + { + error ("template declaration of `%#D'", decl); + return error_mark_node; + } } /* Check to see that the rules regarding the use of default diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 533e98b..9617fc2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-10-20 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9781, c++/10583, c++/11862 + * g++.dg/parse/crash13.C: New test. + 2003-10-20 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> * gcc.dg/old-style-asm-1.c: Count jump_insns instead of labels. diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C new file mode 100644 index 0000000..d81b6a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash13.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/10583: ICE using template function with invalid signature. + +template <typename> +struct A +{ + struct B + {}; +}; + +template <typename T> +void func(A<T>::B* ) // { dg-error "variable|template|expression" } +{ // { dg-error ";" } +} + +int main() +{ + func<void>(0); // { dg-error "undeclared|expression|;" } +} |