Commit f76e50b9 by Douglas Gregor Committed by Doug Gregor

re PR c++/35049 (g++.dg/conversion/simd3.C:12: error: invalid operands to binary…

re PR c++/35049 (g++.dg/conversion/simd3.C:12: error: invalid operands to binary + (have 'float __vector__' and 'int __vector__'))

2008-02-06  Douglas Gregor  <doug.gregor@gmail.com>

	PR c++/35049
	PR c++/35096
	* typeck.c (structural_comptypes): Call cp_comptypes.
	(comptypes): New; called from the C/C++ common bits to perform
	strict checks.
	(cp_comptypes): Renamed from comptypes, which is already used,
	with a different signature, by the C++ front end.
	(build_reinterpret_cast_1): Call cp_comptypes.
	(ptr_reasonably_similar): Ditto.
	* decl.c (decls_match): Ditto.
	* cvt.c (convert_to_reference): Ditto.
	* cp-tree.h (same_type_p): Ditto.
	(same_or_base_type_p): Ditto.
	(comptypes): Rename to cp_comptypes.
	* pt.c (canonical_type_parameter): Call cp_comptypes.

2008-02-06  Douglas Gregor  <doug.gregor@gmail.com>

	PR c++/35049
	PR c++/35096
	* g++.dg/ext/vector13.C: New.

From-SVN: r132152
parent 1be5b2fb
2008-02-06 Douglas Gregor <doug.gregor@gmail.com>
PR c++/35049
PR c++/35096
* typeck.c (structural_comptypes): Call cp_comptypes.
(comptypes): New; called from the C/C++ common bits to perform
strict checks.
(cp_comptypes): Renamed from comptypes, which is already used,
with a different signature, by the C++ front end.
(build_reinterpret_cast_1): Call cp_comptypes.
(ptr_reasonably_similar): Ditto.
* decl.c (decls_match): Ditto.
* cvt.c (convert_to_reference): Ditto.
* cp-tree.h (same_type_p): Ditto.
(same_or_base_type_p): Ditto.
(comptypes): Rename to cp_comptypes.
* pt.c (canonical_type_parameter): Call cp_comptypes.
2008-02-05 Jakub Jelinek <jakub@redhat.com> 2008-02-05 Jakub Jelinek <jakub@redhat.com>
PR c++/33553 PR c++/33553
......
...@@ -281,7 +281,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t; ...@@ -281,7 +281,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual /* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
sense of `same'. */ sense of `same'. */
#define same_type_p(TYPE1, TYPE2) \ #define same_type_p(TYPE1, TYPE2) \
comptypes ((TYPE1), (TYPE2), COMPARE_STRICT) cp_comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
/* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring /* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring
top-level qualifiers. */ top-level qualifiers. */
...@@ -3744,7 +3744,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; ...@@ -3744,7 +3744,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
#define WANT_VECTOR 32 /* vector types */ #define WANT_VECTOR 32 /* vector types */
#define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR) #define WANT_ARITH (WANT_INT | WANT_FLOAT | WANT_VECTOR)
/* Used with comptypes, and related functions, to guide type /* Used with cp_comptypes, and related functions, to guide type
comparison. */ comparison. */
#define COMPARE_STRICT 0 /* Just check if the types are the #define COMPARE_STRICT 0 /* Just check if the types are the
...@@ -3780,7 +3780,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG }; ...@@ -3780,7 +3780,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
is derived from TYPE1, or if TYPE2 is a pointer (reference) to a is derived from TYPE1, or if TYPE2 is a pointer (reference) to a
class derived from the type pointed to (referred to) by TYPE1. */ class derived from the type pointed to (referred to) by TYPE1. */
#define same_or_base_type_p(TYPE1, TYPE2) \ #define same_or_base_type_p(TYPE1, TYPE2) \
comptypes ((TYPE1), (TYPE2), COMPARE_BASE) cp_comptypes ((TYPE1), (TYPE2), COMPARE_BASE)
/* These macros are used to access a TEMPLATE_PARM_INDEX. */ /* These macros are used to access a TEMPLATE_PARM_INDEX. */
#define TEMPLATE_PARM_INDEX_CAST(NODE) \ #define TEMPLATE_PARM_INDEX_CAST(NODE) \
...@@ -4764,7 +4764,7 @@ extern tree complete_type (tree); ...@@ -4764,7 +4764,7 @@ extern tree complete_type (tree);
extern tree complete_type_or_else (tree, tree); extern tree complete_type_or_else (tree, tree);
extern int type_unknown_p (const_tree); extern int type_unknown_p (const_tree);
extern bool comp_except_specs (const_tree, const_tree, bool); extern bool comp_except_specs (const_tree, const_tree, bool);
extern bool comptypes (tree, tree, int); extern bool cp_comptypes (tree, tree, int);
extern bool compparms (const_tree, const_tree); extern bool compparms (const_tree, const_tree);
extern int comp_cv_qualification (const_tree, const_tree); extern int comp_cv_qualification (const_tree, const_tree);
extern int comp_cv_qual_signature (tree, tree); extern int comp_cv_qual_signature (tree, tree);
......
...@@ -465,8 +465,8 @@ convert_to_reference (tree reftype, tree expr, int convtype, ...@@ -465,8 +465,8 @@ convert_to_reference (tree reftype, tree expr, int convtype,
/* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
meant. */ meant. */
if (TREE_CODE (intype) == POINTER_TYPE if (TREE_CODE (intype) == POINTER_TYPE
&& (comptypes (TREE_TYPE (intype), type, && (cp_comptypes (TREE_TYPE (intype), type,
COMPARE_BASE | COMPARE_DERIVED))) COMPARE_BASE | COMPARE_DERIVED)))
warning (0, "casting %qT to %qT does not dereference pointer", warning (0, "casting %qT to %qT does not dereference pointer",
intype, reftype); intype, reftype);
...@@ -604,7 +604,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags) ...@@ -604,7 +604,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
/* The call to fold will not always remove the NOP_EXPR as /* The call to fold will not always remove the NOP_EXPR as
might be expected, since if one of the types is a typedef; might be expected, since if one of the types is a typedef;
the comparison in fold is just equality of pointers, not a the comparison in fold is just equality of pointers, not a
call to comptypes. We don't call fold in this case because call to cp_comptypes. We don't call fold in this case because
that can result in infinite recursion; fold will call that can result in infinite recursion; fold will call
convert, which will call ocp_convert, etc. */ convert, which will call ocp_convert, etc. */
return e; return e;
......
...@@ -1015,9 +1015,9 @@ decls_match (tree newdecl, tree olddecl) ...@@ -1015,9 +1015,9 @@ decls_match (tree newdecl, tree olddecl)
else if (TREE_TYPE (newdecl) == NULL_TREE) else if (TREE_TYPE (newdecl) == NULL_TREE)
types_match = 0; types_match = 0;
else else
types_match = comptypes (TREE_TYPE (newdecl), types_match = cp_comptypes (TREE_TYPE (newdecl),
TREE_TYPE (olddecl), TREE_TYPE (olddecl),
COMPARE_REDECLARATION); COMPARE_REDECLARATION);
} }
return types_match; return types_match;
......
...@@ -2905,7 +2905,7 @@ canonical_type_parameter (tree type) ...@@ -2905,7 +2905,7 @@ canonical_type_parameter (tree type)
VEC_safe_push (tree, gc, canonical_template_parms, NULL_TREE); VEC_safe_push (tree, gc, canonical_template_parms, NULL_TREE);
list = VEC_index (tree, canonical_template_parms, idx); list = VEC_index (tree, canonical_template_parms, idx);
while (list && !comptypes (type, TREE_VALUE (list), COMPARE_STRUCTURAL)) while (list && !cp_comptypes (type, TREE_VALUE (list), COMPARE_STRUCTURAL))
list = TREE_CHAIN (list); list = TREE_CHAIN (list);
if (list) if (list)
......
...@@ -160,7 +160,7 @@ type_unknown_p (const_tree exp) ...@@ -160,7 +160,7 @@ type_unknown_p (const_tree exp)
/* Return the common type of two parameter lists. /* Return the common type of two parameter lists.
We assume that comptypes has already been done and returned 1; We assume that cp_comptypes has already been done and returned 1;
if that isn't so, this may crash. if that isn't so, this may crash.
As an optimization, free the space we allocate if the parameter As an optimization, free the space we allocate if the parameter
...@@ -573,7 +573,7 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2, ...@@ -573,7 +573,7 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
} }
/* Return the merged type of two types. /* Return the merged type of two types.
We assume that comptypes has already been done and returned 1; We assume that cp_comptypes has already been done and returned 1;
if that isn't so, this may crash. if that isn't so, this may crash.
This just combines attributes and default arguments; any other This just combines attributes and default arguments; any other
...@@ -735,7 +735,7 @@ merge_types (tree t1, tree t2) ...@@ -735,7 +735,7 @@ merge_types (tree t1, tree t2)
} }
/* Return the common type of two types. /* Return the common type of two types.
We assume that comptypes has already been done and returned 1; We assume that cp_comptypes has already been done and returned 1;
if that isn't so, this may crash. if that isn't so, this may crash.
This is the type for the result of most arithmetic operations This is the type for the result of most arithmetic operations
...@@ -926,7 +926,7 @@ comp_array_types (const_tree t1, const_tree t2, bool allow_redeclaration) ...@@ -926,7 +926,7 @@ comp_array_types (const_tree t1, const_tree t2, bool allow_redeclaration)
return true; return true;
} }
/* Subroutine in comptypes. */ /* Subroutine in cp_comptypes. */
static bool static bool
structural_comptypes (tree t1, tree t2, int strict) structural_comptypes (tree t1, tree t2, int strict)
...@@ -1034,8 +1034,8 @@ structural_comptypes (tree t1, tree t2, int strict) ...@@ -1034,8 +1034,8 @@ structural_comptypes (tree t1, tree t2, int strict)
return false; return false;
case OFFSET_TYPE: case OFFSET_TYPE:
if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2), if (!cp_comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
strict & ~COMPARE_REDECLARATION)) strict & ~COMPARE_REDECLARATION))
return false; return false;
if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))) if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
return false; return false;
...@@ -1123,11 +1123,22 @@ structural_comptypes (tree t1, tree t2, int strict) ...@@ -1123,11 +1123,22 @@ structural_comptypes (tree t1, tree t2, int strict)
return targetm.comp_type_attributes (t1, t2); return targetm.comp_type_attributes (t1, t2);
} }
extern int comptypes (tree, tree);
/* Type comparison function that matches the signature of comptypes
from c-tree.h, which is used by the C front end and some of the
C/C++ common bits. */
int
comptypes (tree t1, tree t2)
{
return cp_comptypes (t1, t2, COMPARE_STRICT);
}
/* Return true if T1 and T2 are related as allowed by STRICT. STRICT /* Return true if T1 and T2 are related as allowed by STRICT. STRICT
is a bitwise-or of the COMPARE_* flags. */ is a bitwise-or of the COMPARE_* flags. */
bool bool
comptypes (tree t1, tree t2, int strict) cp_comptypes (tree t1, tree t2, int strict)
{ {
if (strict == COMPARE_STRICT) if (strict == COMPARE_STRICT)
{ {
...@@ -1224,7 +1235,7 @@ comp_cv_qual_signature (tree type1, tree type2) ...@@ -1224,7 +1235,7 @@ comp_cv_qual_signature (tree type1, tree type2)
return 0; return 0;
} }
/* Subroutines of `comptypes'. */ /* Subroutines of `cp_comptypes'. */
/* Return true if two parameter type lists PARMS1 and PARMS2 are /* Return true if two parameter type lists PARMS1 and PARMS2 are
equivalent in the sense that functions with those parameter types equivalent in the sense that functions with those parameter types
...@@ -5249,8 +5260,8 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, ...@@ -5249,8 +5260,8 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
"B" are related class types; the reinterpret_cast does not "B" are related class types; the reinterpret_cast does not
adjust the pointer. */ adjust the pointer. */
if (TYPE_PTR_P (intype) if (TYPE_PTR_P (intype)
&& (comptypes (TREE_TYPE (intype), TREE_TYPE (type), && (cp_comptypes (TREE_TYPE (intype), TREE_TYPE (type),
COMPARE_BASE | COMPARE_DERIVED))) COMPARE_BASE | COMPARE_DERIVED)))
warning (0, "casting %qT to %qT does not dereference pointer", warning (0, "casting %qT to %qT does not dereference pointer",
intype, type); intype, type);
...@@ -6913,9 +6924,9 @@ ptr_reasonably_similar (const_tree to, const_tree from) ...@@ -6913,9 +6924,9 @@ ptr_reasonably_similar (const_tree to, const_tree from)
return 0; return 0;
if (TREE_CODE (from) == OFFSET_TYPE if (TREE_CODE (from) == OFFSET_TYPE
&& comptypes (TYPE_OFFSET_BASETYPE (to), && cp_comptypes (TYPE_OFFSET_BASETYPE (to),
TYPE_OFFSET_BASETYPE (from), TYPE_OFFSET_BASETYPE (from),
COMPARE_BASE | COMPARE_DERIVED)) COMPARE_BASE | COMPARE_DERIVED))
continue; continue;
if (TREE_CODE (to) == VECTOR_TYPE if (TREE_CODE (to) == VECTOR_TYPE
...@@ -6930,7 +6941,7 @@ ptr_reasonably_similar (const_tree to, const_tree from) ...@@ -6930,7 +6941,7 @@ ptr_reasonably_similar (const_tree to, const_tree from)
return 1; return 1;
if (TREE_CODE (to) != POINTER_TYPE) if (TREE_CODE (to) != POINTER_TYPE)
return comptypes return cp_comptypes
(TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
COMPARE_BASE | COMPARE_DERIVED); COMPARE_BASE | COMPARE_DERIVED);
} }
......
// PR c++/35096
// { dg-do compile }
typedef const int X __attribute((vector_size(8)));
extern const int x[] __attribute((vector_size(8)));
X x[] = {};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment