aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>1998-05-27 21:44:29 -0400
committerJason Merrill <jason@gcc.gnu.org>1998-05-27 21:44:29 -0400
commitb7698cf042b922cfa0e38695ab90e441faae301e (patch)
tree3fca0107f5cf12fee362a2925b2bcb8a438c2217
parentbe3a14bbbb8b161df688059270fe67cf498cfa14 (diff)
downloadgcc-b7698cf042b922cfa0e38695ab90e441faae301e.zip
gcc-b7698cf042b922cfa0e38695ab90e441faae301e.tar.gz
gcc-b7698cf042b922cfa0e38695ab90e441faae301e.tar.bz2
decl.c (start_decl): Always pedwarn about vacuously redeclaring a member.
* decl.c (start_decl): Always pedwarn about vacuously redeclaring a member. (start_function): Call check_default_args. * decl2.c (grokfield): Don't call check_default_args. (check_default_args): Use cp_error_at. * lex.c (do_pending_defargs): Call check_default_args. * call.c (build_scoped_method_call): Make sure get_type_value returns something before we try to use its TYPE_MAIN_VARIANT. From-SVN: r20113
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/call.c8
-rw-r--r--gcc/cp/decl.c14
-rw-r--r--gcc/cp/decl2.c5
-rw-r--r--gcc/cp/lex.c6
5 files changed, 30 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d37a619..684c2af 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,7 +1,17 @@
+1998-05-28 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl.c (start_decl): Always pedwarn about vacuously redeclaring
+ a member.
+ (start_function): Call check_default_args.
+ * decl2.c (grokfield): Don't call check_default_args.
+ (check_default_args): Use cp_error_at.
+ * lex.c (do_pending_defargs): Call check_default_args.
+
1998-05-27 Brendan Kehoe <brendan@cygnus.com>
* call.c (build_method_call): Make sure get_type_value returns
something before we try to use its TYPE_MAIN_VARIANT.
+ (build_scoped_method_call): Likewise.
1998-05-27 Jason Merrill <jason@yorick.cygnus.com>
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index f10aae8..03cc6f3 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -389,13 +389,15 @@ build_scoped_method_call (exp, basetype, name, parms)
and template parms. */
if (TREE_CODE (name) == BIT_NOT_EXPR && ! IS_AGGR_TYPE (basetype))
{
+ tree tmp;
if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype))
cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')",
exp, basetype, type);
name = TREE_OPERAND (name, 0);
- if (TYPE_MAIN_VARIANT (basetype) != name
- && (TYPE_MAIN_VARIANT (basetype)
- != TYPE_MAIN_VARIANT (get_type_value (name))))
+ if (! (name == TYPE_MAIN_VARIANT (basetype)
+ || ((tmp = get_type_value (name))
+ && (TYPE_MAIN_VARIANT (basetype)
+ == TYPE_MAIN_VARIANT (tmp)))))
cp_error ("qualified type `%T' does not match destructor name `~%T'",
basetype, name);
return cp_convert (void_type_node, exp);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index fd5fcfa..e3d1dd1 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6219,9 +6219,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
|| CLASSTYPE_USE_TEMPLATE (context))
SET_DECL_TEMPLATE_SPECIALIZATION (decl);
- /* Stupid stupid stupid stupid (jason 7/21/95) */
- if (pedantic && DECL_EXTERNAL (decl)
- && ! DECL_TEMPLATE_SPECIALIZATION (decl))
+ if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl))
cp_pedwarn ("declaration of `%#D' outside of class is not definition",
decl);
@@ -11815,9 +11813,13 @@ start_function (declspecs, declarator, attrs, pre_parsed_p)
&& ! DECL_FUNCTION_MEMBER_P (decl1))
decl1 = pushdecl (decl1);
else
- /* We need to set the DECL_CONTEXT. */
- if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1))
- DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1));
+ {
+ /* We need to set the DECL_CONTEXT. */
+ if (!DECL_CONTEXT (decl1) && DECL_TEMPLATE_INFO (decl1))
+ DECL_CONTEXT (decl1) = DECL_CONTEXT (DECL_TI_TEMPLATE (decl1));
+ /* And make sure we have enough default args. */
+ check_default_args (decl1);
+ }
DECL_MAIN_VARIANT (decl1) = decl1;
fntype = TREE_TYPE (decl1);
}
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e4c14ab..9fb08ac 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1755,7 +1755,6 @@ grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
}
if (TREE_CODE (value) == FUNCTION_DECL)
{
- check_default_args (value);
if (asmspec)
{
/* This must override the asm specifier which was placed
@@ -4500,8 +4499,8 @@ check_default_args (x)
saw_def = 1;
else if (saw_def)
{
- cp_error ("default argument missing for parameter %P of `%#D'",
- i, x);
+ cp_error_at ("default argument missing for parameter %P of `%+#D'",
+ i, x);
break;
}
}
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 0cc98af..7f5693b 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -1930,7 +1930,11 @@ do_pending_defargs ()
}
if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
- maybe_end_member_template_processing (defarg_fn);
+ {
+ maybe_end_member_template_processing (defarg_fn);
+ check_default_args (defarg_fn);
+ }
+
poplevel (0, 0, 0);
pop_nested_class (1);
}