[Ada] Build-in-place aggregates and Address clauses
authorBob Duff <duff@adacore.com>
Wed, 23 May 2018 10:21:53 +0000 (10:21 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 23 May 2018 10:21:53 +0000 (10:21 +0000)
This patch fixes a bug in which if a limited volatile variable with
an Address aspect is initialized with a build-in-place aggregate
containing build-in-place function calls, the compiler can crash.

2018-05-23  Bob Duff  <duff@adacore.com>

gcc/ada/

* freeze.adb: (Check_Address_Clause): Deal with build-in-place
aggregates in addition to build-in-place calls.

gcc/testsuite/

* gnat.dg/addr10.adb: New testcase.

From-SVN: r260574

gcc/ada/ChangeLog
gcc/ada/freeze.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/addr10.adb [new file with mode: 0644]

index 98720a3..f9ad159 100644 (file)
@@ -1,5 +1,10 @@
 2018-05-23  Bob Duff  <duff@adacore.com>
 
+       * freeze.adb: (Check_Address_Clause): Deal with build-in-place
+       aggregates in addition to build-in-place calls.
+
+2018-05-23  Bob Duff  <duff@adacore.com>
+
        * einfo.ads: Minor reformatting.
        * sem_ch3.adb: Likewise.
        * sinfo.ads: Likewise.
index 66f9dcc..032dcf5 100644 (file)
@@ -710,13 +710,12 @@ package body Freeze is
             end;
          end if;
 
-         --  Remove side effects from initial expression, except in the case
-         --  of a build-in-place call, which has its own later expansion.
+         --  Remove side effects from initial expression, except in the case of
+         --  limited build-in-place calls and aggregates, which have their own
+         --  expansion elsewhere. This exception is necessary to avoid copying
+         --  limited objects.
 
-         if Present (Init)
-           and then (Nkind (Init) /= N_Function_Call
-                      or else not Is_Expanded_Build_In_Place_Call (Init))
-         then
+         if Present (Init) and then not Is_Limited_View (Typ) then
             --  Capture initialization value at point of declaration, and make
             --  explicit assignment legal, because object may be a constant.
 
@@ -735,7 +734,7 @@ package body Freeze is
 
             Set_No_Initialization (Decl);
 
-            --  If the objet is tagged, check whether the tag must be
+            --  If the object is tagged, check whether the tag must be
             --  reassigned explicitly.
 
             Tag_Assign := Make_Tag_Assignment (Decl);
index 5a80e1d..b12fb9e 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-23  Bob Duff  <duff@adacore.com>
+
+       * gnat.dg/addr10.adb: New testcase.
+
 2018-05-23  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/85874
diff --git a/gcc/testsuite/gnat.dg/addr10.adb b/gcc/testsuite/gnat.dg/addr10.adb
new file mode 100644 (file)
index 0000000..16efa28
--- /dev/null
@@ -0,0 +1,24 @@
+--  { dg-do compile }
+
+with System;
+
+procedure Addr10 is
+   type Limited_Type is limited record
+      Element : Integer;
+   end record;
+
+   function Initial_State return Limited_Type is ((Element => 0));
+
+   type Double_Limited_Type is
+      record
+         A : Limited_Type;
+      end record;
+
+   Double_Limited : Double_Limited_Type :=
+      (A => Initial_State)
+   with
+      Volatile,
+      Address => System'To_Address (16#1234_5678#);
+begin
+   null;
+end Addr10;