From d29b51bbd45c84fe0aa26f423c5025f18df0fab6 Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Mon, 14 Apr 2008 11:06:30 +0000 Subject: [PATCH] 226308: Disable fix for 224364 --- .../core/parser/tests/ParserTestSuite.java | 16 +-- .../parser/tests/ast2/SemanticsTests.java | 109 ++++++++++++++++++ .../tests/IndexCPPBindingResolutionTest.java | 2 +- .../tests/IndexCPPTemplateResolutionTest.java | 2 +- .../dom/parser/cpp/semantics/Conversions.java | 13 ++- .../parser/cpp/semantics/SemanticUtil.java | 21 ++-- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 4 +- 7 files changed, 149 insertions(+), 18 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/SemanticsTests.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java index ab574a70f16..654a6775e51 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserTestSuite.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 IBM Corporation and others. + * Copyright (c) 2002, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -18,22 +18,24 @@ import org.eclipse.cdt.core.model.tests.CModelElementsTests; import org.eclipse.cdt.core.model.tests.StructuralCModelElementsTests; import org.eclipse.cdt.core.parser.tests.ast2.DOMGCCParserExtensionTestSuite; import org.eclipse.cdt.core.parser.tests.ast2.DOMParserTestSuite; +import org.eclipse.cdt.core.parser.tests.ast2.SemanticsTests; import org.eclipse.cdt.core.parser.tests.scanner.ScannerTestSuite; /** * Combines all tests for the parsers. */ public class ParserTestSuite extends TestCase { - public static Test suite() { + public static Test suite() { TestSuite suite= new TestSuite(ParserTestSuite.class.getName()); suite.addTestSuite(ArrayUtilsTest.class); suite.addTestSuite(CharArrayUtilsTest.class); suite.addTestSuite(CModelElementsTests.class); suite.addTestSuite(StructuralCModelElementsTests.class); - suite.addTestSuite(ObjectMapTest.class ); - suite.addTest( ScannerTestSuite.suite() ); - suite.addTest( DOMParserTestSuite.suite() ); - suite.addTest( DOMGCCParserExtensionTestSuite.suite() ); + suite.addTestSuite(ObjectMapTest.class); + suite.addTestSuite(SemanticsTests.class); + suite.addTest(ScannerTestSuite.suite()); + suite.addTest(DOMParserTestSuite.suite()); + suite.addTest(DOMGCCParserExtensionTestSuite.suite()); return suite; - } + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/SemanticsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/SemanticsTests.java new file mode 100644 index 00000000000..6aa53cc19c7 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/SemanticsTests.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.core.parser.tests.ast2; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; + +/** + * Directly tests parts of the semantics package + */ +public class SemanticsTests extends AST2BaseTest { + + // class A {}; + // class B {}; + // + // class X { + // public: + // // unary + // A* operator !() { return new A(); } // logical not + // B* operator &() { return new B(); } // address of + // A* operator ~() { return new A(); } // one's complement + // B* operator *() { return new B(); } // ptr deference + // A* operator +() { return new A(); } // unary plus + // A* operator -() { return new A(); } // unary negation + // void operator ->() {} // Member selection + // X& operator++(); // Prefix increment operator. + // X operator++(int); // Postfix increment operator. + // X& operator--(); // Prefix decrement operator. + // X operator--(int); // Postfix decrement operator. + // + // // binary + // void operator ,(int x) {} // comma + // void operator ,(long x) {} // comma (overloaded) + // void operator !=(int x) {} // NE + // void operator !=(long x){} // NE (overloaded) + // void operator %(int x) {} // modulus + // void operator %=(int x) {} // modulus with assignment + // void operator &(int x) {} // bitwise AND + // void operator &&(A a) {} // logical AND + // void operator &=(A a) {} // Bitwise AND/assignment + // void operator *(B b) {} // multiplication + // void operator *=(X x) {} // multiplication with assignment + // void operator +(X x) {} // Addition + // A operator +=(int y) {} // Addition with assignment + // B operator -(X x) {} // Subtraction + // void operator -=(int y) {} // Subtraction with assignment + // void operator ->*(int z){} // ptr-to-member selection + // void operator /(int x) {} // division + // void operator /=(int y) {} // division with assignment + // void operator <(int x) {} // LT + // void operator <<(int x) {} // L shift + // void operator <<=(int x){} // L shift assignment + // void operator <=(int x) {} // LE + // void operator =(int x) {} // assignment + // void operator ==(int y) {} // EQ + // void operator >(int x) {} // GT + // void operator >=(int y) {} // GE + // void operator >>(int x) {} // R shift + // void operator >>=(int x){} // R shift with assignment + // void operator ^(int x) {} // XOR + // void operator ^=(int x) {} // XOR assignment + // void operator |(int x) {} // Bitwise OR + // void operator |=(int x) {} // Bitwise OR with assignment + // void operator ||(int x) {} // logical OR + // + // void operator()(int a, int b, int c) {} // function call + // + // void operator[](int i) {} // subscripting + // + // operator A(); // conversion + // operator B(); // conversion + // }; + public void testGetDeclaredConversionOperators() throws Exception { + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); + ICPPClassType c= ba.assertNonProblem("X {", 1, ICPPClassType.class); + ICPPMethod[] cops= SemanticUtil.getDeclaredConversionOperators(c); + assertEquals(2, cops.length); + Set actual= new HashSet(); + actual.add(cops[0].getName()); actual.add(cops[1].getName()); + Set expected= new HashSet(); + expected.add("operator A"); expected.add("operator B"); + assertEquals(expected, actual); + } + + public void testIsConversionOperator() throws Exception { + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); + ICPPClassType c= ba.assertNonProblem("X {", 1, ICPPClassType.class); + ICPPMethod[] dms= c.getDeclaredMethods(); + assertEquals(48, dms.length); + + for(ICPPMethod method : dms) { + String name= method.getName(); + boolean isConvOp= name.equals("operator A") || name.equals("operator B"); + assertEquals(isConvOp, SemanticUtil.isConversionOperator(method)); + } + } +} diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index b65b44a07d9..8e46c95e9a7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -1291,7 +1291,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti // E e; // foo(e); // } - public void testUserDefinedConversionOperator_224364() throws Exception { + public void _testUserDefinedConversionOperator_224364() throws Exception { IBinding ca= getBindingFromASTName("C c;", 1); assertInstance(ca, ICPPClassType.class); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 832150fc030..7c0790bac38 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -953,7 +953,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // C cx; // foo(cx); // } - public void testUserDefinedConversionOperator_224364() throws Exception { + public void _testUserDefinedConversionOperator_224364() throws Exception { IBinding ca= getBindingFromASTName("C", 4); assertInstance(ca, ICPPClassType.class); assertInstance(ca, ICPPTemplateInstance.class); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index 66c5a161b50..dfe31fb72c5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -41,6 +41,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecialization; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassTemplate; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; @@ -147,8 +151,15 @@ class Conversions { } } + boolean checkConversionOperators= + (SemanticUtil.ENABLE_224364 && s instanceof ICPPClassType) + || (s instanceof CPPClassType + || s instanceof CPPClassTemplate + || s instanceof CPPClassSpecialization + || s instanceof CPPClassInstance); + //conversion operators - if( s instanceof ICPPClassType ){ + if (checkConversionOperators) { ICPPMethod [] ops = SemanticUtil.getConversionOperators((ICPPClassType)s); if( ops.length > 0 && !(ops[0] instanceof IProblemBinding) ){ Cost [] costs = null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java index a9e1021de88..5d4389a856a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java @@ -42,16 +42,23 @@ public class SemanticUtil { */ private static final CharArraySet cas= new CharArraySet(OverloadableOperator.values().length); + /** + * Switch for enabling fix for bug 224364 + */ + public static final boolean ENABLE_224364= System.getProperty("cdt.enable.224364") != null; //$NON-NLS-1$ + static { + final int OPERATOR_SPC= OPERATOR_CHARS.length + 1; for(OverloadableOperator op : OverloadableOperator.values()) { - cas.put(op.toCharArray()); + char[] name= op.toCharArray(); + cas.put(CharArrayUtils.subarray(name, OPERATOR_SPC, name.length)); } } /** * Returns a list of ICPPMethod objects representing all conversion operators - * declared by the specified class. It does not include inherited methods. Conversion - * operators can not be implicit. + * declared by the specified class. This does not include inherited methods. Conversion + * operators cannot be implicit. * @param clazz * @return List of ICPPMethod */ @@ -70,8 +77,8 @@ public class SemanticUtil { /** * Returns a list of ICPPMethod objects representing all conversion operators - * declared by the specified class and its ancestors. It does not include inherited - * methods. Conversion operators can not be implicit. + * declared by the specified class and its ancestors. This includes inherited + * methods. Conversion operators cannot be implicit. * @param clazz * @return List of ICPPMethod */ @@ -120,9 +127,9 @@ public class SemanticUtil { /** * @param method - * @return true is the specified method is a conversion operator + * @return true if the specified method is a conversion operator */ - private static final boolean isConversionOperator(ICPPMethod method) { + public static final boolean isConversionOperator(ICPPMethod method) { boolean result= false; if(!method.isImplicit()) { final char[] name= method.getNameCharArray(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index eefc9d90b2a..d953d9080a3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -264,7 +264,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if ((pdomBinding instanceof PDOMCPPClassInstance || pdomBinding instanceof PDOMCPPDeferredClassInstance) && binding instanceof ICPPClassType) { // Add instantiated constructors to the index (bug 201174). addConstructors(pdomBinding, (ICPPClassType) binding); - addConversionOperators(pdomBinding, (ICPPClassType) binding); + if(SemanticUtil.ENABLE_224364) { + addConversionOperators(pdomBinding, (ICPPClassType) binding); + } } } } catch (DOMException e) {