diff options
| author | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-30 19:25:35 +0000 |
|---|---|---|
| committer | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-30 19:25:35 +0000 |
| commit | d1a830415bc7253235c90e0747a5f77fb3b76f08 (patch) | |
| tree | 64c05b95e57cc2cb919348d53b53f03970e9d25a /gcc | |
| parent | 5dc6ed539f4bf5f3c8c1cb29f66490460cd42405 (diff) | |
| download | ppe42-gcc-d1a830415bc7253235c90e0747a5f77fb3b76f08.tar.gz ppe42-gcc-d1a830415bc7253235c90e0747a5f77fb3b76f08.zip | |
gcc/cp/
2008-09-30 Simon Martin <simartin@users.sourceforge.net>
PR c++/37555
PR c++/37556
* decl.c (grokdeclarator): Set the type for typedefs to a
nested-name-specifier to error_mark_node.
gcc/testsuite/
2008-09-30 Simon Martin <simartin@users.sourceforge.net>
PR c++/37555
* g++.dg/parse/error32.C: New test.
PR c++/37556
* g++.dg/parse/error33.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140794 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/cp/decl.c | 4 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/parse/error32.C | 12 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/parse/error33.C | 16 |
5 files changed, 46 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5e5c742b355..0e8034307ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2008-09-30 Simon Martin <simartin@users.sourceforge.net> + + PR c++/37555 + PR c++/37556 + * decl.c (grokdeclarator): Set the type for typedefs to a + nested-name-specifier to error_mark_node. + 2008-09-30 Paolo Bonzini <bonzini@gnu.org> * parser.c (cp_parser_selection_statement): Implement here the diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 82e0bba649f..be28e788600 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8679,8 +8679,10 @@ grokdeclarator (const cp_declarator *declarator, decl = build_lang_decl (TYPE_DECL, unqualified_id, type); else decl = build_decl (TYPE_DECL, unqualified_id, type); - if (id_declarator && declarator->u.id.qualifying_scope) + if (id_declarator && declarator->u.id.qualifying_scope) { error ("%Jtypedef name may not be a nested-name-specifier", decl); + TREE_TYPE (decl) = error_mark_node; + } if (decl_context != FIELD) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe699e392fb..b027a4c7d93 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-09-30 Simon Martin <simartin@users.sourceforge.net> + + PR c++/37555 + * g++.dg/parse/error32.C: New test. + + PR c++/37556 + * g++.dg/parse/error33.C: New test. + 2008-09-30 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/37662 diff --git a/gcc/testsuite/g++.dg/parse/error32.C b/gcc/testsuite/g++.dg/parse/error32.C new file mode 100644 index 00000000000..aad961bcbe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error32.C @@ -0,0 +1,12 @@ +/* PR c++/37555 */ +/* { dg-do "compile" } */ + +struct A {}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested-name-specifier" } */ + +void foo() +{ + T t; + t; /* { dg-error "was not declared" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/error33.C b/gcc/testsuite/g++.dg/parse/error33.C new file mode 100644 index 00000000000..411dc920cc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error33.C @@ -0,0 +1,16 @@ +/* PR c++/37556 */ +/* { dg-do "compile" } */ + +struct A +{ + void foo(); +}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested" } */ + +void bar(T); /* { dg-error "too many arguments" } */ + +void baz() +{ + bar(&A::foo); /* { dg-error "at this point" } */ +} |

