Commit 9affb2c7 by Zack Weinberg

c-opts.c (c_common_post_options): Force unit-at-a-time mode on when we have more…

c-opts.c (c_common_post_options): Force unit-at-a-time mode on when we have more than one input file.

2004-07-09  Zack Weinberg  <zack@codesourcery.com>
	    Andrew Pinski  <apinski@apple.com>

	* c-opts.c (c_common_post_options): Force unit-at-a-time mode
	on when we have more than one input file.
	(c_common_parse_file): Restore loop over all input files.
	Clarify diagnostic for -dy when YYDEBUG wasn't defined.

	* c-decl.c (set_type_context): New function.
	(pop_scope): Use it to set context of types.  When we
	encounter a TYPE_DECL, set the context of the attached type too.
	(pop_file_scope): Don't call cpp_undef_all here.
	(diagnose_mismatched_decls): Do not complain about a second
	definition of an 'extern inline' function if it's not in the
	same translation unit.  Do not complain about inline
	declaration after use if the use was in a different
	translation unit.
	(merge_decls): Don't clobber olddecl's DECL_CONTEXT.
	(pushdecl): Do not put DECL_EXTERNAL, !TREE_PUBLIC decls in
	the external scope.
	(pushdecl_top_level): Likewise.
	(grokdeclarator): Clarify what is going on with setting
	DECL_EXTERNAL on function types, a little.
	(c_write_global_declarations): Don't do anything if
	-fsyntax-only or errors have been encountered.

testsuite:
	* gcc.dg/noncompile/init-4.c: Remove bogus dg-error marker.

