summaryrefslogtreecommitdiff
path: root/tests/auto/cplusplus/ast/tst_ast.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-10-06 16:26:48 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-10-08 13:15:21 +0200
commit192ca70649a278e8593bff91151956bc7649ac07 (patch)
treefbc7b82789b6db2bce56d8c858baebd40705465c /tests/auto/cplusplus/ast/tst_ast.cpp
parentac9fc40645638091dcd32bcdbce7d75dc2140825 (diff)
downloadqt-creator-192ca70649a278e8593bff91151956bc7649ac07.tar.gz
C++ Parser: fix infinite loop when recovering from incorrect @selector expression.
Diffstat (limited to 'tests/auto/cplusplus/ast/tst_ast.cpp')
-rw-r--r--tests/auto/cplusplus/ast/tst_ast.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index af819e871f..bc10347f54 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -83,6 +83,8 @@ private slots:
void objc_protocol_forward_declaration_1();
void objc_protocol_definition_1();
void objc_method_attributes_1();
+ void objc_selector_error_recovery_1();
+ void objc_selector_error_recovery_2();
// expressions with (square) brackets
void normal_array_access();
@@ -832,6 +834,45 @@ void tst_AST::objc_method_attributes_1()
QCOMPARE(unit->spell(unavailableAttr->identifier_token), "unavailable");
}
+/*
+ @selector(foo)
+ @selector(foo:)
+ @selector(foo:bar:)
+ ...
+ */
+void tst_AST::objc_selector_error_recovery_1()
+{
+ QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
+ "void tst() {\n"
+ " @selector(foo:\n"
+ " int i = 1;\n"
+ "}\n"
+ ));
+ AST *ast = unit->ast();
+ QVERIFY(ast);
+ ObjCClassDeclarationAST *zoo = ast->asObjCClassDeclaration();
+ QVERIFY(zoo);
+ QVERIFY(zoo->interface_token); QVERIFY(! (zoo->implementation_token));
+ QVERIFY(zoo->class_name); QVERIFY(zoo->class_name->asSimpleName());
+ QCOMPARE(unit->spell(zoo->class_name->asSimpleName()->identifier_token), "Zoo");
+}
+
+void tst_AST::objc_selector_error_recovery_2()
+{
+ QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
+ "void tst() {\n"
+ " @selector(foo:bar);\n"
+ "}\n"
+ ));
+ AST *ast = unit->ast();
+ QVERIFY(ast);
+ ObjCClassDeclarationAST *zoo = ast->asObjCClassDeclaration();
+ QVERIFY(zoo);
+ QVERIFY(zoo->interface_token); QVERIFY(! (zoo->implementation_token));
+ QVERIFY(zoo->class_name); QVERIFY(zoo->class_name->asSimpleName());
+ QCOMPARE(unit->spell(zoo->class_name->asSimpleName()->identifier_token), "Zoo");
+}
+
void tst_AST::normal_array_access()
{
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"