aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/cplusplus/ast/tst_ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/cplusplus/ast/tst_ast.cpp')
-rw-r--r--tests/auto/cplusplus/ast/tst_ast.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index eaac17ade3..603d8f908d 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -118,6 +118,8 @@ private slots:
void crash_test_1();
void thread_local_1();
+ void msvc_attributes_declspec();
+
// expressions
void simple_name_1();
void template_id_1();
@@ -141,6 +143,7 @@ private slots:
void if_statement_2();
void if_statement_3();
void if_else_statement();
+ void if_constexpr();
void while_statement();
void while_condition_statement();
void for_statement();
@@ -169,6 +172,8 @@ private slots:
//! checks for both correct ellipsis tokens in
//! "template<class ...Args> class T : Args... {};"
void cpp11_variadic_inheritance();
+ void cpp11_attributes();
+ void variableTemplatesInExpression();
// Q_PROPERTY
void cpp_qproperty();
@@ -281,6 +286,14 @@ void tst_AST::thread_local_1()
QCOMPARE(Token::name(T___THREAD), "__thread");
}
+void tst_AST::msvc_attributes_declspec()
+{
+ const char *inp = "class __declspec(novtable) Name{};";
+ QSharedPointer<TranslationUnit> unit(parseDeclaration(inp));
+ QVERIFY(unit->ast());
+ QCOMPARE(diag.errorCount, 0);
+}
+
void tst_AST::simple_declaration_1()
{
QSharedPointer<TranslationUnit> unit(parseStatement("\n"
@@ -1322,6 +1335,56 @@ void tst_AST::cpp11_variadic_inheritance()
QVERIFY(ba->ellipsis_token != 0); // important
}
+void tst_AST::cpp11_attributes()
+{
+ QSharedPointer<TranslationUnit> unit(parseDeclaration(
+ "[[noreturn]] void f() {throw \"error\";}",
+ false, false, true));
+ AST *ast = unit->ast();
+ QVERIFY(ast != nullptr);
+
+ DeclarationAST *d = ast->asDeclaration();
+ QVERIFY(d != nullptr);
+
+ FunctionDefinitionAST *f = d->asFunctionDefinition();
+ QVERIFY(f != nullptr);
+ QVERIFY(f->decl_specifier_list != nullptr);
+ QVERIFY(f->decl_specifier_list->value != nullptr);
+
+ StdAttributeSpecifierAST *attr = f->decl_specifier_list->value->asStdAttributeSpecifier();
+ QVERIFY(attr != nullptr);
+}
+
+void tst_AST::variableTemplatesInExpression()
+{
+ QSharedPointer<TranslationUnit> unit(parseDeclaration("int i = t<int> + t<char>;",
+ false, false, true));
+ AST *ast = unit->ast();
+ QVERIFY(ast != nullptr);
+
+ QCOMPARE(diag.errorCount, 0);
+
+ DeclarationAST *d = ast->asDeclaration();
+ QVERIFY(d != nullptr);
+}
+
+void tst_AST::if_constexpr()
+{
+ QSharedPointer<TranslationUnit> unit(parseStatement("if constexpr (a) b;",true));
+
+ AST *ast = unit->ast();
+ QVERIFY(ast != 0);
+
+ IfStatementAST *stmt = ast->asIfStatement();
+ QVERIFY(stmt != 0);
+ QCOMPARE(stmt->if_token, 1);
+ QCOMPARE(stmt->constexpr_token, 2);
+ QCOMPARE(stmt->lparen_token, 3);
+ QVERIFY(stmt->condition != 0);
+ QCOMPARE(stmt->rparen_token, 5);
+ QVERIFY(stmt->statement != 0);
+}
+
void tst_AST::cpp_qproperty()
{
QFETCH(QByteArray, source);