https://gcc.gnu.org/g:e0ab5ee9bed5cbad9ae344a23ff0d302b8279d32

commit r15-940-ge0ab5ee9bed5cbad9ae344a23ff0d302b8279d32
Author: Marc Poulhiès <poulh...@adacore.com>
Date:   Thu May 23 11:57:54 2024 +0200

    fix: valid compiler optimization may fail the test
    
    cxa4001 may fail with "Exception not raised" when the compiler omits the
    calls to To_Mapping, in accordance with 10.2.1(18/3):
    
      "If a library unit is declared pure, then the implementation is
      permitted to omit a call on a library-level subprogram of the library
      unit if the results are not needed after the call"
    
    Using the result of both To_Mapping calls prevents the compiler from
    omitting them.
    
    "The corrected test will be available on the ACAA web site
    (http://www.ada-auth.org/), and will be issued with the Modified Tests List
    version 2.6K, 3.1DD, and 4.1GG."
    
    gcc/testsuite/ChangeLog:
    
            * ada/acats/tests/cxa/cxa4001.a: Use function result.

Diff:
---
 gcc/testsuite/ada/acats/tests/cxa/cxa4001.a | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a 
b/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a
index d850acd4a72..52fabc3d514 100644
--- a/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a
+++ b/gcc/testsuite/ada/acats/tests/cxa/cxa4001.a
@@ -185,6 +185,12 @@ begin
       begin
          Bad_Map := Maps.To_Mapping(From => "aa", To => "yz");
          Report.Failed("Exception not raised with repeated character");
+
+         if Report.Equal (Character'Pos('y'),
+                          Character'Pos(Maps.Value(Bad_Map, 'a'))) then
+            -- Use the map to avoid optimization.
+            Report.Comment ("Shouldn't get here.");
+         end if;
       exception
          when Translation_Error => null;  -- OK
          when others            => 
@@ -200,6 +206,12 @@ begin
       begin
          Bad_Map := Maps.To_Mapping("abc", "yz");
          Report.Failed("Exception not raised with unequal parameter lengths");
+
+         if Report.Equal (Character'Pos('y'),
+                          Character'Pos(Maps.Value(Bad_Map, 'a'))) then
+            -- Use the map to avoid optimization.
+            Report.Comment ("Shouldn't get here.");
+         end if;
       exception
          when Translation_Error => null;  -- OK
          when others            =>

Reply via email to