case tok::l_paren: { // p-e: p-e '(' argument-expression-list[opt] ')'
llvm::SmallVector<ExprTy*, 8> ArgExprs;
llvm::SmallVector<SourceLocation, 8> CommaLocs;
- bool ArgExprsOk = true;
Loc = ConsumeParen();
while (1) {
ExprResult ArgExpr = ParseAssignmentExpression();
if (ArgExpr.isInvalid) {
- ArgExprsOk = false;
SkipUntil(tok::r_paren);
- break;
+ return ExprResult(true);
} else
ArgExprs.push_back(ArgExpr.Val);
}
// Match the ')'.
- if (!LHS.isInvalid && ArgExprsOk && Tok.getKind() == tok::r_paren) {
+ if (!LHS.isInvalid && Tok.getKind() == tok::r_paren) {
assert((ArgExprs.size() == 0 || ArgExprs.size()-1 == CommaLocs.size())&&
"Unexpected number of commas!");
LHS = Actions.ParseCallExpr(LHS.Val, Loc, &ArgExprs[0], ArgExprs.size(),
&CommaLocs[0], Tok.getLocation());
}
- if (ArgExprsOk)
- MatchRHSPunctuation(tok::r_paren, Loc);
+ MatchRHSPunctuation(tok::r_paren, Loc);
break;
}
case tok::arrow: // postfix-expression: p-e '->' identifier
// have arguments of incomplete type.
if (FTI.NumArgs != 1 || FTI.isVariadic) {
Diag(DeclType.Loc, diag::err_void_only_param);
- return QualType();
- }
- // Reject, but continue to parse 'int(void abc)'.
- if (FTI.ArgInfo[i].Ident)
+ ArgTy = Context.IntTy;
+ } else if (FTI.ArgInfo[i].Ident) {
+ // Reject, but continue to parse 'int(void abc)'.
Diag(FTI.ArgInfo[i].IdentLoc,
diag::err_void_param_with_identifier);
-
- // Reject, but continue to parse 'float(const void)'.
- if (ArgTy.getQualifiers())
- Diag(DeclType.Loc, diag::err_void_param_qualified);
-
- // Do not add 'void' to the ArgTys list.
- break;
+ ArgTy = Context.IntTy;
+ } else {
+ // Reject, but continue to parse 'float(const void)'.
+ if (ArgTy.getQualifiers())
+ Diag(DeclType.Loc, diag::err_void_param_qualified);
+
+ // Do not add 'void' to the ArgTys list.
+ break;
+ }
}
ArgTys.push_back(ArgTy);