Commit 70efc776 by Richard Stallman

(finish_decl): Error if block-scope static var has incomplete type.

(complete_array_type): Correctly set MAXINDEX to one less than array size.

From-SVN: r5672
parent 2dca20cd
...@@ -1294,39 +1294,33 @@ duplicate_decls (newdecl, olddecl) ...@@ -1294,39 +1294,33 @@ duplicate_decls (newdecl, olddecl)
if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
{ {
if (TREE_CODE (olddecl) == FUNCTION_DECL if (TREE_CODE (olddecl) == FUNCTION_DECL
&& DECL_BUILT_IN (olddecl)) && (DECL_BUILT_IN (olddecl)
|| DECL_BUILT_IN_NONANSI (olddecl)))
{ {
/* If you declare a built-in function name as static, the /* If you declare a built-in or predefined function name as static,
built-in definition is overridden, the old definition is overridden,
but optionally warn this was a bad choice of name. */ but optionally warn this was a bad choice of name. */
if (!TREE_PUBLIC (newdecl)) if (!TREE_PUBLIC (newdecl))
{ {
if (warn_shadow) if (!warn_shadow)
;
else if (DECL_BUILT_IN (olddecl))
warning_with_decl (newdecl, "shadowing built-in function `%s'"); warning_with_decl (newdecl, "shadowing built-in function `%s'");
else
warning_with_decl (newdecl, "shadowing library function `%s'");
} }
/* Likewise, if the built-in is not ansi, then programs can /* Likewise, if the built-in is not ansi, then programs can
override it even globally without an error. */ override it even globally without an error. */
else if (! DECL_BUILT_IN (olddecl))
warning_with_decl (newdecl,
"library function `%s' declared as non-function");
else if (DECL_BUILT_IN_NONANSI (olddecl)) else if (DECL_BUILT_IN_NONANSI (olddecl))
warning_with_decl (newdecl, warning_with_decl (newdecl,
"built-in function `%s' declared as non-function"); "built-in function `%s' declared as non-function");
else else
error_with_decl (newdecl,
"built-in function `%s' declared as non-function");
}
else if (TREE_CODE (olddecl) == FUNCTION_DECL
&& DECL_BUILT_IN_NONANSI (olddecl))
{
/* If overriding decl is static,
optionally warn this was a bad choice of name. */
if (!TREE_PUBLIC (newdecl))
{
if (warn_shadow)
warning_with_decl (newdecl, "shadowing library function `%s'");
}
/* Otherwise, always warn. */
else
warning_with_decl (newdecl, warning_with_decl (newdecl,
"library function `%s' declared as non-function"); "built-in function `%s' declared as non-function");
} }
else else
{ {
...@@ -3474,9 +3468,11 @@ finish_decl (decl, init, asmspec_tree) ...@@ -3474,9 +3468,11 @@ finish_decl (decl, init, asmspec_tree)
? ?
/* A static variable with an incomplete type /* A static variable with an incomplete type
is an error if it is initialized. is an error if it is initialized.
Also if it is not file scope.
Otherwise, let it through, but if it is not `extern' Otherwise, let it through, but if it is not `extern'
then it may cause an error message later. */ then it may cause an error message later. */
DECL_INITIAL (decl) != 0 (DECL_INITIAL (decl) != 0
|| current_binding_level != global_binding_level)
: :
/* An automatic variable with an incomplete type /* An automatic variable with an incomplete type
is an error. */ is an error. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment