mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
55cfd746c7
commit
036a2fa23e
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
Loading…
Reference in New Issue