[pushed] PR modula2/125512: Candidate for spell checking missed when using qualified ident

Message ID 20260603080202.4031112-1-gaiusmod2@gmail.com
State Committed
Headers
Series [pushed] PR modula2/125512: Candidate for spell checking missed when using qualified ident |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap fail Patch failed to apply

Commit Message

Gaius Mulley June 3, 2026, 8:02 a.m. UTC
  This bug fix checks the qualified ident processing for spell checking
candidates.

gcc/m2/ChangeLog:

	PR modula2/125512
	* gm2-compiler/P3Build.bnf (SubDesignator): Rewrite to
	include spell checking.

gcc/testsuite/ChangeLog:

	PR modula2/125512
	* gm2.dg/spell/iso/fail/badmodule.mod: New test.
	* gm2.dg/spell/iso/fail/badrecord.mod: New test.
	* gm2.dg/spell/iso/fail/color.def: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
---
 gcc/m2/gm2-compiler/P3Build.bnf               | 31 +++++++++++++------
 .../gm2.dg/spell/iso/fail/badmodule.mod       | 17 ++++++++++
 .../gm2.dg/spell/iso/fail/badrecord.mod       | 20 ++++++++++++
 gcc/testsuite/gm2.dg/spell/iso/fail/color.def |  5 +++
 4 files changed, 63 insertions(+), 10 deletions(-)
 create mode 100644 gcc/testsuite/gm2.dg/spell/iso/fail/badmodule.mod
 create mode 100644 gcc/testsuite/gm2.dg/spell/iso/fail/badrecord.mod
 create mode 100644 gcc/testsuite/gm2.dg/spell/iso/fail/color.def
  

Patch

diff --git a/gcc/m2/gm2-compiler/P3Build.bnf b/gcc/m2/gm2-compiler/P3Build.bnf
index e1e96249ce7..ae067c4a02a 100644
--- a/gcc/m2/gm2-compiler/P3Build.bnf
+++ b/gcc/m2/gm2-compiler/P3Build.bnf
@@ -54,7 +54,7 @@  FROM DynamicStrings IMPORT String, InitString, KillString, Mark, ConCat, ConCatC
 FROM M2Printf IMPORT printf0, printf1 ;
 FROM M2Debug IMPORT Assert ;
 FROM P2SymBuild IMPORT BuildString, BuildNumber ;
-FROM M2MetaError IMPORT MetaErrorT0, MetaErrorT2 ;
+FROM M2MetaError IMPORT MetaErrorT0, MetaErrorT1, MetaErrorT2 ;
 FROM M2CaseList IMPORT ElseCase ;
 FROM M2StackSpell IMPORT GetRecordField ;
 
@@ -174,8 +174,9 @@  FROM SymbolTable IMPORT MakeGnuAsm, PutGnuAsmVolatile, PutGnuAsm, PutGnuAsmInput
                         PutIncluded,
                         IsVarParam, IsProcedure, IsDefImp, IsModule, IsProcType,
                         IsRecord,
-                        RequestSym, IsExported, IsImported,
-                        GetSym, GetLocalSym ;
+                        RequestSym, IsExported, IsImported, IsUnknown,
+                        GetSym, GetLocalSym,
+			UnknownReported ;
 
 FROM M2Batch IMPORT IsModuleKnown ;
 
@@ -1115,25 +1116,35 @@  Designator := QualidentCheck                                               % Che
               { SubDesignator } =:
 
 SubDesignator := "."                                                       % VAR Sym, Type, tok,
-                                                                                 dotpostok     : CARDINAL ;
-                                                                                 name, n1      : Name ; %
+                                                                                 dotpostok: CARDINAL ;
+                                                                                 name     : Name ; %
                                                                            % dotpostok := GetTokenNo () -1 ;
                                                                              PopTFtok (Sym, Type, tok) ;
                                                                              Type := SkipType(Type) ;
                                                                              PushTFtok(Sym, Type, tok) ;
                                                                              IF Type=NulSym
                                                                              THEN
