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 | 
