diff --git a/tccgen.c b/tccgen.c index da970fdd..da39d36d 100644 --- a/tccgen.c +++ b/tccgen.c @@ -2948,6 +2948,8 @@ static int parse_btype(CType *type, AttributeDef *ad) case TOK_TYPEOF3: next(); parse_expr_type(&type1); + /* remove all storage modifiers except typedef */ + type1.t &= ~(VT_STORAGE&~VT_TYPEDEF); goto basic_type2; default: if (typespec_found || typedef_found) diff --git a/tests/tcctest.c b/tests/tcctest.c index 2c4d1d4f..bd1b9752 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2365,6 +2365,11 @@ extern int weak_asm_v1 asm("weak_asm_v1x") __attribute extern int __attribute((weak)) weak_asm_v2 asm("weak_asm_v2x") ; extern int __attribute((weak)) weak_asm_v3(void) asm("weak_asm_v3x") __attribute((weak)); +static const size_t dummy = 0; +extern __typeof(dummy) weak_dummy1 __attribute__((weak, alias("dummy"))); +extern __typeof(dummy) __attribute__((weak, alias("dummy"))) weak_dummy2; +extern __attribute__((weak, alias("dummy"))) __typeof(dummy) weak_dummy3; + void __attribute__((weak)) weak_test(void) { printf("weak_f1=%d\n", weak_f1 ? weak_f1() : 123);