This patch prevents spurious ineffective use_clause warnings in certain cases
due to the possible rewritting of nodes within boolean expressions.
Tested on x86_64-pc-linux-gnu, committed on trunk
2017-11-16 Justin Squirek <[email protected]>
* sem.adb (Analyze): Remove requirement that the original node of N be
an operator in the case that analysis on the node yields the relevant
operator - so prefer it instead.
Index: sem.adb
===================================================================
--- sem.adb (revision 254797)
+++ sem.adb (working copy)
@@ -740,18 +740,33 @@
Debug_A_Exit ("analyzing ", N, " (done)");
- -- Mark relevant use-type and use-package clauses as effective using the
- -- original node, because constant folding may have occurred and removed
- -- references that need to be examined. If the node in question is
- -- overloaded then this is deferred until resolution.
+ -- Mark relevant use-type and use-package clauses as effective
+ -- preferring the original node over the analyzed one in the case that
+ -- constant folding has occurred and removed references that need to be
+ -- examined. Also, if the node in question is overloaded then this is
+ -- deferred until resolution.
- if Nkind (Original_Node (N)) in N_Op
- and then Present (Entity (Original_Node (N)))
- and then not Is_Overloaded (Original_Node (N))
- then
- Mark_Use_Clauses (Original_Node (N));
- end if;
+ declare
+ Operat : Node_Id := Empty;
+ begin
+ -- Attempt to obtain a checkable operator node
+ if Nkind (Original_Node (N)) in N_Op then
+ Operat := Original_Node (N);
+ elsif Nkind (N) in N_Op then
+ Operat := N;
+ end if;
+
+ -- Mark the operator
+
+ if Present (Operat)
+ and then Present (Entity (Operat))
+ and then not Is_Overloaded (Operat)
+ then
+ Mark_Use_Clauses (Operat);
+ end if;
+ end;
+
-- Now that we have analyzed the node, we call the expander to perform
-- possible expansion. We skip this for subexpressions, because we don't
-- have the type yet, and the expander will need to know the type before