From-SVN: r84402
parent 4077d207
2004-07-09 Zack Weinberg <zack@codesourcery.com> 2004-07-09 Zack Weinberg <zack@codesourcery.com>
Andrew Pinski <apinski@apple.com>
* c-opts.c (c_common_post_options): Force unit-at-a-time mode
on when we have more than one input file.
(c_common_parse_file): Restore loop over all input files.
Clarify diagnostic for -dy when YYDEBUG wasn't defined.
* c-decl.c (set_type_context): New function.
(pop_scope): Use it to set context of types. When we
encounter a TYPE_DECL, set the context of the attached type too.
(pop_file_scope): Don't call cpp_undef_all here.
(diagnose_mismatched_decls): Do not complain about a second
definition of an 'extern inline' function if it's not in the
same translation unit. Do not complain about inline
declaration after use if the use was in a different
translation unit.
(merge_decls): Don't clobber olddecl's DECL_CONTEXT.
(pushdecl): Do not put DECL_EXTERNAL, !TREE_PUBLIC decls in
the external scope.
(pushdecl_top_level): Likewise.
(grokdeclarator): Clarify what is going on with setting
DECL_EXTERNAL on function types, a little.
(c_write_global_declarations): Don't do anything if
-fsyntax-only or errors have been encountered.
2004-07-09 Zack Weinberg <zack@codesourcery.com>
* vec.c, vec.h (vec_assert_fail): Use unsigned int for LINE argument. * vec.c, vec.h (vec_assert_fail): Use unsigned int for LINE argument.
......
...@@ -622,6 +622,16 @@ push_scope (void) ...@@ -622,6 +622,16 @@ push_scope (void)
} }
} }
/* Set the TYPE_CONTEXT of all of TYPE's variants to CONTEXT. */
static void
set_type_context (tree type, tree context)
{
for (type = TYPE_MAIN_VARIANT (type); type;
type = TYPE_NEXT_VARIANT (type))
TYPE_CONTEXT (type) = context;
}
/* Exit a scope. Restore the state of the identifier-decl mappings /* Exit a scope. Restore the state of the identifier-decl mappings
that were in effect when this scope was entered. Return a BLOCK that were in effect when this scope was entered. Return a BLOCK
node containing all the DECLs in this scope that are of interest node containing all the DECLs in this scope that are of interest
...@@ -711,7 +721,7 @@ pop_scope (void) ...@@ -711,7 +721,7 @@ pop_scope (void)
case ENUMERAL_TYPE: case ENUMERAL_TYPE:
case UNION_TYPE: case UNION_TYPE:
case RECORD_TYPE: case RECORD_TYPE:
TYPE_CONTEXT (p) = context; set_type_context (p, context);
/* Types may not have tag-names, in which case the type /* Types may not have tag-names, in which case the type
appears in the bindings list with b->id NULL. */ appears in the bindings list with b->id NULL. */
...@@ -767,7 +777,11 @@ pop_scope (void) ...@@ -767,7 +777,11 @@ pop_scope (void)
This makes same_translation_unit_p work, and causes This makes same_translation_unit_p work, and causes
static declarations to be given disambiguating suffixes. */ static declarations to be given disambiguating suffixes. */
if (scope == file_scope && num_in_fnames > 1) if (scope == file_scope && num_in_fnames > 1)
DECL_CONTEXT (p) = context; {
DECL_CONTEXT (p) = context;
if (TREE_CODE (p) == TYPE_DECL)
set_type_context (TREE_TYPE (p), context);
}
/* Fall through. */ /* Fall through. */
/* Parameters go in DECL_ARGUMENTS, not BLOCK_VARS, and have /* Parameters go in DECL_ARGUMENTS, not BLOCK_VARS, and have
...@@ -865,7 +879,6 @@ pop_file_scope (void) ...@@ -865,7 +879,6 @@ pop_file_scope (void)
/* Pop off the file scope and close this translation unit. */ /* Pop off the file scope and close this translation unit. */
pop_scope (); pop_scope ();
file_scope = 0; file_scope = 0;
cpp_undef_all (parse_in);
cgraph_finalize_compilation_unit (); cgraph_finalize_compilation_unit ();
} }
...@@ -1215,7 +1228,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, ...@@ -1215,7 +1228,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
&& !(DECL_DECLARED_INLINE_P (olddecl) && !(DECL_DECLARED_INLINE_P (olddecl)
&& DECL_EXTERNAL (olddecl) && DECL_EXTERNAL (olddecl)
&& !(DECL_DECLARED_INLINE_P (newdecl) && !(DECL_DECLARED_INLINE_P (newdecl)
&& DECL_EXTERNAL (newdecl)))) && DECL_EXTERNAL (newdecl)
&& same_translation_unit_p (olddecl, newdecl))))
{ {
error ("%Jredefinition of '%D'", newdecl, newdecl); error ("%Jredefinition of '%D'", newdecl, newdecl);
locate_old_decl (olddecl, error); locate_old_decl (olddecl, error);
...@@ -1385,8 +1399,11 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, ...@@ -1385,8 +1399,11 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
/* Inline declaration after use or definition. /* Inline declaration after use or definition.
??? Should we still warn about this now we have unit-at-a-time ??? Should we still warn about this now we have unit-at-a-time
mode and can get it right? */ mode and can get it right?
if (DECL_DECLARED_INLINE_P (newdecl) && !DECL_DECLARED_INLINE_P (olddecl)) Definitely don't complain if the decls are in different translation
units. */
if (DECL_DECLARED_INLINE_P (newdecl) && !DECL_DECLARED_INLINE_P (olddecl)
&& same_translation_unit_p (olddecl, newdecl))
{ {
if (TREE_USED (olddecl)) if (TREE_USED (olddecl))
{ {
...@@ -1669,14 +1686,16 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) ...@@ -1669,14 +1686,16 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
} }
/* Copy most of the decl-specific fields of NEWDECL into OLDDECL. /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
But preserve OLDDECL's DECL_UID. */ But preserve OLDDECL's DECL_UID and DECL_CONTEXT. */
{ {
unsigned olddecl_uid = DECL_UID (olddecl); unsigned olddecl_uid = DECL_UID (olddecl);
tree olddecl_context = DECL_CONTEXT (olddecl);
memcpy ((char *) olddecl + sizeof (struct tree_common), memcpy ((char *) olddecl + sizeof (struct tree_common),
(char *) newdecl + sizeof (struct tree_common), (char *) newdecl + sizeof (struct tree_common),
sizeof (struct tree_decl) - sizeof (struct tree_common)); sizeof (struct tree_decl) - sizeof (struct tree_common));
DECL_UID (olddecl) = olddecl_uid; DECL_UID (olddecl) = olddecl_uid;
DECL_CONTEXT (olddecl) = olddecl_context;
} }
/* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl /* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl
...@@ -1897,14 +1916,13 @@ pushdecl (tree x) ...@@ -1897,14 +1916,13 @@ pushdecl (tree x)
they are in different translation units. In any case, they are in different translation units. In any case,
the static does not go in the externals scope. */ the static does not go in the externals scope. */
if (b if (b
&& (DECL_EXTERNAL (x) || TREE_PUBLIC (x) && (TREE_PUBLIC (x) || same_translation_unit_p (x, b->decl))
|| same_translation_unit_p (x, b->decl))
&& duplicate_decls (x, b->decl)) && duplicate_decls (x, b->decl))
{ {
bind (name, b->decl, scope, /*invisible=*/false, /*nested=*/true); bind (name, b->decl, scope, /*invisible=*/false, /*nested=*/true);
return b->decl; return b->decl;
} }
else if (DECL_EXTERNAL (x) || TREE_PUBLIC (x)) else if (TREE_PUBLIC (x))
{ {
bind (name, x, external_scope, /*invisible=*/true, /*nested=*/false); bind (name, x, external_scope, /*invisible=*/true, /*nested=*/false);
nested = true; nested = true;
...@@ -1991,7 +2009,7 @@ pushdecl_top_level (tree x) ...@@ -1991,7 +2009,7 @@ pushdecl_top_level (tree x)
if (I_SYMBOL_BINDING (name)) if (I_SYMBOL_BINDING (name))
abort (); abort ();
if (DECL_EXTERNAL (x) || TREE_PUBLIC (x)) if (TREE_PUBLIC (x))
{ {
bind (name, x, external_scope, /*invisible=*/true, /*nested=*/false); bind (name, x, external_scope, /*invisible=*/true, /*nested=*/false);
nested = true; nested = true;
...@@ -4459,14 +4477,6 @@ grokdeclarator (tree declarator, tree declspecs, ...@@ -4459,14 +4477,6 @@ grokdeclarator (tree declarator, tree declspecs,
} }
else if (TREE_CODE (type) == FUNCTION_TYPE) else if (TREE_CODE (type) == FUNCTION_TYPE)
{ {
/* Every function declaration is "external"
except for those which are inside a function body
in which `auto' is used.
That is a case not specified by ANSI C,
and we use it for forward declarations for nested functions. */
int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
|| current_scope == file_scope);
if (specbits & (1 << (int) RID_AUTO) if (specbits & (1 << (int) RID_AUTO)
&& (pedantic || current_scope == file_scope)) && (pedantic || current_scope == file_scope))
pedwarn ("invalid storage class for function `%s'", name); pedwarn ("invalid storage class for function `%s'", name);
...@@ -4497,8 +4507,16 @@ grokdeclarator (tree declarator, tree declspecs, ...@@ -4497,8 +4507,16 @@ grokdeclarator (tree declarator, tree declspecs,
&& !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl)))) && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
warning ("`noreturn' function returns non-void value"); warning ("`noreturn' function returns non-void value");
if (extern_ref) /* Every function declaration is an external reference
(DECL_EXTERNAL) except for those which are not at file
scope and are explicitly declared "auto". This is
forbidden by standard C (C99 6.7.1p5) and is interpreted by
GCC to signify a forward declaration of a nested function. */
if ((specbits & (1 << RID_AUTO)) && current_scope != file_scope)
DECL_EXTERNAL (decl) = 0;
else
DECL_EXTERNAL (decl) = 1; DECL_EXTERNAL (decl) = 1;
/* Record absence of global scope for `static' or `auto'. */ /* Record absence of global scope for `static' or `auto'. */
TREE_PUBLIC (decl) TREE_PUBLIC (decl)
= !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO))); = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)));
...@@ -6630,6 +6648,11 @@ c_write_global_declarations (void) ...@@ -6630,6 +6648,11 @@ c_write_global_declarations (void)
if (pch_file) if (pch_file)
return; return;
/* Don't waste time on further processing if -fsyntax-only or we've
encountered errors. */
if (flag_syntax_only || errorcount || sorrycount || cpp_errors (parse_in))
return;
/* Close the external scope. */ /* Close the external scope. */
ext_block = pop_scope (); ext_block = pop_scope ();
external_scope = 0; external_scope = 0;
......
...@@ -943,6 +943,11 @@ c_common_post_options (const char **pfilename) ...@@ -943,6 +943,11 @@ c_common_post_options (const char **pfilename)
flag_inline_functions = 0; flag_inline_functions = 0;
} }
/* If we are given more than one input file, we must use
unit-at-a-time mode. */
if (num_in_fnames > 1)
flag_unit_at_a_time = 1;
/* Default to ObjC sjlj exception handling if NeXT runtime. */ /* Default to ObjC sjlj exception handling if NeXT runtime. */
if (flag_objc_sjlj_exceptions < 0) if (flag_objc_sjlj_exceptions < 0)
flag_objc_sjlj_exceptions = flag_next_runtime; flag_objc_sjlj_exceptions = flag_next_runtime;
...@@ -1061,22 +1066,37 @@ c_common_init (void) ...@@ -1061,22 +1066,37 @@ c_common_init (void)
void void
c_common_parse_file (int set_yydebug) c_common_parse_file (int set_yydebug)
{ {
unsigned int i;
/* Enable parser debugging, if requested and we can. If requested
and we can't, notify the user. */
#if YYDEBUG != 0 #if YYDEBUG != 0
yydebug = set_yydebug; yydebug = set_yydebug;
#else #else
if (set_yydebug) if (set_yydebug)
warning ("YYDEBUG not defined"); warning ("YYDEBUG was not defined at build time, -dy ignored");
#endif #endif
if (num_in_fnames > 1) i = 0;
fatal_error ("sorry, inter-module analysis temporarily out of commission"); for (;;)
{
finish_options (); finish_options ();
pch_init (); pch_init ();
push_file_scope (); push_file_scope ();
c_parse_file (); c_parse_file ();
finish_file (); finish_file ();
pop_file_scope (); pop_file_scope ();
if (++i >= num_in_fnames)
break;
cpp_undef_all (parse_in);
this_input_filename
= cpp_read_main_file (parse_in, in_fnames[i]);
/* If an input file is missing, abandon further compilation.
cpplib has issued a diagnostic. */
if (!this_input_filename)
break;
}
} }
/* Common finish hook for the C, ObjC and C++ front ends. */ /* Common finish hook for the C, ObjC and C++ front ends. */
......
2004-07-09 Zack Weinberg <zack@codesourcery.com>
Andrew Pinski <apinski@apple.com>
* gcc.dg/noncompile/init-4.c: Remove bogus dg-error marker.
2004-07-09 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 2004-07-09 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
* gfortran.fortran-torture/compile/name_clash2.f90: Remove outdated * gfortran.fortran-torture/compile/name_clash2.f90: Remove outdated
...@@ -6,7 +11,7 @@ ...@@ -6,7 +11,7 @@
2004-07-09 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 2004-07-09 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
Paul Brook <paul@codesourcery.com> Paul Brook <paul@codesourcery.com>
* gfortran.dg/dg.exp: Use revised wilcard for suffixes, also allow * gfortran.dg/dg.exp: Use revised wilcard for suffixes, also allow
'.f95' and '.F95'. '.f95' and '.F95'.
2004-07-09 Diego Novillo <dnovillo@redhat.com> 2004-07-09 Diego Novillo <dnovillo@redhat.com>
...@@ -27,7 +32,7 @@ ...@@ -27,7 +32,7 @@
* gfortran.fortran-torture/compile/implicit_2.f90: New test. * gfortran.fortran-torture/compile/implicit_2.f90: New test.
* gfortran.dg/implicit_1.f90: New test. * gfortran.dg/implicit_1.f90: New test.
2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com) 2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com)
* lib/gfortran-dg.exp (gfortran-dg-test): Adapt regular * lib/gfortran-dg.exp (gfortran-dg-test): Adapt regular
...@@ -37,7 +42,7 @@ ...@@ -37,7 +42,7 @@
2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com) 2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com)
* lib/fortran-torture.exp: Rename proc search_for to * lib/fortran-torture.exp: Rename proc search_for to
search_for_re. search_for_re.
2004-07-09 Eric Botcazou <ebotcazou@libertysurf.fr> 2004-07-09 Eric Botcazou <ebotcazou@libertysurf.fr>
...@@ -60,7 +65,7 @@ ...@@ -60,7 +65,7 @@
2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com) 2004-07-09 David Billinghurst (David.Billinghurst@riotinto.com)
* gfortran.dg/g77/f77-edit-s-out.f: Copy from g77.dg. XFAIL * gfortran.dg/g77/f77-edit-s-out.f: Copy from g77.dg. XFAIL
* gfortran.dg/g77/f77-edit-t-in.f: Likewise * gfortran.dg/g77/f77-edit-t-in.f: Likewise
* gfortran.dg/g77/f77-edit-x-out.f: Likewise * gfortran.dg/g77/f77-edit-x-out.f: Likewise
...@@ -68,7 +73,7 @@ ...@@ -68,7 +73,7 @@
* gfortran.dg/g77/7388.f: Copy from g77.dg * gfortran.dg/g77/7388.f: Copy from g77.dg
* gfortran.dg/g77/f77-edit-i-out.f: Likewise * gfortran.dg/g77/f77-edit-i-out.f: Likewise
* gfortran.dg/g77/f77-edit-apostrophe-out.f: Likewise * gfortran.dg/g77/f77-edit-apostrophe-out.f: Likewise
* gfortran.dg/g77/f77-edit-slash-out.f: Likewise * gfortran.dg/g77/f77-edit-slash-out.f: Likewise
* gfortran.dg/g77/f77-edit-colon-out.f: Likewise * gfortran.dg/g77/f77-edit-colon-out.f: Likewise
* gfortran.dg/g77/f77-edit-t-out.f: Likewise * gfortran.dg/g77/f77-edit-t-out.f: Likewise
......
struct a { char *b; } c[D] /* { dg-error "undeclared" } */ struct a { char *b; } c[D] /* { dg-error "undeclared" } */
= /* { dg-error "storage size" } */ = { { "" } } ; /* { dg-warning "braces around scalar initializer|near" } */
{ { "" } } ; /* { dg-warning "braces around scalar initializer|near" } */
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