diff options
| author | Edmund Grimley Evans <Edmund.Grimley.Evans@gmail.com> | 2015-11-19 23:45:33 +0000 |
|---|---|---|
| committer | Edmund Grimley Evans <Edmund.Grimley.Evans@gmail.com> | 2015-11-19 23:45:33 +0000 |
| commit | 30c54c9d433f5cc213912afd2ed04808cd9a4a23 (patch) | |
| tree | e4886ea66f2e4b2d40a63a61ada4e873b9e47449 /tccgen.c | |
| parent | 58a34d22c9bb91175fe758654cf512f3c2fe5675 (diff) | |
| download | tinycc-30c54c9d433f5cc213912afd2ed04808cd9a4a23.tar.gz tinycc-30c54c9d433f5cc213912afd2ed04808cd9a4a23.tar.bz2 | |
tccgen.c: In parse_btype, handle typedef types with added type qualifiers.
In a case like
typedef int T[1];
const T x;
we must make a copy of the typedef type so that we can add the type
qualifiers to it.
The following code used to give
error: incompatible types for redefinition of 'f'
typedef int T[1];
void f(const int [1]);
void f(const T);
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -3314,7 +3314,17 @@ static int parse_btype(CType *type, AttributeDef *ad) if (!s || !(s->type.t & VT_TYPEDEF)) goto the_end; t |= (s->type.t & ~VT_TYPEDEF); - type->ref = s->type.ref; + if ((t & VT_ARRAY) && + t & (VT_CONSTANT | VT_VOLATILE) & ~s->type.ref->type.t) { + /* This is a case like "typedef int T[1]; const T x;" + in which which we must make a copy of the typedef + type so that we can add the type qualifiers to it. */ + type->ref = sym_push(SYM_FIELD, &s->type.ref->type, + 0, s->type.ref->c); + type->ref->type.t |= t & (VT_CONSTANT | VT_VOLATILE); + } + else + type->ref = s->type.ref; if (s->r) { /* get attributes from typedef */ if (0 == ad->a.aligned) |
