aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
authorEdmund Grimley Evans <Edmund.Grimley.Evans@gmail.com>2015-11-19 23:45:33 +0000
committerEdmund Grimley Evans <Edmund.Grimley.Evans@gmail.com>2015-11-19 23:45:33 +0000
commit30c54c9d433f5cc213912afd2ed04808cd9a4a23 (patch)
treee4886ea66f2e4b2d40a63a61ada4e873b9e47449 /tccgen.c
parent58a34d22c9bb91175fe758654cf512f3c2fe5675 (diff)
downloadtinycc-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.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/tccgen.c b/tccgen.c
index d0a873e..5eabc70 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -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)