From 30c54c9d433f5cc213912afd2ed04808cd9a4a23 Mon Sep 17 00:00:00 2001 From: Edmund Grimley Evans Date: Thu, 19 Nov 2015 23:45:33 +0000 Subject: [PATCH] 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); --- tccgen.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tccgen.c b/tccgen.c index d0a873e4..5eabc702 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)