diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-26 21:43:31 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-03-01 14:34:26 -0300 |
commit | 62dfdd85bbcac527be99183cfc8e8f7b92902f11 (patch) | |
tree | 74898b5b9481c81e00e8c42ff98725301effa4a0 | |
parent | 6dbd55084104eea9a3e950456a4bf0d966ee9ac9 (diff) |
Don't add external conversion operators that were removed on type system file.
With tests, of course.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
-rw-r--r-- | abstractmetabuilder.cpp | 2 | ||||
-rw-r--r-- | tests/testconversionoperator.cpp | 65 | ||||
-rw-r--r-- | tests/testconversionoperator.h | 2 |
3 files changed, 61 insertions, 8 deletions
diff --git a/abstractmetabuilder.cpp b/abstractmetabuilder.cpp index 8338791a1..549548da9 100644 --- a/abstractmetabuilder.cpp +++ b/abstractmetabuilder.cpp @@ -2510,6 +2510,8 @@ void AbstractMetaBuilder::setupClonable(AbstractMetaClass *cls) void AbstractMetaBuilder::setupExternalConversion(AbstractMetaClass* cls) { AbstractMetaFunctionList convOps = cls->operatorOverloads(AbstractMetaClass::ConversionOp); foreach (AbstractMetaFunction* func, convOps) { + if (func->isModifiedRemoved()) + continue; AbstractMetaClass* metaClass = m_metaClasses.findClass(func->type()->typeEntry()); if (!metaClass) continue; diff --git a/tests/testconversionoperator.cpp b/tests/testconversionoperator.cpp index cd4026bbd..e16f15cab 100644 --- a/tests/testconversionoperator.cpp +++ b/tests/testconversionoperator.cpp @@ -28,14 +28,15 @@ void TestConversionOperator::testConversionOperator() { - const char cppCode[] = "struct A {\ - };\ - struct B {\ - operator A() const;\ - };\ - struct C {\ - operator A() const;\ - };"; + const char cppCode[] = "\ + struct A {\ + };\ + struct B {\ + operator A() const;\ + };\ + struct C {\ + operator A() const;\ + };"; const char xmlCode[] = "\ <typesystem package=\"Foo\">\ <value-type name='A' />\ @@ -66,6 +67,54 @@ void TestConversionOperator::testConversionOperator() QCOMPARE(convOp, externalConvOp); } +void TestConversionOperator::testConversionOperatorOfDiscardedClass() +{ + const char cppCode[] = "\ + struct A {\ + };\ + struct B {\ + operator A() const;\ + };"; + const char xmlCode[] = "\ + <typesystem package=\"Foo\">\ + <value-type name='A' />\ + </typesystem>"; + + TestUtil t(cppCode, xmlCode, false); + AbstractMetaClassList classes = t.builder()->classes(); + AbstractMetaClass* classA = classes.findClass("A"); + QVERIFY(classA); + QCOMPARE(classA->externalConversionOperators().count(), 0); +} + +void TestConversionOperator::testRemovedConversionOperator() +{ + const char cppCode[] = "\ + struct A {\ + };\ + struct B {\ + operator A() const;\ + };"; + const char xmlCode[] = "\ + <typesystem package=\"Foo\">\ + <value-type name='A' />\ + <value-type name='B'>\ + <modify-function signature='operator A() const' remove='all' />\ + </value-type>\ + </typesystem>"; + + TestUtil t(cppCode, xmlCode, false); + AbstractMetaClassList classes = t.builder()->classes(); + AbstractMetaClass* classA = classes.findClass("A"); + AbstractMetaClass* classB = classes.findClass("B"); + QVERIFY(classA); + QVERIFY(classB); + QCOMPARE(classA->functions().count(), 1); + QCOMPARE(classB->functions().count(), 2); + QCOMPARE(classA->externalConversionOperators().count(), 0); + QCOMPARE(classA->implicitConversions().count(), 0); +} + QTEST_APPLESS_MAIN(TestConversionOperator) #include "testconversionoperator.moc" diff --git a/tests/testconversionoperator.h b/tests/testconversionoperator.h index 79963db1e..25b8d8c27 100644 --- a/tests/testconversionoperator.h +++ b/tests/testconversionoperator.h @@ -30,6 +30,8 @@ class TestConversionOperator : public QObject Q_OBJECT private slots: void testConversionOperator(); + void testConversionOperatorOfDiscardedClass(); + void testRemovedConversionOperator(); }; #endif |