re PR c++/34914 (Member pointer to vector rejected)

PR c++/34914
	* c-common.c (handle_vector_size_attribute): Only allow
	integral, scalar float and fixed point types.  Handle OFFSET_TYPE
	the same way as pointer, array etc. types.
	* tree.c (reconstruct_complex_type): Handle OFFSET_TYPE.

	* g++.dg/ext/vector10.C: New test.

From-SVN: r131729
This commit is contained in:
Jakub Jelinek 2008-01-22 18:03:12 +01:00 committed by Jakub Jelinek
parent 2ddd287108
commit 270e749db4
5 changed files with 30 additions and 4 deletions

View File

@ -1,5 +1,11 @@
2008-01-22 Jakub Jelinek <jakub@redhat.com>
PR c++/34914
* c-common.c (handle_vector_size_attribute): Only allow
integral, scalar float and fixed point types. Handle OFFSET_TYPE
the same way as pointer, array etc. types.
* tree.c (reconstruct_complex_type): Handle OFFSET_TYPE.
PR c++/34917
* tree.c (build_type_attribute_qual_variant): Call
build_qualified_type if attributes are equal, but quals are not.

View File

@ -6031,15 +6031,16 @@ handle_vector_size_attribute (tree *node, tree name, tree args,
while (POINTER_TYPE_P (type)
|| TREE_CODE (type) == FUNCTION_TYPE
|| TREE_CODE (type) == METHOD_TYPE
|| TREE_CODE (type) == ARRAY_TYPE)
|| TREE_CODE (type) == ARRAY_TYPE
|| TREE_CODE (type) == OFFSET_TYPE)
type = TREE_TYPE (type);
/* Get the mode of the type being modified. */
orig_mode = TYPE_MODE (type);
if (TREE_CODE (type) == RECORD_TYPE
|| TREE_CODE (type) == UNION_TYPE
|| TREE_CODE (type) == VECTOR_TYPE
if ((!INTEGRAL_TYPE_P (type)
&& !SCALAR_FLOAT_TYPE_P (type)
&& !FIXED_POINT_TYPE_P (type))
|| (!SCALAR_FLOAT_MODE_P (orig_mode)
&& GET_MODE_CLASS (orig_mode) != MODE_INT
&& !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))

View File

@ -1,5 +1,8 @@
2008-01-22 Jakub Jelinek <jakub@redhat.com>
PR c++/34914
* g++.dg/ext/vector10.C: New test.
PR c++/34918
* g++.dg/other/error23.C: New test.

View File

@ -0,0 +1,11 @@
// PR c++/34914
// { dg-do compile }
struct A { int __attribute ((vector_size (8))) x; };
void
foo ()
{
__attribute ((vector_size (8))) int A::*p;
p == 0;
}

View File

@ -7631,6 +7631,11 @@ reconstruct_complex_type (tree type, tree bottom)
inner,
TREE_CHAIN (TYPE_ARG_TYPES (type)));
}
else if (TREE_CODE (type) == OFFSET_TYPE)
{
inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
outer = build_offset_type (TYPE_OFFSET_BASETYPE (type), inner);
}
else
return bottom;