diff options
| author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-27 09:16:45 +0000 | 
|---|---|---|
| committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-27 09:16:45 +0000 | 
| commit | deb74db2d98b0e59d053e268412fc6a49f6a7e7f (patch) | |
| tree | 20850ce6ad49a6f73566862cf73cc69563654f3c | |
| parent | db04b5aba9a48e6a27761d15f37c7c6ae11656cd (diff) | |
| download | ppe42-gcc-deb74db2d98b0e59d053e268412fc6a49f6a7e7f.tar.gz ppe42-gcc-deb74db2d98b0e59d053e268412fc6a49f6a7e7f.zip  | |
	* utils.c (convert) <CONSTRUCTOR>: When converting it to a packable
	version of its type, attempt to first convert its elements.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137173 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/ada/utils.c | 42 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gnat.dg/aggr9.adb | 12 | ||||
| -rw-r--r-- | gcc/testsuite/gnat.dg/aggr9.ads | 7 | ||||
| -rw-r--r-- | gcc/testsuite/gnat.dg/aggr9_pkg.ads | 17 | 
6 files changed, 82 insertions, 6 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 924dc71d911..8b4389ae121 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2008-06-27  Eric Botcazou  <ebotcazou@adacore.com> + +	* utils.c (convert) <CONSTRUCTOR>: When converting it to a packable +	version of its type, attempt to first convert its elements. +  2008-06-26  Chris Proctor  <chrisp_42@bigpond.com>  	* Makefile.in: Fix *86 kfreebsd target specific pairs. diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index f255d37d6ef..92e83487b80 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -3579,17 +3579,47 @@ convert (tree type, tree expr)      case CONSTRUCTOR:        /* If we are converting a CONSTRUCTOR to a mere variant type, just make -	 a new one in the proper type.  Likewise for a conversion between -	 original and packable version.  */ -      if (code == ecode -	  && (gnat_types_compatible_p (type, etype) -	      || (code == RECORD_TYPE -		  && TYPE_NAME (type) == TYPE_NAME (etype)))) +	 a new one in the proper type.  */ +      if (code == ecode && gnat_types_compatible_p (type, etype))  	{  	  expr = copy_node (expr);  	  TREE_TYPE (expr) = type;  	  return expr;  	} + +      /* Likewise for a conversion between original and packable version, but +	 we have to work harder in order to preserve type consistency.  */ +      if (code == ecode +	  && code == RECORD_TYPE +	  && TYPE_NAME (type) == TYPE_NAME (etype)) +	{ +	  VEC(constructor_elt,gc) *e = CONSTRUCTOR_ELTS (expr); +	  unsigned HOST_WIDE_INT len = VEC_length (constructor_elt, e); +	  VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, len); +	  tree efield = TYPE_FIELDS (etype), field = TYPE_FIELDS (type); +	  unsigned HOST_WIDE_INT idx; +	  tree index, value; + +	  FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value) +	    { +	      constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL); +	      /* We expect only simple constructors.  Otherwise, punt.  */ +	      if (!(index == efield || index == DECL_ORIGINAL_FIELD (efield))) +		break; +	      elt->index = field; +	      elt->value = convert (TREE_TYPE (field), value); +	      efield = TREE_CHAIN (efield); +	      field = TREE_CHAIN (field); +	    } + +	  if (idx == len) +	    { +	      expr = copy_node (expr); +	      TREE_TYPE (expr) = type; +	      CONSTRUCTOR_ELTS (expr) = v; +	      return expr; +	    } +	}        break;      case UNCONSTRAINED_ARRAY_REF: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed8f15bd6e4..64384d5621a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-06-27  Eric Botcazou  <ebotcazou@adacore.com> + +	* gnat.dg/aggr9.ad[sb]: New test. +	* gnat.dg/aggr9_pkg.ads: New helper. +  2008-06-27  Olivier Hainque  <hainque@adacore.com>  	* gnat.dg/aligned_vla.adb: New test. diff --git a/gcc/testsuite/gnat.dg/aggr9.adb b/gcc/testsuite/gnat.dg/aggr9.adb new file mode 100644 index 00000000000..70d026fdd28 --- /dev/null +++ b/gcc/testsuite/gnat.dg/aggr9.adb @@ -0,0 +1,12 @@ +-- { dg-do compile } +-- { dg-options "-O" } + +package body Aggr9 is + +  procedure Proc (X : R1) is +    M : R2 := (F => X); +  begin +    Send (M); +  end; + +end Aggr9; diff --git a/gcc/testsuite/gnat.dg/aggr9.ads b/gcc/testsuite/gnat.dg/aggr9.ads new file mode 100644 index 00000000000..cb5757b64af --- /dev/null +++ b/gcc/testsuite/gnat.dg/aggr9.ads @@ -0,0 +1,7 @@ +with Aggr9_Pkg; use Aggr9_Pkg; + +package Aggr9 is + +  procedure Proc (X : R1); + +end Aggr9; diff --git a/gcc/testsuite/gnat.dg/aggr9_pkg.ads b/gcc/testsuite/gnat.dg/aggr9_pkg.ads new file mode 100644 index 00000000000..c7c7b9e10b8 --- /dev/null +++ b/gcc/testsuite/gnat.dg/aggr9_pkg.ads @@ -0,0 +1,17 @@ +package Aggr9_Pkg is + +  type Byte is range 0 .. 255; + +  type R1 is +    record +      A,B : Byte;                     +    end record; + +  type R2 is +    record +      F : R1; +    end record; + +  procedure Send (M : R2); + +end Aggr9_Pkg;  | 

