From d3d7a4e84ab20b3c4446861fa51e1b8b64f5a44e Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sat, 23 Jul 2016 17:31:14 -0400 Subject: [PATCH] Bug 498393 - Do not cache bases computed when a class is incomplete Change-Id: Ieddb15ff1cd784710a19d85879bb0d7b40f425b3 --- .../core/parser/tests/ast2/AST2CPPTests.java | 24 +++++++++++++++++++ .../cdt/core/dom/ast/cpp/ICPPBase.java | 2 ++ .../core/dom/parser/cpp/CPPClassType.java | 8 ++++++- .../core/dom/parser/cpp/ClassTypeHelper.java | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 982201ce1be..cee04fa6e66 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -10149,6 +10149,30 @@ public class AST2CPPTests extends AST2TestBase { public void testOverloadedOperatorWithInheritanceDistance_335387() throws Exception { parseAndCheckBindings(); } + + // struct Object { + // bool IsOk() const; + // }; + // + // struct Bitmap; + // + // struct Region : Object { + // Region(const Bitmap& bmp) { + // Union(bmp); + // } + // + // void Union(const Region&); + // void Union(const Bitmap&); + // }; + // + // struct Bitmap : Object {}; + // + // void waldo(Bitmap& icon) { + // icon.IsOk(); // ERROR: "Method 'IsOk' could not be resolved" + // } + public void testBaseComputationWhileTypeIsIncomplete_498393() throws Exception { + parseAndCheckBindings(); + } // namespace ns {int a;} // using ns::a; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java index 4b97caf6b9a..0d582cf755d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPBase.java @@ -26,6 +26,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; */ public interface ICPPBase extends Cloneable { public static final ICPPBase[] EMPTY_BASE_ARRAY = {}; + /** @since 6.0 */ + public static final ICPPBase[] NO_BASES_BECAUSE_TYPE_IS_INCOMPLETE = {}; public static final int v_private = ICPPASTBaseSpecifier.v_private; public static final int v_protected = ICPPASTBaseSpecifier.v_protected; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index 4936d67c683..f6305534b43 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -317,7 +317,13 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp @Override public ICPPBase[] getBases() { if (bases == null) { - bases = ClassTypeHelper.getBases(this); + ICPPBase[] result = ClassTypeHelper.getBases(this); + // Do not cache the computed bases if the class is incomplete. + // When the class becomes complete, the answer may be different. + if (result != ICPPBase.NO_BASES_BECAUSE_TYPE_IS_INCOMPLETE) { + bases = result; + } + return result; } return bases; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 8a79730b759..95f1d870c83 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -194,7 +194,7 @@ public class ClassTypeHelper { if (backup != null) return backup.getBases(); - return ICPPBase.EMPTY_BASE_ARRAY; + return ICPPBase.NO_BASES_BECAUSE_TYPE_IS_INCOMPLETE; } }