discard type qualifiers when comparing function parameters (Dave Dodge)
This commit is contained in:
parent
38d2e8b9d8
commit
24a19cc37e
1 changed files with 26 additions and 4 deletions
30
tcc.c
30
tcc.c
|
@ -801,7 +801,9 @@ static int pointed_size(CType *type);
|
||||||
static int lvalue_type(int t);
|
static int lvalue_type(int t);
|
||||||
static int parse_btype(CType *type, AttributeDef *ad);
|
static int parse_btype(CType *type, AttributeDef *ad);
|
||||||
static void type_decl(CType *type, AttributeDef *ad, int *v, int td);
|
static void type_decl(CType *type, AttributeDef *ad, int *v, int td);
|
||||||
|
static int compare_types(CType *type1, CType *type2, int unqualified);
|
||||||
static int is_compatible_types(CType *type1, CType *type2);
|
static int is_compatible_types(CType *type1, CType *type2);
|
||||||
|
static int is_compatible_parameter_types(CType *type1, CType *type2);
|
||||||
|
|
||||||
int ieee_finite(double d);
|
int ieee_finite(double d);
|
||||||
void error(const char *fmt, ...);
|
void error(const char *fmt, ...);
|
||||||
|
@ -6007,7 +6009,7 @@ static int is_compatible_func(CType *type1, CType *type2)
|
||||||
while (s1 != NULL) {
|
while (s1 != NULL) {
|
||||||
if (s2 == NULL)
|
if (s2 == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
if (!is_compatible_types(&s1->type, &s2->type))
|
if (!is_compatible_parameter_types(&s1->type, &s2->type))
|
||||||
return 0;
|
return 0;
|
||||||
s1 = s1->next;
|
s1 = s1->next;
|
||||||
s2 = s2->next;
|
s2 = s2->next;
|
||||||
|
@ -6017,17 +6019,22 @@ static int is_compatible_func(CType *type1, CType *type2)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return true if type1 and type2 are exactly the same (including
|
/* return true if type1 and type2 are the same. If unqualified is
|
||||||
qualifiers).
|
true, qualifiers on the types are ignored.
|
||||||
|
|
||||||
- enums are not checked as gcc __builtin_types_compatible_p ()
|
- enums are not checked as gcc __builtin_types_compatible_p ()
|
||||||
*/
|
*/
|
||||||
static int is_compatible_types(CType *type1, CType *type2)
|
static int compare_types(CType *type1, CType *type2, int unqualified)
|
||||||
{
|
{
|
||||||
int bt1, t1, t2;
|
int bt1, t1, t2;
|
||||||
|
|
||||||
t1 = type1->t & VT_TYPE;
|
t1 = type1->t & VT_TYPE;
|
||||||
t2 = type2->t & VT_TYPE;
|
t2 = type2->t & VT_TYPE;
|
||||||
|
if (unqualified) {
|
||||||
|
/* strip qualifiers before comparing */
|
||||||
|
t1 &= ~(VT_CONSTANT | VT_VOLATILE);
|
||||||
|
t2 &= ~(VT_CONSTANT | VT_VOLATILE);
|
||||||
|
}
|
||||||
/* XXX: bitfields ? */
|
/* XXX: bitfields ? */
|
||||||
if (t1 != t2)
|
if (t1 != t2)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -6046,6 +6053,21 @@ static int is_compatible_types(CType *type1, CType *type2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return true if type1 and type2 are exactly the same (including
|
||||||
|
qualifiers).
|
||||||
|
*/
|
||||||
|
static int is_compatible_types(CType *type1, CType *type2)
|
||||||
|
{
|
||||||
|
return compare_types(type1,type2,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return true if type1 and type2 are the same (ignoring qualifiers).
|
||||||
|
*/
|
||||||
|
static int is_compatible_parameter_types(CType *type1, CType *type2)
|
||||||
|
{
|
||||||
|
return compare_types(type1,type2,1);
|
||||||
|
}
|
||||||
|
|
||||||
/* print a type. If 'varstr' is not NULL, then the variable is also
|
/* print a type. If 'varstr' is not NULL, then the variable is also
|
||||||
printed in the type */
|
printed in the type */
|
||||||
/* XXX: union */
|
/* XXX: union */
|
||||||
|
|
Loading…
Add table
Reference in a new issue