public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-9709] PR modula2/114517 gm2 does not allow comparison operator hash in column one
@ 2024-03-28 14:58 Gaius Mulley
0 siblings, 0 replies; only message in thread
From: Gaius Mulley @ 2024-03-28 14:58 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:04799f03e8d01b903295ef3a100a0117b7ddbf5e
commit r14-9709-g04799f03e8d01b903295ef3a100a0117b7ddbf5e
Author: Gaius Mulley <(no_default)>
Date: Thu Mar 28 14:57:49 2024 +0000
PR modula2/114517 gm2 does not allow comparison operator hash in column one
This patch allows -fno-cpp to be supplied to gm2. Without this patch
it causes an ICE. The patch allows -fno-cpp to turn off cpp flags.
These are tested in m2.flex to decide whether a change of state is
allowed (enabling handling of #line directives).
gcc/ChangeLog:
PR modula2/114517
* doc/gm2.texi: Mention gm2 treats a # in the first column
as a preprocessor directive unless -fno-cpp is supplied.
gcc/m2/ChangeLog:
PR modula2/114517
* gm2-compiler/M2Options.def (SetCpp): Add comment.
(GetCpp): Move after SetCpp.
(GetLineDirectives): New procedure function.
* gm2-compiler/M2Options.mod (GetLineDirectives): New
procedure function.
* gm2-gcc/m2options.h (M2Options_GetLineDirectives): New
prototype.
* gm2-lang.cc (gm2_langhook_init_options): OPT_fcpp only
assert if !value.
* m2.flex: Test GetLineDirectives before changing to LINE0
state.
gcc/testsuite/ChangeLog:
PR modula2/114517
* gm2/cpp/fail/hashfirstcolumn2.mod: New test.
* gm2/imports/fail/imports-fail.exp: New test.
* gm2/imports/fail/localmodule2.mod: New test.
* gm2/imports/run/pass/localmodule.mod: New test.
Signed-off-by: Gaius Mulley <(no_default)>
Diff:
---
gcc/doc/gm2.texi | 3 +-
gcc/m2/gm2-compiler/M2Options.def | 36 +++++++++++++---------
gcc/m2/gm2-compiler/M2Options.mod | 10 ++++++
gcc/m2/gm2-gcc/m2options.h | 1 +
gcc/m2/gm2-lang.cc | 3 +-
gcc/m2/m2.flex | 10 ++++--
gcc/testsuite/gm2/cpp/fail/hashfirstcolumn2.mod | 18 +++++++++++
gcc/testsuite/gm2/imports/fail/imports-fail.exp | 36 ++++++++++++++++++++++
gcc/testsuite/gm2/imports/fail/localmodule2.mod | 27 ++++++++++++++++
gcc/testsuite/gm2/imports/run/pass/localmodule.mod | 27 ++++++++++++++++
10 files changed, 153 insertions(+), 18 deletions(-)
diff --git a/gcc/doc/gm2.texi b/gcc/doc/gm2.texi
index 028a0715f64..9f6d4140e42 100644
--- a/gcc/doc/gm2.texi
+++ b/gcc/doc/gm2.texi
@@ -1657,7 +1657,8 @@ The preprocessor @samp{cpp} can be invoked via the @samp{-fcpp}
command line option. This in turn invokes @samp{cpp} with the
following arguments @samp{-traditional -lang-asm}. These options
preserve comments and all quotations. @samp{gm2} treats a @samp{#}
-character in the first column as a preprocessor directive.
+character in the first column as a preprocessor directive unless
+@samp{-fno-cpp} is supplied.
For example here is a module which calls @code{FatalError}
via the macro @code{ERROR}.
diff --git a/gcc/m2/gm2-compiler/M2Options.def b/gcc/m2/gm2-compiler/M2Options.def
index 90b5178f88a..e4ebf41802f 100644
--- a/gcc/m2/gm2-compiler/M2Options.def
+++ b/gcc/m2/gm2-compiler/M2Options.def
@@ -328,6 +328,28 @@ PROCEDURE SetObj (arg: ADDRESS) ;
PROCEDURE GetObj () : ADDRESS ;
+(*
+ SetCpp - enables the source to be preprocessed and enables the
+ recognition of C preprocessor line directives.
+*)
+
+PROCEDURE SetCpp (value: BOOLEAN) : BOOLEAN ;
+
+
+(*
+ GetCpp - returns TRUE if the C preprocessor was used.
+*)
+
+PROCEDURE GetCpp () : BOOLEAN ;
+
+
+(*
+ GetLineDirectives - returns TRUE if line directives are allowed.
+*)
+
+PROCEDURE GetLineDirectives () : BOOLEAN ;
+
+
(*
SetScaffoldDynamic - set the -fscaffold-dynamic flag.
*)
@@ -467,20 +489,6 @@ PROCEDURE SetQuiet (value: BOOLEAN) : BOOLEAN ;
PROCEDURE SetCC1Quiet (value: BOOLEAN) ;
-(*
- SetCpp -
-*)
-
-PROCEDURE SetCpp (value: BOOLEAN) : BOOLEAN ;
-
-
-(*
- GetCpp - returns TRUE if the C preprocessor was used.
-*)
-
-PROCEDURE GetCpp () : BOOLEAN ;
-
-
(*
SetM2g - set the -fm2-g flag.
*)
diff --git a/gcc/m2/gm2-compiler/M2Options.mod b/gcc/m2/gm2-compiler/M2Options.mod
index 30203158e5c..b0de8cdfe82 100644
--- a/gcc/m2/gm2-compiler/M2Options.mod
+++ b/gcc/m2/gm2-compiler/M2Options.mod
@@ -672,6 +672,16 @@ BEGIN
END GetCpp ;
+(*
+ GetLineDirectives - returns TRUE if line directives are allowed.
+*)
+
+PROCEDURE GetLineDirectives () : BOOLEAN ;
+BEGIN
+ RETURN LineDirectives
+END GetLineDirectives ;
+
+
(*
SetPPOnly - set the PPonly (preprocess only) to value.
*)
diff --git a/gcc/m2/gm2-gcc/m2options.h b/gcc/m2/gm2-gcc/m2options.h
index a03fdc5975f..4b3a23f18db 100644
--- a/gcc/m2/gm2-gcc/m2options.h
+++ b/gcc/m2/gm2-gcc/m2options.h
@@ -104,6 +104,7 @@ EXTERN void M2Options_FinaliseOptions (void);
EXTERN void M2Options_SetDebugFunctionLineNumbers (bool value);
EXTERN void M2Options_SetGenerateStatementNote (bool value);
EXTERN bool M2Options_GetCpp (void);
+EXTERN bool M2Options_GetLineDirectives (void);
EXTERN bool M2Options_GetM2g (void);
EXTERN bool M2Options_SetM2g (bool value);
EXTERN bool M2Options_SetLowerCaseKeywords (bool value);
diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc
index bde68368e1f..fc70fbb50bf 100644
--- a/gcc/m2/gm2-lang.cc
+++ b/gcc/m2/gm2-lang.cc
@@ -193,7 +193,8 @@ gm2_langhook_init_options (unsigned int decoded_options_count,
switch (code)
{
case OPT_fcpp:
- gcc_checking_assert (building_cpp_command);
+ if (value)
+ gcc_checking_assert (building_cpp_command);
break;
case OPT_fcpp_begin:
in_cpp_args = true;
diff --git a/gcc/m2/m2.flex b/gcc/m2/m2.flex
index e8ee383878e..d874db9dae2 100644
--- a/gcc/m2/m2.flex
+++ b/gcc/m2/m2.flex
@@ -160,8 +160,14 @@ extern void yylex (void);
<COMMENTC>. { updatepos(); skippos(); }
<COMMENTC>\n.* { consumeLine(); }
<COMMENTC>"*/" { endOfCComment(); }
-^\#.* { consumeLine(); /* printf("found: %s\n", currentLine->linebuf); */ BEGIN LINE0; }
-\n\#.* { consumeLine(); /* printf("found: %s\n", currentLine->linebuf); */ BEGIN LINE0; }
+^\#.* { consumeLine(); /* printf("found: %s\n", currentLine->linebuf); */
+ if (M2Options_GetLineDirectives ())
+ BEGIN LINE0;
+ }
+\n\#.* { consumeLine(); /* printf("found: %s\n", currentLine->linebuf); */
+ if (M2Options_GetLineDirectives ())
+ BEGIN LINE0;
+ }
<LINE0>\#[ \t]* { updatepos(); }
<LINE0>[0-9]+[ \t]*\" { updatepos(); lineno=atoi(yytext); BEGIN LINE1; }
<LINE0>\n { m2flex_M2Error("missing initial quote after #line directive"); resetpos(); BEGIN INITIAL; }
diff --git a/gcc/testsuite/gm2/cpp/fail/hashfirstcolumn2.mod b/gcc/testsuite/gm2/cpp/fail/hashfirstcolumn2.mod
new file mode 100644
index 00000000000..34f63c96827
--- /dev/null
+++ b/gcc/testsuite/gm2/cpp/fail/hashfirstcolumn2.mod
@@ -0,0 +1,18 @@
+MODULE hashfirstcolumn2 ;
+
+FROM libc IMPORT printf, exit ;
+
+VAR
+ x, y: CARDINAL ;
+BEGIN
+ x := 1 ;
+ y := 2 ;
+ IF x
+# y
+ THEN
+ printf ("success\n");
+ ELSE
+ printf ("failure\n");
+ exit (1)
+ END
+END hashfirstcolumn2.
diff --git a/gcc/testsuite/gm2/imports/fail/imports-fail.exp b/gcc/testsuite/gm2/imports/fail/imports-fail.exp
new file mode 100644
index 00000000000..0ba5e0c6640
--- /dev/null
+++ b/gcc/testsuite/gm2/imports/fail/imports-fail.exp
@@ -0,0 +1,36 @@
+# Copyright (C) 2024 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# This file was written by Gaius Mulley (gaius.mulley@southwales.ac.uk)
+# for GNU Modula-2.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# load support procs
+load_lib gm2-torture.exp
+
+gm2_init_pim "${srcdir}/gm2/pim/fail ${srcdir}/gm2/imports/fail"
+
+foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.mod]] {
+ # If we're only testing specific files and this isn't one of them, skip it.
+ if ![runtest_file_p $runtests $testcase] then {
+ continue
+ }
+
+ gm2-torture-fail $testcase
+}
diff --git a/gcc/testsuite/gm2/imports/fail/localmodule2.mod b/gcc/testsuite/gm2/imports/fail/localmodule2.mod
new file mode 100644
index 00000000000..469965ace8d
--- /dev/null
+++ b/gcc/testsuite/gm2/imports/fail/localmodule2.mod
@@ -0,0 +1,27 @@
+MODULE localmodule2 ;
+
+FROM libc IMPORT printf ;
+
+PROCEDURE mult2 (n: CARDINAL) : CARDINAL ;
+BEGIN
+ RETURN 2*n
+END mult2 ;
+
+MODULE local ;
+
+ EXPORT mysqr ;
+ IMPORT mult2 ;
+
+ PROCEDURE mysqr (n: CARDINAL) : CARDINAL ;
+ BEGIN
+ RETURN mult2 (n) * mult2 (n)
+ END mysqr ;
+
+END local ;
+
+VAR
+ d: CARDINAL ;
+BEGIN
+ d := mysqr (3) ;
+ printf ("sqr (3 * 2) = %d\n", d)
+END localmodule2.
diff --git a/gcc/testsuite/gm2/imports/run/pass/localmodule.mod b/gcc/testsuite/gm2/imports/run/pass/localmodule.mod
new file mode 100644
index 00000000000..07c5cc11c7b
--- /dev/null
+++ b/gcc/testsuite/gm2/imports/run/pass/localmodule.mod
@@ -0,0 +1,27 @@
+MODULE localmodule ;
+
+FROM libc IMPORT printf ;
+
+PROCEDURE mult2 (n: CARDINAL) : CARDINAL ;
+BEGIN
+ RETURN 2*n
+END mult2 ;
+
+MODULE local ;
+
+ IMPORT mult2 ;
+ EXPORT mysqr ;
+
+ PROCEDURE mysqr (n: CARDINAL) : CARDINAL ;
+ BEGIN
+ RETURN mult2 (n) * mult2 (n)
+ END mysqr ;
+
+END local ;
+
+VAR
+ d: CARDINAL ;
+BEGIN
+ d := mysqr (3) ;
+ printf ("sqr (3 * 2) = %d\n", d)
+END localmodule.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2024-03-28 14:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-28 14:58 [gcc r14-9709] PR modula2/114517 gm2 does not allow comparison operator hash in column one Gaius Mulley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).