diff options
author | Mark Mitchell <mark@codesourcery.com> | 2005-01-06 20:21:13 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2005-01-06 20:21:13 +0000 |
commit | 27d6592cc72001b4d4c9b9b4555eecc19d0203e9 (patch) | |
tree | 307172f1e13dfc0be1ce45edfd079614f0da9c2e /gcc/cp/parser.c | |
parent | 27916b83f5f371d27f728fcc003fe93b0e44b3cc (diff) | |
download | gcc-27d6592cc72001b4d4c9b9b4555eecc19d0203e9.zip gcc-27d6592cc72001b4d4c9b9b4555eecc19d0203e9.tar.gz gcc-27d6592cc72001b4d4c9b9b4555eecc19d0203e9.tar.bz2 |
re PR c++/19244 (Typedef of anonymous class incorrectly handled in member function definition)
PR c++/19244
* class.c (add_implicitly_declared_members): Remove dead code.
* decl.c (grokfndecl): Add sfk parameter. Use it do set
DECL_CONSTRUCTOR_P.
(grokdeclarator): Adjust calls to grokfndecl.
* method.c (implicitly_declare_fn): Improve documentation.
* parser.c (cp_parser_direct_declarator): Do not consider a
function to be a constructor if the containing class was
originally anonymous.
PR c++/19244
* g++.dg/parser/ctor2.C: New test.
From-SVN: r93004
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4ca03aa..86a96fb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -11109,11 +11109,16 @@ cp_parser_direct_declarator (cp_parser* parser, declarator->u.id.sfk = sfk_destructor; else if (IDENTIFIER_TYPENAME_P (unqualified_name)) declarator->u.id.sfk = sfk_conversion; - else if (constructor_name_p (unqualified_name, - class_type) - || (TREE_CODE (unqualified_name) == TYPE_DECL - && same_type_p (TREE_TYPE (unqualified_name), - class_type))) + else if (/* There's no way to declare a constructor + for an anonymous type, even if the type + got a name for linkage purposes. */ + !TYPE_WAS_ANONYMOUS (class_type) + && (constructor_name_p (unqualified_name, + class_type) + || (TREE_CODE (unqualified_name) == TYPE_DECL + && (same_type_p + (TREE_TYPE (unqualified_name), + class_type))))) declarator->u.id.sfk = sfk_constructor; if (ctor_dtor_or_conv_p && declarator->u.id.sfk != sfk_none) |