diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-10-06 16:26:48 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-10-08 13:15:21 +0200 |
commit | 192ca70649a278e8593bff91151956bc7649ac07 (patch) | |
tree | fbc7b82789b6db2bce56d8c858baebd40705465c /tests/auto/cplusplus/ast/tst_ast.cpp | |
parent | ac9fc40645638091dcd32bcdbce7d75dc2140825 (diff) | |
download | qt-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.cpp | 41 |
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" |