diff options
author | Ghjuvan Lacambre <lacambre@adacore.com> | 2021-05-12 14:43:06 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-07-06 14:46:58 +0000 |
commit | 8ff47b3f88330ae222d393883d6b4a9c5393dc69 (patch) | |
tree | 6dd76f6808ff9e7c7030985107f66c0f6eb7ea67 | |
parent | d8870b1f64ae927e9469082490760b760ef5616f (diff) | |
download | gcc-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.adb | 26 |
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; |