cproc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/cproc
Log | Files | Refs | Submodules | README | LICENSE

commit 9b52864932ec81033b5c9d34a81828d54192b958
parent 231137aceb65c4b1ca0b54dd599f1f8b8c5c9342
Author: Michael Forney <mforney@mforney.org>
Date:   Sat, 27 Apr 2019 16:15:11 -0700

Fix some function declarator corner cases

Diffstat:
Mdecl.c | 11++++++++++-
Atest/abstract-function-declarator.c | 16++++++++++++++++
Atest/abstract-function-declarator.qbe | 0
3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/decl.c b/decl.c @@ -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 @@ -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