aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhjuvan Lacambre <lacambre@adacore.com>2021-05-12 14:43:06 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2021-07-06 14:46:58 +0000
commit8ff47b3f88330ae222d393883d6b4a9c5393dc69 (patch)
tree6dd76f6808ff9e7c7030985107f66c0f6eb7ea67
parentd8870b1f64ae927e9469082490760b760ef5616f (diff)
downloadgcc-8ff47b3f88330ae222d393883d6b4a9c5393dc69.zip
gcc-8ff47b3f88330ae222d393883d6b4a9c5393dc69.tar.gz
gcc-8ff47b3f88330ae222d393883d6b4a9c5393dc69.tar.bz2
[Ada] Warn on statically known empty loop caused by constraint
gcc/ada/ * sem_ch5.adb (Analyze_Loop_Parameter_Specification): Check for empty loops caused by constraints.
-rw-r--r--gcc/ada/sem_ch5.adb26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index 3c98d73..ccd5a37 100644
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -3377,6 +3377,32 @@ package body Sem_Ch5 is
("\loop executes zero times or raises "
& "Constraint_Error??", Bad_Bound);
end if;
+
+ if Compile_Time_Compare (LLo, LHi, Assume_Valid => False)
+ = GT
+ then
+ Error_Msg_N ("??constrained range is null",
+ Constraint (DS));
+
+ -- Additional constraints on modular types can be
+ -- confusing, add more information.
+
+ if Ekind (Etype (DS)) = E_Modular_Integer_Subtype then
+ Error_Msg_Uint_1 := Intval (LLo);
+ Error_Msg_Uint_2 := Intval (LHi);
+ Error_Msg_NE ("\iterator has modular type &, " &
+ "so the loop has bounds ^ ..^",
+ Constraint (DS),
+ Subtype_Mark (DS));
+ end if;
+
+ Set_Is_Null_Loop (Loop_Nod);
+ Null_Range := True;
+
+ -- Suppress other warnigns about the body of the loop, as
+ -- it will never execute.
+ Set_Suppress_Loop_Warnings (Loop_Nod);
+ end if;
end;
end if;