diff options
-rw-r--r-- | decl.c | 11 | ||||
-rw-r--r-- | test/abstract-function-declarator.c | 16 | ||||
-rw-r--r-- | test/abstract-function-declarator.qbe | 0 |
3 files changed, 26 insertions, 1 deletions
@@ -462,8 +462,17 @@ declaratortypes(struct scope *s, struct list *result, char **name, bool allowabs switch (tok.kind) { case TLPAREN: next(); - if (allowabstract && tok.kind != TMUL && (tok.kind != TIDENT || istypename(s, tok.lit))) + switch (tok.kind) { + case TMUL: + case TLPAREN: + break; + case TIDENT: + if (!allowabstract || !istypename(s, tok.lit)) + break; + /* fallthrough */ + default: goto func; + } declaratortypes(s, result, name, allowabstract); expect(TRPAREN, "after parenthesized declarator"); break; diff --git a/test/abstract-function-declarator.c b/test/abstract-function-declarator.c new file mode 100644 index 0000000..b6808a6 --- /dev/null +++ b/test/abstract-function-declarator.c @@ -0,0 +1,16 @@ +typedef int x; + +void f1(int(x)); +void f1(int (*)(int)); + +void f2(int(y)); +void f2(int); + +void f3(int((*))); +void f3(int *); + +void f4(int((*x))); +void f4(int *); + +void f5(int((x))); +void f5(int (*)(int)); diff --git a/test/abstract-function-declarator.qbe b/test/abstract-function-declarator.qbe new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/abstract-function-declarator.qbe |