aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/sem_dim.adb15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/dimensions2.adb20
-rw-r--r--gcc/testsuite/gnat.dg/dimensions2_phys.ads80
-rw-r--r--gcc/testsuite/gnat.dg/dimensions2_real_numbers.ads3
6 files changed, 126 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index c28a942..62f031c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2019-07-04 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_dim.adb (Analyze_Dimension_Array_Aggregate): If the
+ component is an entity name, its dimensions are those of its
+ type.
+
2019-07-03 Bob Duff <duff@adacore.com>
* doc/gnat_ugn/gnat_utility_programs.rst: Document new flags in
diff --git a/gcc/ada/sem_dim.adb b/gcc/ada/sem_dim.adb
index 43b1f23..26c8008 100644
--- a/gcc/ada/sem_dim.adb
+++ b/gcc/ada/sem_dim.adb
@@ -1233,8 +1233,9 @@ package body Sem_Dim is
Dims_Of_Comp_Typ : constant Dimension_Type := Dimensions_Of (Comp_Typ);
Exps : constant List_Id := Expressions (N);
- Comp : Node_Id;
- Expr : Node_Id;
+ Comp : Node_Id;
+ Dims_Of_Expr : Dimension_Type;
+ Expr : Node_Id;
Error_Detected : Boolean := False;
-- This flag is used in order to indicate if an error has been detected
@@ -1281,11 +1282,19 @@ package body Sem_Dim is
-- (may happen when an aggregate is converted into a positional
-- aggregate). We also must verify that this is a scalar component,
-- and not a subaggregate of a multidimensional aggregate.
+ -- The expression may be an identifier that has been copied several
+ -- times during expansion, its dimensions are those of its type.
+
+ if Is_Entity_Name (Expr) then
+ Dims_Of_Expr := Dimensions_Of (Etype (Expr));
+ else
+ Dims_Of_Expr := Dimensions_Of (Expr);
+ end if;
if Comes_From_Source (Original_Node (Expr))
and then Present (Etype (Expr))
and then Is_Numeric_Type (Etype (Expr))
- and then Dimensions_Of (Expr) /= Dims_Of_Comp_Typ
+ and then Dims_Of_Expr /= Dims_Of_Comp_Typ
and then Sloc (Comp) /= Sloc (Prev (Comp))
then
-- Check if an error has already been encountered so far
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9021bd7..7147482 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-07-04 Ed Schonberg <schonberg@adacore.com>
+
+ * gnat.dg/dimensions2.adb, gnat.dg/dimensions2_phys.ads,
+ gnat.dg/dimensions2_real_numbers.ads: New testcase.
+
2019-07-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91063
diff --git a/gcc/testsuite/gnat.dg/dimensions2.adb b/gcc/testsuite/gnat.dg/dimensions2.adb
new file mode 100644
index 0000000..630a44f
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/dimensions2.adb
@@ -0,0 +1,20 @@
+-- { dg-do compile }
+
+with Dimensions2_phys; use Dimensions2_phys;
+
+procedure Dimensions2 is
+
+ zero_flow : constant Volumetric_Flow := 0.0 * m**3 / h;
+ type Node_Flow_Scenario_T is array (Positive range <>)
+ of Volumetric_Flow with
+ default_component_value => zero_flow;
+ subtype Max_Node_Flow_Scenario_T
+ is Node_Flow_Scenario_T (Natural (1) .. 48);
+ flow_value_array : Max_Node_Flow_Scenario_T := (1..48 => zero_flow);
+ flow_value_array1 : Max_Node_Flow_Scenario_T
+ := (Max_Node_Flow_Scenario_T'Range=> zero_flow);
+ flow_value_array2 : Max_Node_Flow_Scenario_T := (others => zero_flow);
+
+begin
+ null;
+end Dimensions2;
diff --git a/gcc/testsuite/gnat.dg/dimensions2_phys.ads b/gcc/testsuite/gnat.dg/dimensions2_phys.ads
new file mode 100644
index 0000000..675352a
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/dimensions2_phys.ads
@@ -0,0 +1,80 @@
+with ada.numerics.generic_elementary_functions;
+with Dimensions2_real_numbers;
+
+package Dimensions2_Phys is
+
+ type si_type is new Dimensions2_real_numbers.Real with
+ dimension_system =>
+ ((unit_name => meter, unit_symbol => 'm', dim_symbol => 'L'),
+ (unit_name => kilogram, unit_symbol => "kg", dim_symbol => 'M'),
+ (unit_name => second, unit_symbol => 's', dim_symbol => 'T'),
+ (unit_name => ampere, unit_symbol => 'A', dim_symbol => 'I'),
+ (unit_name => kelvin, unit_symbol => 'K', dim_symbol => "Theta"),
+ (unit_name => mole, unit_symbol => "mol", dim_symbol => 'N'),
+ (unit_name => euro, unit_symbol => "EUR", dim_symbol => 'E'));
+
+ subtype distance is Si_Type with
+ dimension => (symbol => 'm', meter => 1, others => 0);
+
+ subtype mass is Si_Type with
+ dimension => (symbol => "kg", kilogram => 1, others => 0);
+
+ subtype time is Si_Type with
+ dimension => (symbol => 's', second => 1, others => 0);
+
+ subtype electric_current is Si_Type with
+ dimension => (symbol => 'A', ampere => 1, others => 0);
+
+ subtype temperature is Si_Type with
+ dimension => (symbol => 'K', kelvin => 1, others => 0);
+
+ subtype amount_of_substance is Si_Type with
+ dimension => (symbol => "mol", mole => 1, others => 0);
+
+ pragma warnings (off, "*assumed to be*");
+ subtype pressure_barg is Dimensions2_real_numbers.Real;
+ m : constant Distance := 1.0;
+ kg : constant Mass := 1.0;
+ s : constant Time := 1.0;
+ a : constant Electric_Current := 1.0;
+ k : constant Temperature := 1.0;
+ mol : constant Amount_Of_Substance := 1.0;
+ min : constant Time := 1.0;
+ h : constant Time := 60.0 * min;
+
+ subtype frequency is Si_Type with
+ dimension => (symbol => "Hz", second => -1, others => 0);
+
+ subtype massflow is Si_Type with
+ dimension => (symbol => "kg/s",
+ kilogram => 1, second => -1, others => 0);
+
+ subtype molar_heat_capacity is Si_Type with
+ dimension => (symbol => "J/(K*mol)", meter => 2, kilogram => 1,
+ second => -2, kelvin => -1, mole => -1, others => 0);
+
+ subtype molar_flow is Si_Type with
+ dimension => (symbol => "mol/s", second => -1, mole => 1, others => 0);
+
+ subtype pressure is Si_Type with
+ dimension =>
+ (symbol => "Pa", meter => -1, kilogram => 1, second => -2, others => 0);
+
+ subtype ratio is Si_Type range 0.0 .. 1.0;
+
+ subtype scalar is Si_Type;
+
+ subtype specific_heat_capacity is Si_Type with
+ dimension => (symbol => "J/(K*kg)", meter => 2, second => -2,
+ kelvin => -1, others => 0);
+
+ subtype speed is Si_Type with
+ dimension => (symbol => "m/s", meter => 1, second => -1, others => 0);
+
+ subtype volume is Si_Type with
+ dimension => (symbol => "m^3", meter => 3, others => 0);
+
+ subtype volumetric_flow is Si_Type with
+ dimension => (symbol => "m^3/s", meter => 3, second => -1, others => 0);
+
+end Dimensions2_Phys;
diff --git a/gcc/testsuite/gnat.dg/dimensions2_real_numbers.ads b/gcc/testsuite/gnat.dg/dimensions2_real_numbers.ads
new file mode 100644
index 0000000..e7cda0b
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/dimensions2_real_numbers.ads
@@ -0,0 +1,3 @@
+package Dimensions2_Real_Numbers is
+ type Real is new Long_Float;
+end;