Some additional cases of internal routines are now detected and skip
predicate tests on arguments. Not clear if this fixes additional
problems or not, but it is certainly a desirable change. No further
test required.
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-07-30 Robert Dewar <[email protected]>
* sem_util.adb (Predicate_Tests_On_Arguments): Omit tests for
some additional cases of internally generated routines.
Index: sem_util.adb
===================================================================
--- sem_util.adb (revision 213212)
+++ sem_util.adb (working copy)
@@ -14723,32 +14723,42 @@
function Predicate_Tests_On_Arguments (Subp : Entity_Id) return Boolean is
begin
+ -- Always test predicates on indirect call
+
+ if Ekind (Subp) = E_Subprogram_Type then
+ return True;
+
-- Do not test predicates on call to generated default Finalize, since
-- we are not interested in whether something we are finalizing (and
-- typically destroying) satisfies its predicates.
- if Chars (Subp) = Name_Finalize
+ elsif Chars (Subp) = Name_Finalize
and then not Comes_From_Source (Subp)
then
return False;
- -- Do not test predicates on call to Init_Proc, since if needed the
- -- predicate test will occur at some other point.
+ -- Do not test predicates on any internally generated routines
+ elsif Is_Internal_Name (Chars (Subp)) then
+ return False;
+
+ -- Do not test predicates on call to Init_Proc, since if needed the
+ -- predicate test will occur at some other point.
+
elsif Is_Init_Proc (Subp) then
return False;
- -- Do not test predicates on call to predicate function, since this
- -- would cause infinite recursion.
+ -- Do not test predicates on call to predicate function, since this
+ -- would cause infinite recursion.
elsif Ekind (Subp) = E_Function
and then (Is_Predicate_Function (Subp)
- or else
+ or else
Is_Predicate_Function_M (Subp))
then
return False;
- -- For now, no other exceptions
+ -- For now, no other exceptions
else
return True;