Skip to content

Commit 9f27591

Browse files
committed
Fix decltype(X)::member parsing
1 parent a29b952 commit 9f27591

File tree

1 file changed

+56
-8
lines changed

1 file changed

+56
-8
lines changed

src/cpp/parse.cpp

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3750,6 +3750,34 @@ bool Parser::rName(irept &name)
37503750
return true;
37513751
break;
37523752

3753+
case TOK_DECLTYPE:
3754+
#ifdef DEBUG
3755+
std::cout << std::string(__indent, ' ') << "Parser::rName 9\n";
3756+
#endif
3757+
lex.get_token(tk);
3758+
{
3759+
components.push_back(typet{ID_decltype});
3760+
set_location(components.back(), tk);
3761+
3762+
if(lex.get_token(tk)!='(')
3763+
return false;
3764+
3765+
// the argument is always an expression
3766+
3767+
exprt expr;
3768+
if(!rCommaExpression(expr))
3769+
return false;
3770+
3771+
if(lex.get_token(tk)!=')')
3772+
return false;
3773+
3774+
components.back().add(ID_expr_arg).swap(expr);
3775+
3776+
if(lex.LookAhead(0) != TOK_SCOPE)
3777+
return false;
3778+
}
3779+
break;
3780+
37533781
default:
37543782
return false;
37553783
}
@@ -7215,14 +7243,6 @@ bool Parser::rPrimaryExpr(exprt &exp)
72157243
if(!rVarName(exp))
72167244
return false;
72177245

7218-
if(lex.LookAhead(0)==TOK_SCOPE)
7219-
{
7220-
lex.get_token(tk);
7221-
7222-
// exp=new PtreeStaticUserStatementExpr(exp,
7223-
// Ptree::Cons(new Leaf(tk), exp2));
7224-
// TODO
7225-
}
72267246
#ifdef DEBUG
72277247
std::cout << std::string(__indent, ' ') << "Parser::rPrimaryExpr 17\n";
72287248
#endif
@@ -7385,6 +7405,34 @@ bool Parser::rVarNameCore(exprt &name)
73857405
}
73867406
return true;
73877407

7408+
case TOK_DECLTYPE:
7409+
#ifdef DEBUG
7410+
std::cout << std::string(__indent, ' ') << "Parser::rVarNameCore 8\n";
7411+
#endif
7412+
lex.get_token(tk);
7413+
{
7414+
components.push_back(typet{ID_decltype});
7415+
set_location(components.back(), tk);
7416+
7417+
if(lex.get_token(tk)!='(')
7418+
return false;
7419+
7420+
// the argument is always an expression
7421+
7422+
exprt expr;
7423+
if(!rCommaExpression(expr))
7424+
return false;
7425+
7426+
if(lex.get_token(tk)!=')')
7427+
return false;
7428+
7429+
components.back().add(ID_expr_arg).swap(expr);
7430+
7431+
if(lex.LookAhead(0) != TOK_SCOPE)
7432+
return false;
7433+
}
7434+
break;
7435+
73887436
default:
73897437
return false;
73907438
}

0 commit comments

Comments
 (0)