aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-03-09 08:16:49 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-03-09 08:16:49 +0000
commit58ec3cc5c0c441e0e8c49c029be9e25dcb1d853d (patch)
tree4053bda91421405c7881ecbb817f38fb71ebe500
parentf1c4ca32d04cf16aa78c857acca00f7eebb9b9da (diff)
downloadgcc-58ec3cc5c0c441e0e8c49c029be9e25dcb1d853d.zip
gcc-58ec3cc5c0c441e0e8c49c029be9e25dcb1d853d.tar.gz
gcc-58ec3cc5c0c441e0e8c49c029be9e25dcb1d853d.tar.bz2
re PR c++/14401 (Uninitialized reference error not reported.)
PR c++/14401 * class.c (check_field_decls): Complain about non-static data members of reference type in unions. Propagate CLASSTYPE_REF_FIELDS_NEED_INIT and CLASSTYPE_READONLY_FIELDS_NEED_INIT from the types of non-static data members. * init.c (perform_member_init): Complain about mbmers with const type that are not explicitly initialized. PR c++/14401 * g++.dg/init/ctor3.C: New test. * g++.dg/init/union1.C: New test. * g++.dg/ext/anon-struct4.C: New test. From-SVN: r79158
-rw-r--r--gcc/cp/ChangeLog41
-rw-r--r--gcc/cp/class.c50
-rw-r--r--gcc/cp/cp-tree.h26
-rw-r--r--gcc/cp/decl.c65
-rw-r--r--gcc/cp/init.c3
-rw-r--r--gcc/cp/lex.c24
-rw-r--r--gcc/cp/name-lookup.c29
-rw-r--r--gcc/cp/name-lookup.h1
-rw-r--r--gcc/cp/ptree.c2
-rw-r--r--gcc/cp/search.c20
-rw-r--r--gcc/cp/typeck.c3
-rw-r--r--gcc/testsuite/ChangeLog16
-rw-r--r--gcc/testsuite/g++.dg/ext/anon-struct4.C3
-rw-r--r--gcc/testsuite/g++.dg/init/ctor3.C6
-rw-r--r--gcc/testsuite/g++.dg/init/union1.C5
-rw-r--r--gcc/testsuite/g++.dg/lookup/koenig1.C2
-rw-r--r--gcc/testsuite/g++.dg/lookup/used-before-declaration.C4
-rw-r--r--gcc/testsuite/g++.dg/other/do1.C2
-rw-r--r--gcc/testsuite/g++.dg/overload/koenig1.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/crash13.C2
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate3.C2
21 files changed, 146 insertions, 162 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c64bb21..21ca2f9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,44 @@
+2004-03-08 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/14401
+ * class.c (check_field_decls): Complain about non-static data
+ members of reference type in unions. Propagate
+ CLASSTYPE_REF_FIELDS_NEED_INIT and
+ CLASSTYPE_READONLY_FIELDS_NEED_INIT from the types of non-static
+ data members.
+ * init.c (perform_member_init): Complain about mbmers with const
+ type that are not explicitly initialized.
+
+2004-03-08 Mark Mitchell <mark@codesourcery.com>
+
+ * class.c (check_methods): Don't use IDENTIFIER_ERROR_LOCUS.
+ * cp-tree.h (DECL_INVALID_OVERRIDER_P): New macro.
+ (lang_identifier): Remove implicit_decl and error_locus.
+ (IDENTIFIER_IMPLICIT_DECL): Remove.
+ (SET_IDENTIFIER_IMPLICTI_DECL): Likewise.
+ (IDENTIFIER_ERROR_LOCUS): Likewise.
+ (SET_IDENTIFIER_ERROR_LOCUS): Likewise.
+ (TYPE_ASSEMBLER_NAME_STRING): Likewise.
+ (TYPE_ASSEMBLER_NAME_LENGTH): Likewise.
+ (implicitly_declare): Remove.
+ * decl.c (warn_extern_redeclared_static): Remove check of
+ IDENTIFIER_IMPLICIT_DECL.
+ (duplicate_decls): Don't check IDENTIFIER_ERROR_LOCUS.
+ (implicitly_declare): Remove.
+ (grok_ctor_properties): Don't set IDENTIFIER_ERROR_LOCUS.
+ (start_function): Don't check IDENTIFIER_IMPLICIT_DECL.
+ (start_method): Don't check IDENTIFIER_ERROR_LOCUS.
+ * lex.c (unqualified_name_lookup_error): Create a dummy VAR_DECL
+ in the innermost scope, rather than at namespace scope.
+ * name-lookup.c (push_local_binding): Give it external linkage.
+ (pushdecl): Remove dead code.
+ * name-lookup.h (push_local_binding): Declare it.
+ * ptree.c (cxx_print_identifier): Don't print
+ IDENTIFIER_IMPLICIT_DECL or IDENTIFIER_ERROR_LOCUS.
+ * search.c (check_final_overrider): Use DECL_INVALID_OVERRIDER_P,
+ not IDENTIFIER_ERROR_LOCUS.
+ * typeck.c (build_function_call): Remove dead code.
+
2004-03-08 Jason Merrill <jason@redhat.com>
PR c++/13170
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 3a34ce45..eddfda8 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -2923,9 +2923,30 @@ check_field_decls (tree t, tree *access_decls,
/* If we've gotten this far, it's a data member, possibly static,
or an enumerator. */
-
DECL_CONTEXT (x) = t;
+ /* When this goes into scope, it will be a non-local reference. */
+ DECL_NONLOCAL (x) = 1;
+
+ if (TREE_CODE (t) == UNION_TYPE)
+ {
+ /* [class.union]
+
+ If a union contains a static data member, or a member of
+ reference type, the program is ill-formed. */
+ if (TREE_CODE (x) == VAR_DECL)
+ {
+ cp_error_at ("`%D' may not be static because it is a member of a union", x);
+ continue;
+ }
+ if (TREE_CODE (type) == REFERENCE_TYPE)
+ {
+ cp_error_at ("`%D' may not have reference type `%T' because it is a member of a union",
+ x, type);
+ continue;
+ }
+ }
+
/* ``A local class cannot have static data members.'' ARM 9.4 */
if (current_function_decl && TREE_STATIC (x))
cp_error_at ("field `%D' in local class cannot be static", x);
@@ -2949,21 +2970,9 @@ check_field_decls (tree t, tree *access_decls,
if (type == error_mark_node)
continue;
- /* When this goes into scope, it will be a non-local reference. */
- DECL_NONLOCAL (x) = 1;
-
- if (TREE_CODE (x) == CONST_DECL)
+ if (TREE_CODE (x) == CONST_DECL || TREE_CODE (x) == VAR_DECL)
continue;
- if (TREE_CODE (x) == VAR_DECL)
- {
- if (TREE_CODE (t) == UNION_TYPE)
- /* Unions cannot have static members. */
- cp_error_at ("field `%D' declared static in union", x);
-
- continue;
- }
-
/* Now it can only be a FIELD_DECL. */
if (TREE_PRIVATE (x) || TREE_PROTECTED (x))
@@ -2994,6 +3003,14 @@ check_field_decls (tree t, tree *access_decls,
if (TYPE_PTR_P (type))
has_pointers = 1;
+ if (CLASS_TYPE_P (type))
+ {
+ if (CLASSTYPE_REF_FIELDS_NEED_INIT (type))
+ SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1);
+ if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (type))
+ SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, 1);
+ }
+
if (DECL_MUTABLE_P (x) || TYPE_HAS_MUTABLE_P (type))
CLASSTYPE_HAS_MUTABLE (t) = 1;
@@ -3683,11 +3700,6 @@ check_methods (tree t)
for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x))
{
- /* If this was an evil function, don't keep it in class. */
- if (DECL_ASSEMBLER_NAME_SET_P (x)
- && IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (x)))
- continue;
-
check_for_override (x, t);
if (DECL_PURE_VIRTUAL_P (x) && ! DECL_VINDEX (x))
cp_error_at ("initializer specified for non-virtual method `%D'", x);
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 55b077e..dcb173e 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -100,6 +100,7 @@ struct diagnostic_context;
4: DECL_C_BIT_FIELD (in a FIELD_DECL)
DECL_VAR_MARKED_P (in a VAR_DECL)
DECL_SELF_REFERENCE_P (in a TYPE_DECL)
+ DECL_INVALID_OVERRIRDER_P (in a FUNCTION_DECL)
5: DECL_INTERFACE_KNOWN.
6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
@@ -224,8 +225,6 @@ struct lang_identifier GTY(())
tree class_value;
tree class_template_info;
tree label_value;
- tree implicit_decl;
- tree error_locus;
};
/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
@@ -399,16 +398,6 @@ typedef enum cp_id_kind
#define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE) \
IDENTIFIER_LABEL_VALUE (NODE) = (VALUE)
-#define IDENTIFIER_IMPLICIT_DECL(NODE) \
- (LANG_IDENTIFIER_CAST (NODE)->implicit_decl)
-#define SET_IDENTIFIER_IMPLICIT_DECL(NODE, VALUE) \
- IDENTIFIER_IMPLICIT_DECL (NODE) = (VALUE)
-
-#define IDENTIFIER_ERROR_LOCUS(NODE) \
- (LANG_IDENTIFIER_CAST (NODE)->error_locus)
-#define SET_IDENTIFIER_ERROR_LOCUS(NODE, VALUE) \
- IDENTIFIER_ERROR_LOCUS (NODE) = (VALUE)
-
/* Nonzero if this identifier is used as a virtual function name somewhere
(optimizes searches). */
#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1 (NODE)
@@ -888,11 +877,6 @@ enum languages { lang_c, lang_cplusplus, lang_java };
#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
-#define TYPE_ASSEMBLER_NAME_STRING(NODE) \
- (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))
-#define TYPE_ASSEMBLER_NAME_LENGTH(NODE) \
- (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))
-
/* Nonzero if NODE has no name for linkage purposes. */
#define TYPE_ANONYMOUS_P(NODE) \
(TAGGED_TYPE_P (NODE) && ANON_AGGRNAME_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
@@ -1951,6 +1935,13 @@ struct lang_decl GTY(())
#define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) \
(DECL_LANG_SPECIFIC (NODE)->decl_flags.needs_final_overrider)
+/* True (in a FUNCTION_DECL) if NODE is a virtual function that is an
+ invalid overrider for a function from a base class. Once we have
+ complained about an invalid overrider we avoid complaining about it
+ again. */
+#define DECL_INVALID_OVERRIDER_P(NODE) \
+ (DECL_LANG_FLAG_4 (NODE))
+
/* The thunks associated with NODE, a FUNCTION_DECL. */
#define DECL_THUNKS(NODE) \
(DECL_LANG_SPECIFIC (NODE)->u.f.context)
@@ -3614,7 +3605,6 @@ extern tree duplicate_decls (tree, tree);
extern tree pushdecl_top_level (tree);
extern tree pushdecl_top_level_and_finish (tree, tree);
extern tree push_using_decl (tree, tree);
-extern tree implicitly_declare (tree);
extern tree declare_local_label (tree);
extern tree define_label (location_t, tree);
extern void check_goto (tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 8c2405f..c2698ec 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1097,11 +1097,6 @@ decls_match (tree newdecl, tree olddecl)
void
warn_extern_redeclared_static (tree newdecl, tree olddecl)
{
- static const char *const explicit_extern_static_warning
- = "`%D' was declared `extern' and later `static'";
- static const char *const implicit_extern_static_warning
- = "`%D' was declared implicitly `extern' and later `static'";
-
tree name;
if (TREE_CODE (newdecl) == TYPE_DECL
@@ -1127,9 +1122,7 @@ warn_extern_redeclared_static (tree newdecl, tree olddecl)
return;
name = DECL_ASSEMBLER_NAME (newdecl);
- pedwarn (IDENTIFIER_IMPLICIT_DECL (name)
- ? implicit_extern_static_warning
- : explicit_extern_static_warning, newdecl);
+ pedwarn ("`%D' was declared `extern' and later `static'", newdecl);
cp_pedwarn_at ("previous declaration of `%D'", olddecl);
}
@@ -1373,10 +1366,7 @@ duplicate_decls (tree newdecl, tree olddecl)
else
return NULL_TREE;
}
-
- /* Already complained about this, so don't do so again. */
- else if (current_class_type == NULL_TREE
- || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type)
+ else
{
error ("conflicting declaration '%#D'", newdecl);
cp_error_at ("'%D' has a previous declaration as `%#D'",
@@ -1943,39 +1933,6 @@ duplicate_decls (tree newdecl, tree olddecl)
return olddecl;
}
-/* Generate an implicit declaration for identifier FUNCTIONID
- as a function of type int (). Print a warning if appropriate. */
-
-tree
-implicitly_declare (tree functionid)
-{
- tree decl;
-
- /* We used to reuse an old implicit decl here,
- but this loses with inline functions because it can clobber
- the saved decl chains. */
- decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type);
-
- DECL_EXTERNAL (decl) = 1;
- TREE_PUBLIC (decl) = 1;
-
- /* ISO standard says implicit declarations are in the innermost block.
- So we record the decl in the standard fashion. */
- pushdecl (decl);
- rest_of_decl_compilation (decl, NULL, 0, 0);
-
- if (warn_implicit
- /* Only one warning per identifier. */
- && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE)
- {
- pedwarn ("implicit declaration of function `%#D'", decl);
- }
-
- SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl);
-
- return decl;
-}
-
/* Return zero if the declaration NEWDECL is valid
when the declaration OLDDECL (assumed to be for the same name)
has already been seen.
@@ -8844,7 +8801,6 @@ grok_ctor_properties (tree ctype, tree decl)
instantiated, but that's hard to forestall. */
error ("invalid constructor; you probably meant `%T (const %T&)'",
ctype, ctype);
- SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype);
return 0;
}
@@ -10154,12 +10110,6 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
ctype = NULL_TREE;
}
- /* Warn if function was previously implicitly declared
- (but not if we warned then). */
- if (! warn_implicit
- && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE)
- cp_warning_at ("`%D' implicitly declared before its definition", IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)));
-
/* Set up current_class_type, and enter the scope of the class, if
appropriate. */
if (ctype)
@@ -10929,13 +10879,10 @@ start_method (tree declspecs, tree declarator, tree attrlist)
if (DECL_IN_AGGR_P (fndecl))
{
- if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type)
- {
- if (DECL_CONTEXT (fndecl)
- && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL)
- error ("`%D' is already defined in class `%T'", fndecl,
- DECL_CONTEXT (fndecl));
- }
+ if (DECL_CONTEXT (fndecl)
+ && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL)
+ error ("`%D' is already defined in class `%T'", fndecl,
+ DECL_CONTEXT (fndecl));
return void_type_node;
}
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 4a31bd5..60a4d04 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -371,6 +371,9 @@ perform_member_init (tree member, tree init)
/* member traversal: note it leaves init NULL */
else if (TREE_CODE (type) == REFERENCE_TYPE)
pedwarn ("uninitialized reference member `%D'", member);
+ else if (CP_TYPE_CONST_P (type))
+ pedwarn ("uninitialized mber `%D' with `const' type `%T'",
+ member, type);
}
else if (TREE_CODE (init) == TREE_LIST)
/* There was an explicit member initialization. Do some work
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 2239c76..66e45ed 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -627,26 +627,18 @@ unqualified_name_lookup_error (tree name)
if (name != ansi_opname (ERROR_MARK))
error ("`%D' not defined", name);
}
- else if (current_function_decl == 0)
- error ("`%D' was not declared in this scope", name);
else
{
- if (IDENTIFIER_NAMESPACE_VALUE (name) != error_mark_node
- || IDENTIFIER_ERROR_LOCUS (name) != current_function_decl)
+ error ("`%D' was not declared in this scope", name);
+ /* Prevent repeated error messages by creating a VAR_DECL with
+ this NAME in the innermost block scope. */
+ if (current_function_decl)
{
- static int undeclared_variable_notice;
-
- error ("`%D' undeclared (first use this function)", name);
-
- if (! undeclared_variable_notice)
- {
- error ("(Each undeclared identifier is reported only once for each function it appears in.)");
- undeclared_variable_notice = 1;
- }
+ tree decl;
+ decl = build_decl (VAR_DECL, name, error_mark_node);
+ DECL_CONTEXT (decl) = current_function_decl;
+ push_local_binding (name, decl, 0);
}
- /* Prevent repeated error messages. */
- SET_IDENTIFIER_NAMESPACE_VALUE (name, error_mark_node);
- SET_IDENTIFIER_ERROR_LOCUS (name, current_function_decl);
}
return error_mark_node;
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 1da453a..82e583c 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -36,7 +36,6 @@ static cxx_scope *innermost_nonclass_level (void);
static tree select_decl (cxx_binding *, int);
static cxx_binding *binding_for_name (cxx_scope *, tree);
static tree lookup_name_current_level (tree);
-static void push_local_binding (tree, tree, int);
static tree push_overloaded_decl (tree, int);
static bool lookup_using_namespace (tree, cxx_binding *, tree,
tree, int);
@@ -647,13 +646,7 @@ pushdecl (tree x)
t = NULL_TREE;
}
- if (t == error_mark_node)
- {
- /* error_mark_node is 0 for a while during initialization! */
- t = NULL_TREE;
- cp_error_at ("`%#D' used prior to declaration", x);
- }
- else if (t != NULL_TREE)
+ if (t && t != error_mark_node)
{
if (different_binding_level)
{
@@ -830,24 +823,6 @@ pushdecl (tree x)
|| TREE_CODE (x) == TEMPLATE_DECL))
SET_IDENTIFIER_NAMESPACE_VALUE (name, x);
- /* Don't forget if the function was used via an implicit decl. */
- if (IDENTIFIER_IMPLICIT_DECL (name)
- && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
- TREE_USED (x) = 1;
-
- /* Don't forget if its address was taken in that way. */
- if (IDENTIFIER_IMPLICIT_DECL (name)
- && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
- TREE_ADDRESSABLE (x) = 1;
-
- /* Warn about mismatches against previous implicit decl. */
- if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE
- /* If this real decl matches the implicit, don't complain. */
- && ! (TREE_CODE (x) == FUNCTION_DECL
- && TREE_TYPE (TREE_TYPE (x)) == integer_type_node))
- warning
- ("`%D' was previously implicitly declared to return `int'", x);
-
/* If new decl is `static' and an `extern' was seen previously,
warn about it. */
if (x != NULL_TREE && t != NULL_TREE && decls_match (x, t))
@@ -1035,7 +1010,7 @@ maybe_push_decl (tree decl)
doesn't really belong to this binding level, that it got here
through a using-declaration. */
-static void
+void
push_local_binding (tree id, tree decl, int flags)
{
struct cp_binding_level *b;
diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h
index 8377575..1ade1a9 100644
--- a/gcc/cp/name-lookup.h
+++ b/gcc/cp/name-lookup.h
@@ -287,6 +287,7 @@ extern tree lookup_namespace_name (tree, tree);
extern tree lookup_qualified_name (tree, tree, bool, bool);
extern tree lookup_name_nonclass (tree);
extern tree lookup_function_nonclass (tree, tree);
+extern void push_local_binding (tree, tree, int);
extern int push_class_binding (tree, tree);
extern bool pushdecl_class_level (tree);
extern tree pushdecl_namespace_level (tree);
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index 7979504..4858b86 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -157,8 +157,6 @@ cxx_print_identifier (FILE *file, tree node, int indent)
cxx_print_binding (file, IDENTIFIER_BINDING (node), "local bindings");
print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
print_node (file, "template", IDENTIFIER_TEMPLATE (node), indent + 4);
- print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4);
- print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4);
}
void
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 1b8c8c8..5b66000 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1703,7 +1703,10 @@ check_final_overrider (tree overrider, tree basefn)
tree over_throw = TYPE_RAISES_EXCEPTIONS (over_type);
tree base_throw = TYPE_RAISES_EXCEPTIONS (base_type);
int fail = 0;
-
+
+ if (DECL_INVALID_OVERRIDER_P (overrider))
+ return 0;
+
if (same_type_p (base_return, over_return))
/* OK */;
else if ((CLASS_TYPE_P (over_return) && CLASS_TYPE_P (base_return))
@@ -1753,8 +1756,6 @@ check_final_overrider (tree overrider, tree basefn)
fail = 2;
if (!fail)
/* OK */;
- else if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (overrider)))
- return 0;
else
{
if (fail == 1)
@@ -1768,21 +1769,16 @@ check_final_overrider (tree overrider, tree basefn)
overrider);
cp_error_at (" overriding `%#D'", basefn);
}
- SET_IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (overrider),
- DECL_CONTEXT (overrider));
+ DECL_INVALID_OVERRIDER_P (overrider) = 1;
return 0;
}
/* Check throw specifier is at least as strict. */
if (!comp_except_specs (base_throw, over_throw, 0))
{
- if (!IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (overrider)))
- {
- cp_error_at ("looser throw specifier for `%#F'", overrider);
- cp_error_at (" overriding `%#F'", basefn);
- SET_IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (overrider),
- DECL_CONTEXT (overrider));
- }
+ cp_error_at ("looser throw specifier for `%#F'", overrider);
+ cp_error_at (" overriding `%#F'", basefn);
+ DECL_INVALID_OVERRIDER_P (overrider) = 1;
return 0;
}
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index d5d832b..b7a66c2 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -2380,7 +2380,7 @@ build_function_call (tree function, tree params)
tree fntype, fndecl;
tree coerced_params;
tree result;
- tree name = NULL_TREE, assembler_name = NULL_TREE;
+ tree name = NULL_TREE;
int is_method;
tree original = function;
@@ -2393,7 +2393,6 @@ build_function_call (tree function, tree params)
if (TREE_CODE (function) == FUNCTION_DECL)
{
name = DECL_NAME (function);
- assembler_name = DECL_ASSEMBLER_NAME (function);
mark_used (function);
fndecl = function;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 77eb45c..6eb9b55 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,19 @@
+2004-03-08 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/14401
+ * g++.dg/init/ctor3.C: New test.
+ * g++.dg/init/union1.C: New test.
+ * g++.dg/ext/anon-struct4.C: New test.
+
+2004-03-08 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/lookup/koenig1.C: Tweak error messages.
+ * g++.dg/lookup/used-before-declaration.C: Likewise.
+ * g++.dg/other/do1.C: Likewise.
+ * g++.dg/overload/koenig1.C: Likewise.
+ * g++.dg/parse/crash13.C: Likewise.
+ * g++.dg/template/instantiate3.C: Likewise.
+
2004-03-08 Eric Christopher <echristo@redhat.com>
* * lib/target-supports.exp: Enable libiconv in test
diff --git a/gcc/testsuite/g++.dg/ext/anon-struct4.C b/gcc/testsuite/g++.dg/ext/anon-struct4.C
new file mode 100644
index 0000000..f0b3b57
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/anon-struct4.C
@@ -0,0 +1,3 @@
+// PR c++/14401
+
+struct { struct { int& i ; } bar ; } foo ; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/init/ctor3.C b/gcc/testsuite/g++.dg/init/ctor3.C
new file mode 100644
index 0000000..1678aaf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ctor3.C
@@ -0,0 +1,6 @@
+// PR c++/14401
+
+struct S {
+ S() {} // { dg-error "" }
+ const int i;
+};
diff --git a/gcc/testsuite/g++.dg/init/union1.C b/gcc/testsuite/g++.dg/init/union1.C
new file mode 100644
index 0000000..0049f44
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/union1.C
@@ -0,0 +1,5 @@
+// PR c++/14401
+
+union U {
+ int& i; // { dg-error "" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/koenig1.C b/gcc/testsuite/g++.dg/lookup/koenig1.C
index 697a322..7273727 100644
--- a/gcc/testsuite/g++.dg/lookup/koenig1.C
+++ b/gcc/testsuite/g++.dg/lookup/koenig1.C
@@ -9,5 +9,5 @@ class X;
void foo() {
X x(1); // { dg-error "incomplete type" "" }
- bar(x); // { dg-error "undeclared" "" }
+ bar(x); // { dg-error "not declared" "" }
}
diff --git a/gcc/testsuite/g++.dg/lookup/used-before-declaration.C b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C
index c1469ea..b51d270 100644
--- a/gcc/testsuite/g++.dg/lookup/used-before-declaration.C
+++ b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C
@@ -1,5 +1,5 @@
// Copyroght (C) 2003 Free Software Foundation
// Origin: PR/12832, Jonathan Wakely <redi@gcc.gnu.org>
-void f() { g(); } // { dg-error "undeclared" "" }
-void g() { } // { dg-error "used" "" }
+void f() { g(); } // { dg-error "not declared" "" }
+void g() { }
diff --git a/gcc/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C
index 8cbd1a3..7203585 100644
--- a/gcc/testsuite/g++.dg/other/do1.C
+++ b/gcc/testsuite/g++.dg/other/do1.C
@@ -8,6 +8,6 @@
void init ()
{
do { } while (0)
- obj = 0; // { dg-error "expected|undeclared" "" }
+ obj = 0; // { dg-error "expected|not declared" "" }
}
diff --git a/gcc/testsuite/g++.dg/overload/koenig1.C b/gcc/testsuite/g++.dg/overload/koenig1.C
index dd38e72..1ed7bce 100644
--- a/gcc/testsuite/g++.dg/overload/koenig1.C
+++ b/gcc/testsuite/g++.dg/overload/koenig1.C
@@ -13,6 +13,6 @@ void g ()
{
B *bp;
N::A *ap;
- f (bp); // { dg-error "undeclared" }
+ f (bp); // { dg-error "not declared" }
f (ap);
}
diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C
index d81b6a5..d9e9087 100644
--- a/gcc/testsuite/g++.dg/parse/crash13.C
+++ b/gcc/testsuite/g++.dg/parse/crash13.C
@@ -18,5 +18,5 @@ void func(A<T>::B* ) // { dg-error "variable|template|expression" }
int main()
{
- func<void>(0); // { dg-error "undeclared|expression|;" }
+ func<void>(0); // { dg-error "not declared|expression|;" }
}
diff --git a/gcc/testsuite/g++.dg/template/instantiate3.C b/gcc/testsuite/g++.dg/template/instantiate3.C
index 14dbcda..3ad8b95 100644
--- a/gcc/testsuite/g++.dg/template/instantiate3.C
+++ b/gcc/testsuite/g++.dg/template/instantiate3.C
@@ -10,7 +10,7 @@ template <class TYPE>
struct ACE_Cleanup_Adapter
{
TYPE &object ()
- { return object_; } // { dg-error "undeclared|reported" }
+ { return object_; } // { dg-error "not declared|reported" }
TYPE object_; // { dg-error "incomplete type" }
};