From abbc8c7b156d75c1f4baad852af5762482203ee1 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 24 Mar 2011 15:15:44 +0000 Subject: [PATCH] trans.c (gnat_to_gnu): Remove obsolete case of non-conversion to the nominal result type at the end. * gcc-interface/trans.c (gnat_to_gnu): Remove obsolete case of non-conversion to the nominal result type at the end. From-SVN: r171398 --- gcc/ada/ChangeLog | 5 ++++ gcc/ada/gcc-interface/trans.c | 22 +++++--------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gnat.dg/derived_type2.adb | 40 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/derived_type2.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2468644e7f4..e586919fd0c 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2011-03-24 Eric Botcazou + + * gcc-interface/trans.c (gnat_to_gnu): Remove obsolete case of + non-conversion to the nominal result type at the end. + 2011-03-23 Eric Botcazou * gcc-interface/trans.c (create_temporary): New function taken from... diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index dc83f0a1c8b..ab0725b75b5 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -5879,15 +5879,11 @@ gnat_to_gnu (Node_Id gnat_node) since we need to ignore those conversions (for 'Valid). 2. If we have a label (which doesn't have any well-defined type), a - field or an error, return the result almost unmodified. Also don't - do the conversion if the result type involves a PLACEHOLDER_EXPR in - its size since those are the cases where the front end may have the - type wrong due to "instantiating" the unconstrained record with - discriminant values. Similarly, if the two types are record types - with the same name don't convert. This will be the case when we are - converting from a packable version of a type to its original type and - we need those conversions to be NOPs in order for assignments into - these types to work properly. + field or an error, return the result almost unmodified. Similarly, + if the two types are record types with the same name, don't convert. + This will be the case when we are converting from a packable version + of a type to its original type and we need those conversions to be + NOPs in order for assignments into these types to work properly. 3. If the type is void or if we have no result, return error_mark_node to show we have no result. @@ -5933,12 +5929,8 @@ gnat_to_gnu (Node_Id gnat_node) else if (TREE_CODE (gnu_result) == LABEL_DECL || TREE_CODE (gnu_result) == FIELD_DECL || TREE_CODE (gnu_result) == ERROR_MARK - || (TYPE_SIZE (gnu_result_type) - && TREE_CODE (TYPE_SIZE (gnu_result_type)) != INTEGER_CST - && TREE_CODE (gnu_result) != INDIRECT_REF - && CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_result_type))) - || ((TYPE_NAME (gnu_result_type) - == TYPE_NAME (TREE_TYPE (gnu_result))) + || (TYPE_NAME (gnu_result_type) + == TYPE_NAME (TREE_TYPE (gnu_result)) && TREE_CODE (gnu_result_type) == RECORD_TYPE && TREE_CODE (TREE_TYPE (gnu_result)) == RECORD_TYPE)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1bed864420e..14efc3fa1de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-24 Eric Botcazou + + * gnat.dg/derived_type2.adb: New test. + 2011-03-24 Richard Guenther PR tree-optimization/48271 diff --git a/gcc/testsuite/gnat.dg/derived_type2.adb b/gcc/testsuite/gnat.dg/derived_type2.adb new file mode 100644 index 00000000000..607eb0b22c4 --- /dev/null +++ b/gcc/testsuite/gnat.dg/derived_type2.adb @@ -0,0 +1,40 @@ +-- { dg-do run } +-- { dg-options "-gnatws" } + +procedure Derived_Type2 is + + package Pkg is + + type Parent (B : Boolean := True) is record + case B is + when True => S : String (1 .. 5); + when False => F : Float; + end case; + end record; + + function Create (X : Parent) return Parent; + + end Pkg; + + package body Pkg is + + function Create (X : Parent) return Parent is + begin + return (True, "12345"); + end; + + end Pkg; + + use Pkg; + + type T is new Parent (True); + + X : T; + +begin + + if Create (X).B /= True then + raise Program_Error; + end if; + +end; -- 2.30.2