aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSimon Martin <simartin@users.sourceforge.net>2007-03-28 21:06:01 +0000
committerSimon Martin <simartin@gcc.gnu.org>2007-03-28 21:06:01 +0000
commit71aea5f2e041c542c817a145644760fc0b2bb3d4 (patch)
tree99605bf354a1f0b3c7a0c7b9462dc8cd9e96aa4b /gcc
parent8975ae2285b74f05a4465e7a9c8c0bdf8cf300b1 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl.c21
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/constructor3.C14
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" } */
+}