aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-02-08 17:28:04 +0200
committerSergey Poznyakoff <gray@gnu.org>2019-02-08 17:28:04 +0200
commitb64ca53d3f65ea7d51afa977e9d4bed808f494f7 (patch)
treeec7e7d1b184c25b716a4a49844fad3cf41cc36e7 /src
parentb0cc5efa1a1c8145981846cfa8e80cc67d12ebf6 (diff)
downloadcflow-b64ca53d3f65ea7d51afa977e9d4bed808f494f7.tar.gz
cflow-b64ca53d3f65ea7d51afa977e9d4bed808f494f7.tar.bz2
Fix https://savannah.gnu.org/bugs/index.php?47110
* src/parser.c (expression): Fix parsing of type casts. * tests/memberof.at: New test case. * tests/testsuite.at: Add new test. * tests/Makefile.am: Add new test.
Diffstat (limited to 'src')
-rw-r--r--src/parser.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/parser.c b/src/parser.c
index 2b173c2..391fe33 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -605,9 +605,17 @@ expression()
605 parens_lev++; 605 parens_lev++;
606 } else { 606 } else {
607 reference(name, line); 607 reference(name, line);
608
609 /* MEMBER_OF can be preceded by a closing paren, as in
610 (*a)->b
611 */
612 while (parens_lev > 0 && tok.type == ')') {
613 parens_lev--;
614 nexttoken();
615 }
616
608 if (tok.type == MEMBER_OF) { 617 if (tok.type == MEMBER_OF) {
609 while (tok.type == MEMBER_OF) 618 nexttoken();
610 nexttoken();
611 } else { 619 } else {
612 putback(); 620 putback();
613 } 621 }
@@ -615,7 +623,7 @@ expression()
615 break; 623 break;
616 case '(': 624 case '(':
617 /* maybe typecast */ 625 /* maybe typecast */
618 if (nexttoken() == TYPE) 626 if (nexttoken() == TYPE || tok.type == STRUCT)
619 skip_to(')'); 627 skip_to(')');
620 else { 628 else {
621 putback(); 629 putback();
@@ -625,6 +633,9 @@ expression()
625 case ')': 633 case ')':
626 parens_lev--; 634 parens_lev--;
627 break; 635 break;
636 case MEMBER_OF:
637 nexttoken();
638 break;
628 } 639 }
629 nexttoken(); 640 nexttoken();
630 } 641 }

Return to:

Send suggestions and report system problems to the System administrator.