[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdevelop/languages/cpp
From: David Nolden <david.nolden.kde () art-master ! de>
Date: 2008-08-11 13:10:48
Message-ID: 1218460248.394752.478.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 845309 by zwabel:
Correctly parse "const"'s in template-parameters, and add a test for that
M +59 -47 cppduchain/tests/test_duchain.cpp
M +5 -5 parser/name_compiler.cpp
--- trunk/KDE/kdevelop/languages/cpp/cppduchain/tests/test_duchain.cpp #845308:845309
@@ -2453,60 +2453,72 @@
void TestDUChain::testConst()
{
- QByteArray method("class A{}; const char* a; const char& b; char* const & c; char* \
const d; const A e; const A* f; A* const g;"); + {
+ QByteArray method("class A{}; const char* a; const char& b; char* const & c; \
char* const d; const A e; const A* f; A* const g;");
- TopDUContext* top = dynamic_cast<TopDUContext*>(parse(method, DumpAll));
+ TopDUContext* top = dynamic_cast<TopDUContext*>(parse(method, DumpAll));
- DUChainWriteLocker lock(DUChain::lock());
- QCOMPARE(top->localDeclarations().size(), 8);
- CppPointerType::Ptr a = top->localDeclarations()[1]->type<CppPointerType>();
- QVERIFY(a);
- QVERIFY(!a->isConstant());
- CppIntegralType::Ptr a2 = a->baseType().cast<CppIntegralType>();
- QVERIFY(a2);
- QVERIFY(a2->isConstant());
+ DUChainWriteLocker lock(DUChain::lock());
+ QCOMPARE(top->localDeclarations().size(), 8);
+ CppPointerType::Ptr a = top->localDeclarations()[1]->type<CppPointerType>();
+ QVERIFY(a);
+ QVERIFY(!a->isConstant());
+ CppIntegralType::Ptr a2 = a->baseType().cast<CppIntegralType>();
+ QVERIFY(a2);
+ QVERIFY(a2->isConstant());
- CppReferenceType::Ptr b = top->localDeclarations()[2]->type<CppReferenceType>();
- QVERIFY(b);
- QVERIFY(!b->isConstant());
- CppIntegralType::Ptr b2 = b->baseType().cast<CppIntegralType>();
- QVERIFY(b2);
- QVERIFY(b2->isConstant());
+ CppReferenceType::Ptr b = top->localDeclarations()[2]->type<CppReferenceType>();
+ QVERIFY(b);
+ QVERIFY(!b->isConstant());
+ CppIntegralType::Ptr b2 = b->baseType().cast<CppIntegralType>();
+ QVERIFY(b2);
+ QVERIFY(b2->isConstant());
- CppReferenceType::Ptr c = top->localDeclarations()[3]->type<CppReferenceType>();
- QVERIFY(c);
- QVERIFY(!c->isConstant());
- CppPointerType::Ptr c2 = c->baseType().cast<CppPointerType>();
- QVERIFY(c2);
- QVERIFY(c2->isConstant());
- CppIntegralType::Ptr c3 = c2->baseType().cast<CppIntegralType>();
- QVERIFY(c3);
- QVERIFY(!c3->isConstant());
+ CppReferenceType::Ptr c = top->localDeclarations()[3]->type<CppReferenceType>();
+ QVERIFY(c);
+ QVERIFY(!c->isConstant());
+ CppPointerType::Ptr c2 = c->baseType().cast<CppPointerType>();
+ QVERIFY(c2);
+ QVERIFY(c2->isConstant());
+ CppIntegralType::Ptr c3 = c2->baseType().cast<CppIntegralType>();
+ QVERIFY(c3);
+ QVERIFY(!c3->isConstant());
- CppPointerType::Ptr d = top->localDeclarations()[4]->type<CppPointerType>();
- QVERIFY(d);
- QVERIFY(d->isConstant());
- CppIntegralType::Ptr d2 = d->baseType().cast<CppIntegralType>();
- QVERIFY(d2);
- QVERIFY(!d2->isConstant());
-
- CppClassType::Ptr e = top->localDeclarations()[5]->type<CppClassType>();
- QVERIFY(e);
- QVERIFY(e->isConstant());
+ CppPointerType::Ptr d = top->localDeclarations()[4]->type<CppPointerType>();
+ QVERIFY(d);
+ QVERIFY(d->isConstant());
+ CppIntegralType::Ptr d2 = d->baseType().cast<CppIntegralType>();
+ QVERIFY(d2);
+ QVERIFY(!d2->isConstant());
+
+ CppClassType::Ptr e = top->localDeclarations()[5]->type<CppClassType>();
+ QVERIFY(e);
+ QVERIFY(e->isConstant());
- CppPointerType::Ptr f = top->localDeclarations()[6]->type<CppPointerType>();
- QVERIFY(f);
- QVERIFY(!f->isConstant());
- CppClassType::Ptr f2 = f->baseType().cast<CppClassType>();
- QVERIFY(f2);
- QVERIFY(f2->isConstant());
+ CppPointerType::Ptr f = top->localDeclarations()[6]->type<CppPointerType>();
+ QVERIFY(f);
+ QVERIFY(!f->isConstant());
+ CppClassType::Ptr f2 = f->baseType().cast<CppClassType>();
+ QVERIFY(f2);
+ QVERIFY(f2->isConstant());
- CppPointerType::Ptr g = top->localDeclarations()[7]->type<CppPointerType>();
- QVERIFY(g);
- QVERIFY(g->isConstant());
- CppClassType::Ptr g2 = g->baseType().cast<CppClassType>();
- QVERIFY(g2);
- QVERIFY(!g2->isConstant());
+ CppPointerType::Ptr g = top->localDeclarations()[7]->type<CppPointerType>();
+ QVERIFY(g);
+ QVERIFY(g->isConstant());
+ CppClassType::Ptr g2 = g->baseType().cast<CppClassType>();
+ QVERIFY(g2);
+ QVERIFY(!g2->isConstant());
+ }
+ {
+ QByteArray method("class A; template<class T> class B; B<const A*> ca;B<A* \
const> cb;"); +
+ TopDUContext* top = dynamic_cast<TopDUContext*>(parse(method, DumpAll));
+
+ DUChainWriteLocker lock(DUChain::lock());
+ QCOMPARE(top->localDeclarations().size(), 4);
+ QCOMPARE(top->localDeclarations()[2]->abstractType()->toString().trimmed(), \
QString("B< const A* >")); + \
QCOMPARE(top->localDeclarations()[3]->abstractType()->toString().trimmed(), \
QString("B< A* const >")); + }
}
void TestDUChain::testDeclarationId()
--- trunk/KDE/kdevelop/languages/cpp/parser/name_compiler.cpp #845308:845309
@@ -79,9 +79,10 @@
TypeCompiler tc(session);
tc.run(node->type_id->type_specifier);
id = TypeIdentifier(tc.identifier());
-
+ //node->type_id->type_specifier->cv
if(node->type_id->declarator && node->type_id->declarator->ptr_ops)
{
+ id.setIsConstant(parseConstVolatile(session, \
node->type_id->type_specifier->cv) & Declaration::Const);
const ListNode<PtrOperatorAST*> *it = \
node->type_id->declarator->ptr_ops->toFront();
const ListNode<PtrOperatorAST*> *end = it; ///@todo check ordering, eventually \
walk the list in reversed order do
@@ -91,14 +92,13 @@
if( session->token_stream->token(it->element->op).symbol() == ref) {
//We're handling a 'reference'
id.setIsReference(true);
- if(it->element->cv)
- id.setIsConstant(parseConstVolatile(session, it->element->cv) & \
Declaration::Const); } else {
//We're handling a real pointer
id.setPointerDepth(id.pointerDepth()+1);
- if(it->element->cv)
- id.setIsConstant(parseConstVolatile(session, it->element->cv) & \
Declaration::Const); + if(it->element->cv) {
+ id.setIsConstPointer(id.pointerDepth()-1, \
parseConstVolatile(session, it->element->cv) & Declaration::Const); + }
}
}
it = it->next;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic