diff options
Diffstat (limited to 'core/org.eclipse.cdt.core')
3 files changed, 29 insertions, 9 deletions
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) { |