diff options
author | Simon Martin <simartin@users.sourceforge.net> | 2007-03-28 21:06:01 +0000 |
---|---|---|
committer | Simon Martin <simartin@gcc.gnu.org> | 2007-03-28 21:06:01 +0000 |
commit | 71aea5f2e041c542c817a145644760fc0b2bb3d4 (patch) | |
tree | 99605bf354a1f0b3c7a0c7b9462dc8cd9e96aa4b /gcc | |
parent | 8975ae2285b74f05a4465e7a9c8c0bdf8cf300b1 (diff) | |
download | gcc-71aea5f2e041c542c817a145644760fc0b2bb3d4.zip gcc-71aea5f2e041c542c817a145644760fc0b2bb3d4.tar.gz gcc-71aea5f2e041c542c817a145644760fc0b2bb3d4.tar.bz2 |
re PR c++/29077 (Incorrect error message for destructor in wrong namespace)
2007-03-28 Simon Martin <simartin@users.sourceforge.net>
PR c++/29077
* decl.c (grokfndecl): Properly setup decl if it is a constructor or a
destructor.
From-SVN: r123312
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/constructor3.C | 14 |
4 files changed, 40 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a2a0f6e..4f2b061 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-03-28 Simon Martin <simartin@users.sourceforge.net> + + PR c++/29077 + * decl.c (grokfndecl): Properly setup decl if it is a constructor or a + destructor. + 2007-03-28 Douglas Gregor <doug.gregor@gmail.com> * parser.c (struct cp_parser): Update comment for diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index ce1c54f..0315f01 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5981,6 +5981,20 @@ grokfndecl (tree ctype, if (TYPE_VOLATILE (type)) TREE_THIS_VOLATILE (decl) = 1; + /* Setup decl according to sfk. */ + switch (sfk) + { + case sfk_constructor: + case sfk_copy_constructor: + DECL_CONSTRUCTOR_P (decl) = 1; + break; + case sfk_destructor: + DECL_DESTRUCTOR_P (decl) = 1; + break; + default: + break; + } + if (friendp && TREE_CODE (orig_declarator) == TEMPLATE_ID_EXPR) { @@ -6168,12 +6182,7 @@ grokfndecl (tree ctype, return decl; if (ctype != NULL_TREE) - { - if (sfk == sfk_constructor) - DECL_CONSTRUCTOR_P (decl) = 1; - - grokclassfn (ctype, decl, flags); - } + grokclassfn (ctype, decl, flags); decl = check_explicit_specialization (orig_declarator, decl, template_count, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3b28b3..9b5244e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-28 Simon Martin <simartin@users.sourceforge.net> + + PR c++/29077 + * g++.dg/parse/constructor3.C: New test. + 2007-03-28 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/thin_pointer.ad[sb]: New test. diff --git a/gcc/testsuite/g++.dg/parse/constructor3.C b/gcc/testsuite/g++.dg/parse/constructor3.C new file mode 100644 index 0000000..9a2e978 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor3.C @@ -0,0 +1,14 @@ +/* PR c++/29077 */ +/* { dg-do "compile" } */ + +class c { + c(); + c(const c&); + ~c(); +}; + +namespace m { + c::c() {} /* { dg-error "c::c" } */ + c::c(const c&) {} /* { dg-error "c::c" } */ + c::~c() {} /* { dg-error "c::~c" } */ +} |