-                                                                                n1 := GetSymName(Sym) ;
                                                                                 IF IsModuleKnown(GetSymName(Sym))
                                                                                 THEN
-                                                                                   WriteFormat2('%a looks like a module which has not been globally imported (eg. suggest that you IMPORT %a)',
-                                                                                   n1, n1)
+                                                                                   MetaErrorT1 (tok, '{%1a} looks like a module which has not been globally imported (eg. suggest that you IMPORT {%1a}', Sym)
                                                                                 ELSE
-                                                                                   WriteFormat1('%a is not a record variable', n1)
+                                                                                   IF IsUnknown (Sym)
+										   THEN
+                                                                                      MetaErrorT1 (tok, 'the qualifier {%1Ua} is unknown {%1&siD}', Sym) ;
+                                                                                      UnknownReported (Sym)
+										   ELSE
+                                                                                      MetaErrorT1 (tok, "the type of {%1ad} is not a record (but {%1tad})", Sym)
+                                                                                   END
                                                                                 END
                                                                              ELSIF NOT IsRecord(Type)
                                                                              THEN
-                                                                                MetaErrorT2 (tok, "the type of {%1ad} is not a record (but {%2ad}) and therefore it has no field", Sym, Type) ;
+										IF IsUnknown (Type)
+										THEN
+                                                                                   MetaErrorT1 (tok, 'the qualifier {%1Ua} is unknown {%1&siD}', Type) ;
+                                                                                   UnknownReported (Type)
+										ELSE
+                                                                                   MetaErrorT2 (tok, "the type of {%1ad} is not a record (but {%2ad}) and therefore it has no field", Sym, Type)
+										END
                                                                              END ;
                                                                              StartScope(Type) %
                  Ident
diff --git a/gcc/testsuite/gm2.dg/spell/iso/fail/badmodule.mod b/gcc/testsuite/gm2.dg/spell/iso/fail/badmodule.mod
new file mode 100644
index 00000000000..9e1972bd1bd
--- /dev/null
+++ b/gcc/testsuite/gm2.dg/spell/iso/fail/badmodule.mod
@@ -0,0 +1,17 @@ 
+
+(* { dg-do compile } *)
+(* { dg-options "-g" } *)
+
+MODULE badmodule ;
+
+IMPORT color ;
+
+PROCEDURE Init ;
+BEGIN
+   colors.Clear
+(* { dg-error "the qualifier 'colors' is unknown, did you mean color?" "colors" { target *-*-* } 11 } *)
+END Init ;
+
+BEGIN
+   Init
+END badmodule.
diff --git a/gcc/testsuite/gm2.dg/spell/iso/fail/badrecord.mod b/gcc/testsuite/gm2.dg/spell/iso/fail/badrecord.mod
new file mode 100644
index 00000000000..8d9b8ccba82
--- /dev/null
+++ b/gcc/testsuite/gm2.dg/spell/iso/fail/badrecord.mod
@@ -0,0 +1,20 @@ 
+
+(* { dg-do compile } *)
+(* { dg-options "-g" } *)
+
+MODULE badrecord ;
+
+TYPE
+   color = RECORD
+              red, blue, green: CARDINAL ;
+           END ;
+
+PROCEDURE Init ;
+BEGIN
+   colors.red := 1 ;
+(* { dg-error "the qualifier 'colors' is unknown, did you mean color?" "colors" { target *-*-* } 14 } *)
+END Init ;
+
+BEGIN
+   Init
+END badrecord.
diff --git a/gcc/testsuite/gm2.dg/spell/iso/fail/color.def b/gcc/testsuite/gm2.dg/spell/iso/fail/color.def
new file mode 100644
index 00000000000..25fe68b8216
--- /dev/null
+++ b/gcc/testsuite/gm2.dg/spell/iso/fail/color.def
@@ -0,0 +1,5 @@ 
+DEFINITION MODULE color ;
+
+PROCEDURE Clear ;
+
+END color.