From 45b1169d063321c72002dd732e920b87c219e0af Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Tue, 15 Jul 2014 12:37:19 +0200 Subject: C++: Support alignas in C++11 mode. Change-Id: Ifa81a481bf92b5b71495a105ae292f3e9895f704 Task-number: QTCREATORBUG-9279 Reviewed-by: Nikolai Kosjar --- tests/auto/cplusplus/ast/tst_ast.cpp | 12 ++++---- .../auto/cplusplus/cxx11/data/alignofAlignas.1.cpp | 6 ++++ tests/auto/cplusplus/findusages/tst_findusages.cpp | 33 ++++++++++++++++++++++ tests/tools/cplusplus-ast2png/dumpers.inc | 20 +++++++++++-- 4 files changed, 62 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index 05712ce5f3..1cd04ce471 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -207,12 +207,12 @@ void tst_AST::gcc_attributes_2() QVERIFY(ns->attribute_list); QVERIFY(!ns->attribute_list->next); QVERIFY(ns->attribute_list->value); - AttributeSpecifierAST *attrSpec = ns->attribute_list->value->asAttributeSpecifier(); + GnuAttributeSpecifierAST *attrSpec = ns->attribute_list->value->asGnuAttributeSpecifier(); QVERIFY(attrSpec); QVERIFY(attrSpec->attribute_list); QVERIFY(!attrSpec->attribute_list->next); QVERIFY(attrSpec->attribute_list->value); - AttributeAST *attr = attrSpec->attribute_list->value->asAttribute(); + GnuAttributeAST *attr = attrSpec->attribute_list->value->asGnuAttribute(); QVERIFY(attr); QCOMPARE(unit->spell(attr->identifier_token), "__visibility__"); QVERIFY(attr->expression_list); @@ -1371,13 +1371,13 @@ void tst_AST::objc_method_attributes_1() QVERIFY(foo->attribute_list); QVERIFY(foo->attribute_list->value); QVERIFY(! (foo->attribute_list->next)); - AttributeSpecifierAST *deprecatedSpec = foo->attribute_list->value->asAttributeSpecifier(); + GnuAttributeSpecifierAST *deprecatedSpec = foo->attribute_list->value->asGnuAttributeSpecifier(); QVERIFY(deprecatedSpec); QCOMPARE(unit->tokenKind(deprecatedSpec->attribute_token), (int) T___ATTRIBUTE__); QVERIFY(deprecatedSpec->attribute_list); QVERIFY(deprecatedSpec->attribute_list->value); QVERIFY(! (deprecatedSpec->attribute_list->next)); - AttributeAST *deprecatedAttr = deprecatedSpec->attribute_list->value->asAttribute(); + GnuAttributeAST *deprecatedAttr = deprecatedSpec->attribute_list->value->asGnuAttribute(); QVERIFY(deprecatedAttr); QVERIFY(! deprecatedAttr->expression_list); QCOMPARE(unit->spell(deprecatedAttr->identifier_token), "deprecated"); @@ -1399,13 +1399,13 @@ void tst_AST::objc_method_attributes_1() QVERIFY(bar->attribute_list); QVERIFY(bar->attribute_list->value); QVERIFY(! (bar->attribute_list->next)); - AttributeSpecifierAST *unavailableSpec = bar->attribute_list->value->asAttributeSpecifier(); + GnuAttributeSpecifierAST *unavailableSpec = bar->attribute_list->value->asGnuAttributeSpecifier(); QVERIFY(unavailableSpec); QCOMPARE(unit->tokenKind(unavailableSpec->attribute_token), (int) T___ATTRIBUTE__); QVERIFY(unavailableSpec->attribute_list); QVERIFY(unavailableSpec->attribute_list->value); QVERIFY(! (unavailableSpec->attribute_list->next)); - AttributeAST *unavailableAttr = unavailableSpec->attribute_list->value->asAttribute(); + GnuAttributeAST *unavailableAttr = unavailableSpec->attribute_list->value->asGnuAttribute(); QVERIFY(unavailableAttr); QVERIFY(! unavailableAttr->expression_list); QCOMPARE(unit->spell(unavailableAttr->identifier_token), "unavailable"); diff --git a/tests/auto/cplusplus/cxx11/data/alignofAlignas.1.cpp b/tests/auto/cplusplus/cxx11/data/alignofAlignas.1.cpp index 5ba43661ed..05768769f6 100644 --- a/tests/auto/cplusplus/cxx11/data/alignofAlignas.1.cpp +++ b/tests/auto/cplusplus/cxx11/data/alignofAlignas.1.cpp @@ -1,2 +1,8 @@ int i = alignof(int); int t = alignof(C::foo) * 7 + alignof(Foo *); + +struct alignas(f()) Foo {}; +struct alignas(42) Foo {}; +struct alignas(double) Bar {}; +alignas(Foo) alignas(Bar) Foo *buffer; +struct alignas(Mooze...) Gnarf {}; diff --git a/tests/auto/cplusplus/findusages/tst_findusages.cpp b/tests/auto/cplusplus/findusages/tst_findusages.cpp index 2235034c31..97162be99a 100644 --- a/tests/auto/cplusplus/findusages/tst_findusages.cpp +++ b/tests/auto/cplusplus/findusages/tst_findusages.cpp @@ -115,6 +115,8 @@ private Q_SLOTS: void usingInDifferentNamespace_QTCREATORBUG7978(); void unicodeIdentifier(); + + void inAlignas(); }; void tst_FindUsages::dump(const QList &usages) const @@ -984,5 +986,36 @@ void tst_FindUsages::unicodeIdentifier() QCOMPARE(usages.at(1).len, 7); } +void tst_FindUsages::inAlignas() +{ + const QByteArray src = "\n" + "struct One {};\n" + "struct alignas(One) Two {};\n" + ; + + Document::Ptr doc = Document::create("inAlignas"); + doc->setUtf8Source(src); + doc->parse(); + doc->check(); + + QVERIFY(doc->diagnosticMessages().isEmpty()); + QCOMPARE(doc->globalSymbolCount(), 2U); + + Snapshot snapshot; + snapshot.insert(doc); + + Class *c = doc->globalSymbolAt(0)->asClass(); + QVERIFY(c); + QCOMPARE(c->name()->identifier()->chars(), "One"); + + FindUsages find(src, doc, snapshot); + find(c); + QCOMPARE(find.usages().size(), 2); + QCOMPARE(find.usages()[0].line, 1); + QCOMPARE(find.usages()[0].col, 7); + QCOMPARE(find.usages()[1].line, 2); + QCOMPARE(find.usages()[1].col, 15); +} + QTEST_APPLESS_MAIN(tst_FindUsages) #include "tst_findusages.moc" diff --git a/tests/tools/cplusplus-ast2png/dumpers.inc b/tests/tools/cplusplus-ast2png/dumpers.inc index 5e901c386c..5e5bb1a10b 100644 --- a/tests/tools/cplusplus-ast2png/dumpers.inc +++ b/tests/tools/cplusplus-ast2png/dumpers.inc @@ -50,7 +50,21 @@ virtual bool visit(SimpleSpecifierAST *ast) return false; } -virtual bool visit(AttributeSpecifierAST *ast) +virtual bool visit(AlignmentSpecifierAST *ast) +{ + if (ast->align_token) + terminal(ast->align_token, ast); + if (ast->lparen_token) + terminal(ast->lparen_token, ast); + nonterminal(ast->typeIdExprOrAlignmentExpr); + if (ast->ellipses_token) + terminal(ast->ellipses_token, ast); + if (ast->rparen_token) + terminal(ast->rparen_token, ast); + return false; +} + +virtual bool visit(GnuAttributeSpecifierAST *ast) { if (ast->attribute_token) terminal(ast->attribute_token, ast); @@ -58,7 +72,7 @@ virtual bool visit(AttributeSpecifierAST *ast) terminal(ast->first_lparen_token, ast); if (ast->second_lparen_token) terminal(ast->second_lparen_token, ast); - for (AttributeListAST *iter = ast->attribute_list; iter; iter = iter->next) + for (GnuAttributeListAST *iter = ast->attribute_list; iter; iter = iter->next) nonterminal(iter->value); if (ast->first_rparen_token) terminal(ast->first_rparen_token, ast); @@ -67,7 +81,7 @@ virtual bool visit(AttributeSpecifierAST *ast) return false; } -virtual bool visit(AttributeAST *ast) +virtual bool visit(GnuAttributeAST *ast) { if (ast->identifier_token) terminal(ast->identifier_token, ast); -- cgit v1.2.1