diff options
| author | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-28 21:06:01 +0000 |
|---|---|---|
| committer | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-28 21:06:01 +0000 |
| commit | a80e2c5291dd424cff68cb3a67e95ccbc4ff7eff (patch) | |
| tree | 99605bf354a1f0b3c7a0c7b9462dc8cd9e96aa4b | |
| parent | 74aab153b68fc0104587de60b95f628c9d6c4f4e (diff) | |
| download | ppe42-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/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 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" } */ +} |

