utils2.c (find_common_type): Do not return the LHS type if it's an array with non-constant lower bound and...

* gcc-interface/utils2.c (find_common_type): Do not return the LHS type
	if it's an array with non-constant lower bound and the RHS type is an
	array with a constant one.

From-SVN: r240913
This commit is contained in:
Eric Botcazou 2016-10-10 09:46:10 +00:00 committed by Eric Botcazou
parent 55cfd746c7
commit 036a2fa23e
7 changed files with 82 additions and 12 deletions

View File

@ -1,7 +1,13 @@
2016-10-10 Eric Botcazou <ebotcazou@adacore.com> 2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (convert): For a biased input type, convert * gcc-interface/utils2.c (find_common_type): Do not return the LHS type
the bias itself to the base type before adding it. if it's an array with non-constant lower bound and the RHS type is an
array with a constant one.
2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (convert): For a biased input type, convert the
bias itself to the base type before adding it.
2016-10-08 Eric Botcazou <ebotcazou@adacore.com> 2016-10-08 Eric Botcazou <ebotcazou@adacore.com>

View File

@ -215,27 +215,40 @@ find_common_type (tree t1, tree t2)
calling into build_binary_op), some others are really expected and we calling into build_binary_op), some others are really expected and we
have to be careful. */ have to be careful. */
const bool variable_record_on_lhs
= (TREE_CODE (t1) == RECORD_TYPE
&& TREE_CODE (t2) == RECORD_TYPE
&& get_variant_part (t1)
&& !get_variant_part (t2));
const bool variable_array_on_lhs
= (TREE_CODE (t1) == ARRAY_TYPE
&& TREE_CODE (t2) == ARRAY_TYPE
&& !TREE_CONSTANT (TYPE_MIN_VALUE (TYPE_DOMAIN (t1)))
&& TREE_CONSTANT (TYPE_MIN_VALUE (TYPE_DOMAIN (t2))));
/* We must avoid writing more than what the target can hold if this is for /* We must avoid writing more than what the target can hold if this is for
an assignment and the case of tagged types is handled in build_binary_op an assignment and the case of tagged types is handled in build_binary_op
so we use the lhs type if it is known to be smaller or of constant size so we use the lhs type if it is known to be smaller or of constant size
and the rhs type is not, whatever the modes. We also force t1 in case of and the rhs type is not, whatever the modes. We also force t1 in case of
constant size equality to minimize occurrences of view conversions on the constant size equality to minimize occurrences of view conversions on the
lhs of an assignment, except for the case of record types with a variant lhs of an assignment, except for the case of types with a variable part
part on the lhs but not on the rhs to make the conversion simpler. */ on the lhs but not on the rhs to make the conversion simpler. */
if (TREE_CONSTANT (TYPE_SIZE (t1)) if (TREE_CONSTANT (TYPE_SIZE (t1))
&& (!TREE_CONSTANT (TYPE_SIZE (t2)) && (!TREE_CONSTANT (TYPE_SIZE (t2))
|| tree_int_cst_lt (TYPE_SIZE (t1), TYPE_SIZE (t2)) || tree_int_cst_lt (TYPE_SIZE (t1), TYPE_SIZE (t2))
|| (TYPE_SIZE (t1) == TYPE_SIZE (t2) || (TYPE_SIZE (t1) == TYPE_SIZE (t2)
&& !(TREE_CODE (t1) == RECORD_TYPE && !variable_record_on_lhs
&& TREE_CODE (t2) == RECORD_TYPE && !variable_array_on_lhs)))
&& get_variant_part (t1)
&& !get_variant_part (t2)))))
return t1; return t1;
/* Otherwise, if the lhs type is non-BLKmode, use it. Note that we know /* Otherwise, if the lhs type is non-BLKmode, use it, except for the case of
that we will not have any alignment problems since, if we did, the a non-BLKmode rhs and array types with a variable part on the lhs but not
non-BLKmode type could not have been used. */ on the rhs to make sure the conversion is preserved during gimplification.
if (TYPE_MODE (t1) != BLKmode) Note that we know that we will not have any alignment problems since, if
we did, the non-BLKmode type could not have been used. */
if (TYPE_MODE (t1) != BLKmode
&& (TYPE_MODE (t2) == BLKmode || !variable_array_on_lhs))
return t1; return t1;
/* If the rhs type is of constant size, use it whatever the modes. At /* If the rhs type is of constant size, use it whatever the modes. At

View File

@ -1,3 +1,8 @@
2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/inline13.ad[sb]: New test.
* gnat.dg/inline13_pkg.ad[sb]: New helper.
2016-10-10 Eric Botcazou <ebotcazou@adacore.com> 2016-10-10 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/biased_subtype.adb: New test. * gnat.dg/biased_subtype.adb: New test.

View File

@ -0,0 +1,19 @@
-- { dg-do compile }
-- { dg-options "-O -gnatn" }
package body Inline13 is
function F (L : Arr) return String is
Local : Arr (1 .. L'Length);
Ret : String (1 .. L'Length);
Pos : Natural := 1;
begin
Local (1 .. L'Length) := L;
for I in 1 .. Integer (L'Length) loop
Ret (Pos .. Pos + 8) := " " & Inline13_Pkg.Padded (Local (I));
Pos := Pos + 9;
end loop;
return Ret;
end;
end Inline13;

View File

@ -0,0 +1,9 @@
with Inline13_Pkg;
package Inline13 is
type Arr is array (Positive range <>) of Inline13_Pkg.T;
function F (L : Arr) return String;
end Inline13;

View File

@ -0,0 +1,8 @@
package body Inline13_Pkg is
function Padded (Value : T) return Padded_T is
begin
return Padded_T(Value);
end Padded;
end Inline13_Pkg;

View File

@ -0,0 +1,10 @@
package Inline13_Pkg is
subtype Padded_T is String (1..8);
type T is new Padded_T;
function Padded (Value : T) return Padded_T;
pragma Inline_Always (Padded);
end Inline13_Pkg;