aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorJustin Squirek <squirek@adacore.com>2018-07-31 09:56:04 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-07-31 09:56:04 +0000
commita7576e13569b4d6bce28c54ddb139a9119a713d8 (patch)
tree3e37d2614ba222b3374f877887dab68baff6c29a /gcc/ada
parent007443a0c1bb11ae55a43d562f070aba88a607c6 (diff)
downloadgcc-a7576e13569b4d6bce28c54ddb139a9119a713d8.zip
gcc-a7576e13569b4d6bce28c54ddb139a9119a713d8.tar.gz
gcc-a7576e13569b4d6bce28c54ddb139a9119a713d8.tar.bz2
[Ada] Wrong value after assignment of overlain record objects
This patch corrects an issue whereby objects of a record type with a representation clause which are overlain by address would fail to get assigned values properly when one or both of said objects were marked volatile. 2018-07-31 Justin Squirek <squirek@adacore.com> gcc/ada/ * exp_ch5.adb (Make_Field_Assign): Force temporarily generated objects for assignment of overlaid user objects to be renamings instead of constant declarations. gcc/testsuite/ * gnat.dg/addr11.adb: New testcase. From-SVN: r263098
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/exp_ch5.adb13
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 08fdfce..0d26bb5 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-31 Justin Squirek <squirek@adacore.com>
+
+ * exp_ch5.adb (Make_Field_Assign): Force temporarily generated
+ objects for assignment of overlaid user objects to be renamings
+ instead of constant declarations.
+
2018-07-31 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch9.adb (Analyze_Pragmas): New routine.
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb
index f2a2668..7a373ab 100644
--- a/gcc/ada/exp_ch5.adb
+++ b/gcc/ada/exp_ch5.adb
@@ -1531,11 +1531,22 @@ package body Exp_Ch5 is
Selector_Name => New_Occurrence_Of (Disc, Loc));
end if;
+ -- Generate the assignment statement. When the left-hand side
+ -- is an object with an address clause present, force generated
+ -- temporaries to be renamings so as to correctly assign to any
+ -- overlaid objects.
+
A :=
Make_Assignment_Statement (Loc,
Name =>
Make_Selected_Component (Loc,
- Prefix => Duplicate_Subexpr (Lhs),
+ Prefix =>
+ Duplicate_Subexpr
+ (Exp => Lhs,
+ Name_Req => False,
+ Renaming_Req =>
+ Is_Entity_Name (Lhs)
+ and then Present (Address_Clause (Entity (Lhs)))),
Selector_Name =>
New_Occurrence_Of (Find_Component (L_Typ, C), Loc)),
Expression => Expr);