Fix PR21684 - Ellipsis following an 'auto' parameter sans name/ID
should indicate a c++ parameter pack not a c-variadic. int i = [](auto...) { return 0; }(); // OK now. llvm-svn: 223357
This commit is contained in:
parent
b24d0abfe3
commit
8435a6938d
|
@ -4873,19 +4873,20 @@ void Parser::ParseDirectDeclarator(Declarator &D) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// C++0x [dcl.fct]p14:
|
// C++0x [dcl.fct]p14:
|
||||||
// There is a syntactic ambiguity when an ellipsis occurs at the end
|
// There is a syntactic ambiguity when an ellipsis occurs at the end of a
|
||||||
// of a parameter-declaration-clause without a preceding comma. In
|
// parameter-declaration-clause without a preceding comma. In this case,
|
||||||
// this case, the ellipsis is parsed as part of the
|
// the ellipsis is parsed as part of the abstract-declarator if the type
|
||||||
// abstract-declarator if the type of the parameter names a template
|
// of the parameter either names a template parameter pack that has not
|
||||||
// parameter pack that has not been expanded; otherwise, it is parsed
|
// been expanded or contains auto; otherwise, it is parsed as part of the
|
||||||
// as part of the parameter-declaration-clause.
|
// parameter-declaration-clause.
|
||||||
if (Tok.is(tok::ellipsis) && D.getCXXScopeSpec().isEmpty() &&
|
if (Tok.is(tok::ellipsis) && D.getCXXScopeSpec().isEmpty() &&
|
||||||
!((D.getContext() == Declarator::PrototypeContext ||
|
!((D.getContext() == Declarator::PrototypeContext ||
|
||||||
D.getContext() == Declarator::LambdaExprParameterContext ||
|
D.getContext() == Declarator::LambdaExprParameterContext ||
|
||||||
D.getContext() == Declarator::BlockLiteralContext) &&
|
D.getContext() == Declarator::BlockLiteralContext) &&
|
||||||
NextToken().is(tok::r_paren) &&
|
NextToken().is(tok::r_paren) &&
|
||||||
!D.hasGroupingParens() &&
|
!D.hasGroupingParens() &&
|
||||||
!Actions.containsUnexpandedParameterPacks(D))) {
|
!Actions.containsUnexpandedParameterPacks(D) &&
|
||||||
|
D.getDeclSpec().getTypeSpecType() != TST_auto)) {
|
||||||
SourceLocation EllipsisLoc = ConsumeToken();
|
SourceLocation EllipsisLoc = ConsumeToken();
|
||||||
if (isPtrOperatorToken(Tok.getKind(), getLangOpts(), D.getContext())) {
|
if (isPtrOperatorToken(Tok.getKind(), getLangOpts(), D.getContext())) {
|
||||||
// The ellipsis was put in the wrong place. Recover, and explain to
|
// The ellipsis was put in the wrong place. Recover, and explain to
|
||||||
|
|
|
@ -918,3 +918,7 @@ int run2 = x2.fooG3();
|
||||||
|
|
||||||
|
|
||||||
} //end ns inclass_lambdas_within_nested_classes
|
} //end ns inclass_lambdas_within_nested_classes
|
||||||
|
|
||||||
|
namespace pr21684_disambiguate_auto_followed_by_ellipsis_no_id {
|
||||||
|
int a = [](auto ...) { return 0; }();
|
||||||
|
}
|
Loading…
Reference in New Issue