summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsimartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-28 21:06:01 +0000
committersimartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-28 21:06:01 +0000
commita80e2c5291dd424cff68cb3a67e95ccbc4ff7eff (patch)
tree99605bf354a1f0b3c7a0c7b9462dc8cd9e96aa4b
parent74aab153b68fc0104587de60b95f628c9d6c4f4e (diff)
downloadppe42-gcc-a80e2c5291dd424cff68cb3a67e95ccbc4ff7eff.tar.gz
ppe42-gcc-a80e2c5291dd424cff68cb3a67e95ccbc4ff7eff.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123312 138bc75d-0d04-0410-961f-82ee72b054a4
-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 a2a0f6ef90c..4f2b06191ef 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 ce1c54f10cd..0315f01241d 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 b3b28b30527..9b5244e597f 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 00000000000..9a2e9783e3d
--- /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" } */
+}
OpenPOWER on IntegriCloud