From dfc2eb9c5289e0358ca827a7b7408f6c5a127eb0 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 24 Mar 2009 18:12:47 +0000 Subject: [PATCH] Destructors are neither const nor volatile, bug 269655. --- .../cdt/internal/core/dom/parser/cpp/CPPClassScope.java | 3 +-- .../internal/core/dom/parser/cpp/semantics/CPPSemantics.java | 3 ++- .../internal/core/dom/parser/cpp/semantics/CPPVisitor.java | 5 +---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index f829e8079dc..2f50f68fe33 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -133,8 +133,7 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { if (!ia.hasUserDeclaredDestructor()) { //destructor: ~A() - // a destructor can be called for const and volatile objects - ICPPFunctionType ft= CPPVisitor.createImplicitFunctionType(new CPPBasicType(IBasicType.t_unspecified, 0), voidPs, true, true); + ICPPFunctionType ft= CPPVisitor.createImplicitFunctionType(new CPPBasicType(IBasicType.t_unspecified, 0), voidPs, false, false); char[] dtorName = CharArrayUtils.concat("~".toCharArray(), className); //$NON-NLS-1$ ICPPMethod m = new CPPImplicitMethod(this, dtorName, ft, voidPs); implicits[i++] = m; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index f1e81c60086..09a365de54e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -2200,7 +2200,8 @@ public class CPPSemantics { final IType thisType = data.getImpliedObjectArgument(); - if (ASTInternal.isStatic(fn, false)) { + if (fn instanceof ICPPMethod && + (((ICPPMethod) fn).isDestructor() || ASTInternal.isStatic(fn, false))) { // 13.3.1-4 for static member functions, the implicit object parameter always matches, no cost cost = new Cost(thisType, implicitType, Rank.IDENTITY); } else if (thisType == null) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 8811c8d1ffa..d3a636f193c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1558,10 +1558,7 @@ public class CPPVisitor extends ASTQueries { returnType = getPointerTypes(returnType, fnDtor); } - // a destructor can be called for const and volatile objects - final char[] lookupKey = name.getLookupKey(); - final boolean isDestructor= lookupKey.length > 0 && lookupKey[0]=='~'; - IType type = new CPPFunctionType(returnType, pTypes, isDestructor || fnDtor.isConst(), isDestructor || fnDtor.isVolatile()); + IType type = new CPPFunctionType(returnType, pTypes, fnDtor.isConst(), fnDtor.isVolatile()); final IASTDeclarator nested = fnDtor.getNestedDeclarator(); if (nested != null) { return createType(type, nested);