diff options
author | Ronan Desplanques <desplanques@adacore.com> | 2024-02-02 18:08:57 +0100 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-05-14 10:19:51 +0200 |
commit | 821772478bdc8cb52249aa561975e4ff6aa7792f (patch) | |
tree | 283d2d229c67b38a77a25ccae00fecb172efaa71 /gcc | |
parent | 4dd6f75e35065f2f0732c4cfbaf412b50c51e26e (diff) | |
download | gcc-821772478bdc8cb52249aa561975e4ff6aa7792f.zip gcc-821772478bdc8cb52249aa561975e4ff6aa7792f.tar.gz gcc-821772478bdc8cb52249aa561975e4ff6aa7792f.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/style.adb | 81 | ||||
-rw-r--r-- | gcc/ada/style.ads | 3 | ||||
-rw-r--r-- | gcc/ada/styleg.adb | 83 | ||||
-rw-r--r-- | 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 e73bfdd..aaa668a 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 dc8b337..c0925e9 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 5c439c9..287589f 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 c86bfb4..9028e85 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 |