[gcc r15-448] ada: Fix crash with -gnatyB and -gnatdJ
Marc Poulhi?s
dkm@gcc.gnu.org
Tue May 14 08:23:09 GMT 2024
https://gcc.gnu.org/g:821772478bdc8cb52249aa561975e4ff6aa7792f
commit r15-448-g821772478bdc8cb52249aa561975e4ff6aa7792f
Author: Ronan Desplanques <desplanques@adacore.com>
Date: Fri Feb 2 18:08:57 2024 +0100
ada: Fix crash with -gnatyB and -gnatdJ
The crash this patch fixes happened because calling the Errout.Error_Msg
procedures that don't have an N parameter is not allowed when not
parsing and -gnatdJ is on. And -gnatyB style checks are not emitted during
parsing but during semantic analysis.
This commit moves Check_Boolean_Operator from Styleg to Style so it can
call Errout.Error_Msg with a Node_Id parameter. This change of package
makes sense because:
1. The compiler is currently the only user of Check_Boolean_Operator.
2. Other tools don't do semantic analysis, and so cannot possibly
know when to use Check_Boolean_Operator anyway.
gcc/ada/
* styleg.ads (Check_Boolean_Operator): Moved ...
* style.ads (Check_Boolean_Operator): ... here.
* styleg.adb (Check_Boolean_Operator): Moved ...
* style.adb (Check_Boolean_Operator): ... here. Also add node
parameter to call to Errout.Error_Msg.
Diff:
---
gcc/ada/style.adb | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++
gcc/ada/style.ads | 3 +-
gcc/ada/styleg.adb | 83 ------------------------------------------------------
gcc/ada/styleg.ads | 4 ---
4 files changed, 82 insertions(+), 89 deletions(-)
diff --git a/gcc/ada/style.adb b/gcc/ada/style.adb
index e73bfddb524c..aaa668aab000 100644
--- a/gcc/ada/style.adb
+++ b/gcc/ada/style.adb
@@ -94,6 +94,87 @@ package body Style is
end if;
end Check_Array_Attribute_Index;
+ ----------------------------
+ -- Check_Boolean_Operator --
+ ----------------------------
+
+ procedure Check_Boolean_Operator (Node : Node_Id) is
+
+ function OK_Boolean_Operand (N : Node_Id) return Boolean;
+ -- Returns True for simple variable, or "not X1" or "X1 and X2" or
+ -- "X1 or X2" where X1, X2 are recursively OK_Boolean_Operand's.
+
+ ------------------------
+ -- OK_Boolean_Operand --
+ ------------------------
+
+ function OK_Boolean_Operand (N : Node_Id) return Boolean is
+ begin
+ if Nkind (N) in N_Identifier | N_Expanded_Name then
+ return True;
+
+ elsif Nkind (N) = N_Op_Not then
+ return OK_Boolean_Operand (Original_Node (Right_Opnd (N)));
+
+ elsif Nkind (N) in N_Op_And | N_Op_Or then
+ return OK_Boolean_Operand (Original_Node (Left_Opnd (N)))
+ and then
+ OK_Boolean_Operand (Original_Node (Right_Opnd (N)));
+
+ else
+ return False;
+ end if;
+ end OK_Boolean_Operand;
+
+ -- Start of processing for Check_Boolean_Operator
+
+ begin
+ if Style_Check_Boolean_And_Or
+ and then Comes_From_Source (Node)
+ then
+ declare
+ Orig : constant Node_Id := Original_Node (Node);
+
+ begin
+ if Nkind (Orig) in N_Op_And | N_Op_Or then
+ declare
+ L : constant Node_Id := Original_Node (Left_Opnd (Orig));
+ R : constant Node_Id := Original_Node (Right_Opnd (Orig));
+
+ begin
+ -- First OK case, simple boolean constants/identifiers
+
+ if OK_Boolean_Operand (L)
+ and then
+ OK_Boolean_Operand (R)
+ then
+ return;
+
+ -- Second OK case, modular types
+
+ elsif Is_Modular_Integer_Type (Etype (Node)) then
+ return;
+
+ -- Third OK case, array types
+
+ elsif Is_Array_Type (Etype (Node)) then
+ return;
+
+ -- Otherwise we have an error
+
+ elsif Nkind (Orig) = N_Op_And then
+ Error_Msg -- CODEFIX
+ ("(style) `AND THEN` required?B?", Sloc (Orig), Orig);
+ else
+ Error_Msg -- CODEFIX
+ ("(style) `OR ELSE` required?B?", Sloc (Orig), Orig);
+ end if;
+ end;
+ end if;
+ end;
+ end if;
+ end Check_Boolean_Operator;
+
----------------------
-- Check_Identifier --
----------------------
diff --git a/gcc/ada/style.ads b/gcc/ada/style.ads
index dc8b337f2bd4..c0925e9ce345 100644
--- a/gcc/ada/style.ads
+++ b/gcc/ada/style.ads
@@ -90,8 +90,7 @@ package Style is
-- designator is a reserved word (access, digits, delta or range) to allow
-- differing rules for the two cases.
- procedure Check_Boolean_Operator (Node : Node_Id)
- renames Style_Inst.Check_Boolean_Operator;
+ procedure Check_Boolean_Operator (Node : Node_Id);
-- Called after resolving AND or OR node to check short circuit rules
procedure Check_Box
diff --git a/gcc/ada/styleg.adb b/gcc/ada/styleg.adb
index 5c439c9a0b24..287589f92da7 100644
--- a/gcc/ada/styleg.adb
+++ b/gcc/ada/styleg.adb
@@ -30,8 +30,6 @@
with Atree; use Atree;
with Casing; use Casing;
with Csets; use Csets;
-with Einfo; use Einfo;
-with Einfo.Utils; use Einfo.Utils;
with Err_Vars; use Err_Vars;
with Errout;
with Opt; use Opt;
@@ -194,87 +192,6 @@ package body Styleg is
end if;
end Check_Binary_Operator;
- ----------------------------
- -- Check_Boolean_Operator --
- ----------------------------
-
- procedure Check_Boolean_Operator (Node : Node_Id) is
-
- function OK_Boolean_Operand (N : Node_Id) return Boolean;
- -- Returns True for simple variable, or "not X1" or "X1 and X2" or
- -- "X1 or X2" where X1, X2 are recursively OK_Boolean_Operand's.
-
- ------------------------
- -- OK_Boolean_Operand --
- ------------------------
-
- function OK_Boolean_Operand (N : Node_Id) return Boolean is
- begin
- if Nkind (N) in N_Identifier | N_Expanded_Name then
- return True;
-
- elsif Nkind (N) = N_Op_Not then
- return OK_Boolean_Operand (Original_Node (Right_Opnd (N)));
-
- elsif Nkind (N) in N_Op_And | N_Op_Or then
- return OK_Boolean_Operand (Original_Node (Left_Opnd (N)))
- and then
- OK_Boolean_Operand (Original_Node (Right_Opnd (N)));
-
- else
- return False;
- end if;
- end OK_Boolean_Operand;
-
- -- Start of processing for Check_Boolean_Operator
-
- begin
- if Style_Check_Boolean_And_Or
- and then Comes_From_Source (Node)
- then
- declare
- Orig : constant Node_Id := Original_Node (Node);
-
- begin
- if Nkind (Orig) in N_Op_And | N_Op_Or then
- declare
- L : constant Node_Id := Original_Node (Left_Opnd (Orig));
- R : constant Node_Id := Original_Node (Right_Opnd (Orig));
-
- begin
- -- First OK case, simple boolean constants/identifiers
-
- if OK_Boolean_Operand (L)
- and then
- OK_Boolean_Operand (R)
- then
- return;
-
- -- Second OK case, modular types
-
- elsif Is_Modular_Integer_Type (Etype (Node)) then
- return;
-
- -- Third OK case, array types
-
- elsif Is_Array_Type (Etype (Node)) then
- return;
-
- -- Otherwise we have an error
-
- elsif Nkind (Orig) = N_Op_And then
- Error_Msg -- CODEFIX
- ("(style) `AND THEN` required?B?", Sloc (Orig));
- else
- Error_Msg -- CODEFIX
- ("(style) `OR ELSE` required?B?", Sloc (Orig));
- end if;
- end;
- end if;
- end;
- end if;
- end Check_Boolean_Operator;
-
---------------
-- Check_Box --
---------------
diff --git a/gcc/ada/styleg.ads b/gcc/ada/styleg.ads
index c86bfb4897e9..9028e85cc4ea 100644
--- a/gcc/ada/styleg.ads
+++ b/gcc/ada/styleg.ads
@@ -63,10 +63,6 @@ package Styleg is
-- the attribute designator is a reserved word (access, digits,
-- delta or range) to allow differing rules for the two cases.
- procedure Check_Boolean_Operator (Node : Node_Id);
- -- Node is a node for an AND or OR operator. Check that the usage meets
- -- the style rules.
-
procedure Check_Box;
-- Called after scanning out a box to check spacing
More information about the Gcc-cvs
mailing list