aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-01-06 20:21:13 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2005-01-06 20:21:13 +0000
commit27d6592cc72001b4d4c9b9b4555eecc19d0203e9 (patch)
tree307172f1e13dfc0be1ce45edfd079614f0da9c2e /gcc/cp/parser.c
parent27916b83f5f371d27f728fcc003fe93b0e44b3cc (diff)
downloadgcc-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.c15
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)