1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Bug 488265 - Syntax error lambda with capture in initializer list

Change-Id: I5505a47d33317287b0463e06eaf84ec0067b9e46
This commit is contained in:
Sergey Prigogin 2016-02-22 21:03:49 -08:00 committed by Gerrit Code Review @ Eclipse.org
parent 2b53f9eae3
commit d6611cfcfa
2 changed files with 59 additions and 26 deletions

View file

@ -8533,6 +8533,18 @@ public class AST2CPPTests extends AST2TestBase {
parseAndCheckBindings();
}
// template<typename T>
// void f(T p);
//
// class A {
// void m() {
// f([this] (int x) {});
// }
// };
public void testLambdaWithCapture() throws Exception {
parseAndCheckBindings();
}
// int foo = 0;
// auto bar = [foo] { return foo; };
public void testLambdaWithCapture_446225() throws Exception {
@ -8544,14 +8556,25 @@ public class AST2CPPTests extends AST2TestBase {
}
// template<typename T>
// void f(T p);
// class B;
//
// class A {
// void m() {
// f([this] (int x) {});
// }
// template<typename T, typename... U>
// struct B<T(U...)> {
// template<typename V>
// B(V);
// };
public void testLambdaWithCapture() throws Exception {
//
// struct A {
// B<bool(int arg)> f;
// };
//
// void waldo(A a);
//
// void test() {
// int p;
// waldo({[p](int arg) { return true; }});
// }
public void testLambdaWithCaptureInInitializerList_488265() throws Exception {
parseAndCheckBindings();
}
@ -8582,7 +8605,6 @@ public class AST2CPPTests extends AST2TestBase {
// };
//
// S::S(int a) : f{a} {} // Member initializer
public void testInitSyntax_302412() throws Exception {
parseAndCheckBindings();
}

View file

@ -2856,7 +2856,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
private ICPPASTFunctionDefinition functionDefinition(final int firstOffset, IASTDeclSpecifier declSpec,
IASTDeclarator outerDtor) throws EndOfFileException, BacktrackException {
final IASTDeclarator dtor= ASTQueries.findTypeRelevantDeclarator(outerDtor);
if (!(dtor instanceof ICPPASTFunctionDeclarator))
throwBacktrack(firstOffset, LA(1).getEndOffset() - firstOffset);
@ -3985,7 +3984,36 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
List<ICPPASTInitializerClause> result= new ArrayList<>();
// List of initializer clauses
loop: while (true) {
List<ICPPASTDesignator> designators= allowDesignators ? designatorList() : null;
List<ICPPASTDesignator> designators = null;
IToken mark = mark();
if (allowDesignators) {
designators= designatorList();
}
if (designators != null) {
try {
ICPPASTDesignatedInitializer desigInitializer = getNodeFactory().newDesignatedInitializer(null);
setRange(desigInitializer, designators.get(0));
for (ICPPASTDesignator d : designators) {
desigInitializer.addDesignator(d);
}
if (LT(1) != IToken.tEOC) {
// GNU extension: the assign operator is optional.
if (LT(1) == IToken.tASSIGN)
consume(IToken.tASSIGN);
ICPPASTInitializerClause clause= initClause(false);
desigInitializer.setOperand(clause);
adjustLength(desigInitializer, clause);
}
result.add(desigInitializer);
} catch (BacktrackException e) {
backup(mark);
designators = null; // Retry without designators.
}
}
if (designators == null) {
// Clause may be null, add to initializer anyways, so that the size can be computed.
ICPPASTInitializerClause clause = initClause(allowSkipping);
@ -4007,23 +4035,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
}
result.add(clause);
} else {
ICPPASTDesignatedInitializer desigInitializer = getNodeFactory().newDesignatedInitializer(null);
setRange(desigInitializer, designators.get(0));
for (ICPPASTDesignator d : designators) {
desigInitializer.addDesignator(d);
}
if (LT(1) != IToken.tEOC) {
// GNU extension: the assign operator is optional.
if (LT(1) == IToken.tASSIGN)
consume(IToken.tASSIGN);
ICPPASTInitializerClause clause= initClause(false);
desigInitializer.setOperand(clause);
adjustLength(desigInitializer, clause);
}
result.add(desigInitializer);
}
if (LT(1) != IToken.tCOMMA)