aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-01-06 20:21:13 +0000
committerMark Mitchell <mark@codesourcery.com>2005-01-06 20:21:13 +0000
commit94ea621caaa46de0495dc59876e68639ee37ee87 (patch)
tree307172f1e13dfc0be1ce45edfd079614f0da9c2e /gcc/cp/decl.c
parent3c47174dae92bc9d6e202ce3b371611cd45d9e01 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@93004 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/decl.c')
-rw-r--r--gcc/cp/decl.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 07d8543d249..e664b1c6aff 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -61,10 +61,6 @@ static int ambi_op_p (enum tree_code);
static int unary_op_p (enum tree_code);
static void push_local_name (tree);
static tree grok_reference_init (tree, tree, tree, tree *);
-static tree grokfndecl (tree, tree, tree, tree, tree, int,
- enum overload_flags, cp_cv_quals,
- tree, int, int, int, int, int, int, tree,
- tree *);
static tree grokvardecl (tree, tree, const cp_decl_specifier_seq *,
int, int, tree);
static void record_unknown_type (tree, const char *);
@@ -5616,6 +5612,8 @@ bad_specifiers (tree object,
CHECK is 1 if we must find this method in CTYPE, 0 if we should
not look, and -1 if we should not call `grokclassfn' at all.
+ SFK is the kind of special function (if any) for the new function.
+
Returns `NULL_TREE' if something goes wrong, after issuing
applicable error messages. */
@@ -5633,6 +5631,7 @@ grokfndecl (tree ctype,
int friendp,
int publicp,
int inlinep,
+ special_function_kind sfk,
int funcdef_flag,
int template_count,
tree in_namespace,
@@ -5843,14 +5842,13 @@ grokfndecl (tree ctype,
if (check < 0)
return decl;
- if (flags == NO_SPECIAL && ctype && constructor_name_p (declarator, ctype))
- DECL_CONSTRUCTOR_P (decl) = 1;
-
- /* Function gets the ugly name, field gets the nice one. This call
- may change the type of the function (because of default
- parameters)! */
if (ctype != NULL_TREE)
- grokclassfn (ctype, decl, flags, quals);
+ {
+ if (sfk == sfk_constructor)
+ DECL_CONSTRUCTOR_P (decl) = 1;
+
+ grokclassfn (ctype, decl, flags, quals);
+ }
decl = check_explicit_specialization (orig_declarator, decl,
template_count,
@@ -7981,6 +7979,7 @@ grokdeclarator (const cp_declarator *declarator,
unqualified_id,
virtualp, flags, quals, raises,
friendp ? -1 : 0, friendp, publicp, inlinep,
+ sfk,
funcdef_flag, template_count, in_namespace, attrlist);
if (decl == NULL_TREE)
return decl;
@@ -8027,8 +8026,9 @@ grokdeclarator (const cp_declarator *declarator,
parms,
unqualified_id,
virtualp, flags, quals, raises,
- friendp ? -1 : 0, friendp, 1, 0, funcdef_flag,
- template_count, in_namespace, attrlist);
+ friendp ? -1 : 0, friendp, 1, 0, sfk,
+ funcdef_flag, template_count, in_namespace,
+ attrlist);
if (decl == NULL_TREE)
return NULL_TREE;
}
@@ -8213,7 +8213,7 @@ grokdeclarator (const cp_declarator *declarator,
decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
virtualp, flags, quals, raises,
1, friendp,
- publicp, inlinep, funcdef_flag,
+ publicp, inlinep, sfk, funcdef_flag,
template_count, in_namespace, attrlist);
if (decl == NULL_TREE)
return NULL_TREE;