This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
patch (1/2) for cpplib and Fortran [committed]
- To: gcc-patches at gcc dot gnu dot org
- Subject: patch (1/2) for cpplib and Fortran [committed]
- From: Zack Weinberg <zack at wolery dot cumb dot org>
- Date: Tue, 11 Jan 2000 16:34:37 -0800
This patch is most of the fix for cpplib's troubles with Fortran (see the
discussion on gcc). It also corrects some problems that crop up when
processing assembly - e.g. arch/i386/kernel/head.S from the Linux kernel.
The rest of the fix touches files outside cpplib, and will come separately.
zw
2000-01-11 16:24 -0800 Zack Weinberg <zack@wolery.cumb.org>
* cpplib.h (struct cpp_options): Change lang_asm to char.
Add lang_fortran.
* cppinit.c (builtin_array): Take out __STDC_VERSION__, it's
done in cpp_handle_option now.
(initialize_builtins): Take out special case code used only by
__STDC_VERSION__.
(cpp_handle_option): Turn off trigraphs and trigraph warnings
if -traditional. Recognize -lang-fortran and set
lang_fortran, also turn off cplusplus_comments.
(print_help): Document -lang-fortran.
* cpplib.c (handle_directive): Ignore `# 123 "file"' if
lang_asm. Ignore all directives other than `# 123 "file"' if
CPP_PREPROCESSED.
(cpp_get_token): If -traditional, don't recognize directives
unless the # is in column 1.
(parse_string): If lang_fortran or lang_asm, silently
terminate strings ('' or "") at end of line.
Remove unnecessary braces.
===================================================================
Index: cpplib.h
--- cpplib.h 1999/10/29 04:31:14 1.44
+++ cpplib.h 2000/01/12 00:24:30
@@ -346,10 +346,18 @@ struct cpp_options {
char objc;
- /* Nonzero means this is an assembly file, and allow
- unknown directives, which could be comments. */
+ /* Nonzero means this is an assembly file, so ignore unrecognized
+ directives and the "# 33" form of #line, both of which are
+ probably comments. Also, permit unbalanced ' strings (again,
+ likely to be in comments). */
- int lang_asm;
+ char lang_asm;
+
+ /* Nonzero means this is Fortran, and we don't know where the
+ comments are, so permit unbalanced ' strings. Unlike lang_asm,
+ this does not ignore unrecognized directives. */
+
+ char lang_fortran;
/* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
===================================================================
Index: cppinit.c
--- cppinit.c 2000/01/07 00:16:50 1.29
+++ cppinit.c 2000/01/12 00:24:30
@@ -496,8 +496,6 @@ cpp_cleanup (pfile)
VALUE (if any). FLAGS tweaks the behavior a little:
DUMP write debug info for this macro
STDC define only if not -traditional
- C89 define only if -lang-c89
- C9X define only if -lang-c9x
ULP value is the global user_label_prefix (which can't be
put directly into the table).
*/
@@ -511,8 +509,6 @@ struct builtin
};
#define DUMP 0x01
#define STDC 0x02
-#define C89 0x04
-#define C9X 0x08
#define ULP 0x10
static const struct builtin builtin_array[] =
@@ -536,8 +532,6 @@ static const struct builtin builtin_arra
{ "__PTRDIFF_TYPE__", PTRDIFF_TYPE, T_CONST, DUMP },
#endif
{ "__WCHAR_TYPE__", WCHAR_TYPE, T_CONST, DUMP },
- { "__STDC_VERSION__", "199409L", T_CONST, DUMP|STDC|C89 },
- { "__STDC_VERSION__", "199909L", T_CONST, DUMP|STDC|C9X },
{ 0, 0, 0, 0 }
};
@@ -555,10 +549,6 @@ initialize_builtins (pfile)
{
if ((b->flags & STDC) && CPP_TRADITIONAL (pfile))
continue;
- if ((b->flags & C89) && CPP_OPTIONS (pfile)->c9x)
- continue;
- if ((b->flags & C9X) && !CPP_OPTIONS (pfile)->c9x)
- continue;
val = (b->flags & ULP) ? user_label_prefix : b->value;
len = strlen (b->name);
@@ -571,8 +561,6 @@ initialize_builtins (pfile)
}
#undef DUMP
#undef STDC
-#undef C89
-#undef C9X
#undef ULP
/* Another subroutine of cpp_start_read. This one sets up to do
@@ -1312,6 +1300,8 @@ cpp_handle_option (pfile, argc, argv)
{
opts->traditional = 1;
opts->cplusplus_comments = 0;
+ opts->trigraphs = 0;
+ opts->warn_trigraphs = 0;
}
else if (!strcmp (argv[i], "-trigraphs"))
opts->trigraphs = 1;
@@ -1339,6 +1329,8 @@ cpp_handle_option (pfile, argc, argv)
opts->c9x = 0, opts->objc = 1;
if (! strcmp (argv[i], "-lang-asm"))
opts->lang_asm = 1;
+ if (! strcmp (argv[i], "-lang-fortran"))
+ opts->lang_fortran = 1, opts->cplusplus_comments = 0;
if (! strcmp (argv[i], "-lint"))
opts->for_lint = 1;
if (! strcmp (argv[i], "-lang-chill"))
@@ -1722,6 +1714,7 @@ print_help ()
-lang-objc Assume that the input sources are in ObjectiveC\n\
-lang-objc++ Assume that the input sources are in ObjectiveC++\n\
-lang-asm Assume that the input sources are in assembler\n\
+ -lang-fortran Assume that the input sources are in Fortran\n\
-lang-chill Assume that the input sources are in Chill\n\
-std=<std name> Specify the conformance standard; one of:\n\
gnu89, gnu9x, c89, c9x, iso9899:1990,\n\
===================================================================
Index: cpplib.c
--- cpplib.c 1999/10/29 04:31:13 1.96
+++ cpplib.c 2000/01/12 00:24:31
@@ -527,11 +527,18 @@ handle_directive (pfile)
cpp_skip_hspace (pfile);
c = PEEKC ();
+ /* # followed by a number is equivalent to #line. Do not recognize
+ this form in assembly language source files. Complain about this
+ form if we're being pedantic, but not if this is regurgitated
+ input (preprocessed or fed back in by the C++ frontend). */
if (c >= '0' && c <= '9')
{
- /* Handle # followed by a line number. Complain about using that
- form if we're being pedantic, but not if this is regurgitated
- input (preprocessed or fed back in by the C++ frontend). */
+ if (CPP_OPTIONS (pfile)->lang_asm)
+ {
+ skip_rest_of_line (pfile);
+ return 1;
+ }
+
if (CPP_PEDANTIC (pfile)
&& ! CPP_PREPROCESSED (pfile)
&& ! CPP_BUFFER (pfile)->manual_pop)
@@ -540,6 +547,11 @@ handle_directive (pfile)
return 1;
}
+ /* If we are rescanning preprocessed input, don't obey any directives
+ other than # nnn. */
+ if (CPP_PREPROCESSED (pfile))
+ return 0;
+
/* Now find the directive name. */
CPP_PUTC (pfile, '#');
parse_name (pfile, GETC());
@@ -2388,6 +2400,12 @@ cpp_get_token (pfile)
if (!pfile->only_seen_white)
goto randomchar;
+ /* -traditional directives are recognized only with the # in
+ column 1.
+ XXX Layering violation. */
+ if (CPP_TRADITIONAL (pfile)
+ && CPP_BUFFER (pfile)->cur - CPP_BUFFER (pfile)->line_base != 1)
+ goto randomchar;
if (handle_directive (pfile))
return CPP_DIRECTIVE;
pfile->only_seen_white = 0;
@@ -2872,9 +2890,17 @@ parse_string (pfile, c)
case '\n':
CPP_BUMP_LINE (pfile);
pfile->lineno++;
+
+ /* In Fortran and assembly language, silently terminate
+ strings of either variety at end of line. This is a
+ kludge around not knowing where comments are in these
+ languages. */
+ if (CPP_OPTIONS (pfile)->lang_fortran
+ || CPP_OPTIONS (pfile)->lang_asm)
+ return;
/* Character constants may not extend over multiple lines.
- In ANSI, neither may strings. We accept multiline strings
- as an extension. */
+ In Standard C, neither may strings. We accept multiline
+ strings as an extension. */
if (c == '\'')
{
cpp_error_with_line (pfile, start_line, start_column,
@@ -2882,10 +2908,8 @@ parse_string (pfile, c)
return;
}
if (CPP_PEDANTIC (pfile) && pfile->multiline_string_line == 0)
- {
- cpp_pedwarn_with_line (pfile, start_line, start_column,
- "string constant runs past end of line");
- }
+ cpp_pedwarn_with_line (pfile, start_line, start_column,
+ "string constant runs past end of line");
if (pfile->multiline_string_line == 0)
pfile->multiline_string_line = start_line;
break;