From 2fc1fe1a7d79341d69d14dfcab0242159324a446 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 10 Aug 2012 14:10:07 -0700 Subject: [PATCH] Bug 299911. Improved propagation of template instantiation context. --- .../tests/ast2/ClassTypeHelperTests.java | 12 ++++---- .../cdt/core/dom/rewrite/TypeHelper.java | 5 ++-- .../core/dom/parser/cpp/ClassTypeHelper.java | 29 ++++++++++--------- .../semantics/CPPVariableReadWriteFlags.java | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ClassTypeHelperTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ClassTypeHelperTests.java index f3454e8e5cd..aadfeac5678 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ClassTypeHelperTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/ClassTypeHelperTests.java @@ -59,11 +59,11 @@ public class ClassTypeHelperTests extends AST2BaseTest { public void testHasTrivialCopyCtor() throws Exception { BindingAssertionHelper helper = getAssertionHelper(); ICPPClassType classA = helper.assertNonProblem("A {", 1, ICPPClassType.class); - assertFalse(ClassTypeHelper.hasTrivialCopyCtor(classA)); + assertFalse(ClassTypeHelper.hasTrivialCopyCtor(classA, null)); ICPPClassType classB = helper.assertNonProblem("B {", 1, ICPPClassType.class); - assertTrue(ClassTypeHelper.hasTrivialCopyCtor(classB)); + assertTrue(ClassTypeHelper.hasTrivialCopyCtor(classB, null)); ICPPClassType classC = helper.assertNonProblem("C {", 1, ICPPClassType.class); - assertFalse(ClassTypeHelper.hasTrivialCopyCtor(classC)); + assertFalse(ClassTypeHelper.hasTrivialCopyCtor(classC, null)); } // struct A { @@ -87,11 +87,11 @@ public class ClassTypeHelperTests extends AST2BaseTest { public void testHasTrivialDestructor() throws Exception { BindingAssertionHelper helper = getAssertionHelper(); ICPPClassType classA = helper.assertNonProblem("A {", 1, ICPPClassType.class); - assertFalse(ClassTypeHelper.hasTrivialDestructor(classA)); + assertFalse(ClassTypeHelper.hasTrivialDestructor(classA, null)); ICPPClassType classB = helper.assertNonProblem("B {", 1, ICPPClassType.class); - assertTrue(ClassTypeHelper.hasTrivialDestructor(classB)); + assertTrue(ClassTypeHelper.hasTrivialDestructor(classB, null)); ICPPClassType classC = helper.assertNonProblem("C {", 1, ICPPClassType.class); - assertFalse(ClassTypeHelper.hasTrivialDestructor(classC)); + assertFalse(ClassTypeHelper.hasTrivialDestructor(classC, null)); } // struct A { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/rewrite/TypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/rewrite/TypeHelper.java index 254059fb287..6283e41a767 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/rewrite/TypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/rewrite/TypeHelper.java @@ -29,7 +29,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; * @since 5.4 */ public class TypeHelper { - // Do not instantiate - all methods are static. private TypeHelper() { } @@ -49,8 +48,8 @@ public class TypeHelper { if (type instanceof ICompositeType) { if (type instanceof ICPPClassType) { ICPPClassType classType = ((ICPPClassType) type); - if (!ClassTypeHelper.hasTrivialCopyCtor(classType) || - !ClassTypeHelper.hasTrivialDestructor(classType)) { + if (!ClassTypeHelper.hasTrivialCopyCtor(classType, ast) || + !ClassTypeHelper.hasTrivialDestructor(classType, ast)) { return true; } } 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 44689aa71d6..3ddeba3b2fb 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 @@ -870,7 +870,7 @@ public class ClassTypeHelper { * @param classTarget the class to check * @return true if the class has a trivial copy constructor */ - public static boolean hasTrivialCopyCtor(ICPPClassType classTarget) { + public static boolean hasTrivialCopyCtor(ICPPClassType classTarget, IASTNode point) { if (getImplicitCopyCtor(classTarget) == null) return false; if (isPolymorphic(classTarget)) @@ -879,8 +879,8 @@ public class ClassTypeHelper { if (base.isVirtual()) return false; } - for (ICPPClassType baseClass : getAllBases(classTarget, null)) { - if (!classTarget.isSameType(baseClass) && !hasTrivialCopyCtor(baseClass)) + for (ICPPClassType baseClass : getAllBases(classTarget, point)) { + if (!classTarget.isSameType(baseClass) && !hasTrivialCopyCtor(baseClass, point)) return false; } for (ICPPField field : classTarget.getDeclaredFields()) { @@ -888,7 +888,7 @@ public class ClassTypeHelper { IType type = field.getType(); type = SemanticUtil.getNestedType(type, TDEF | CVTYPE | ARRAY); if (type instanceof ICPPClassType && !classTarget.isSameType(type) && - !hasTrivialCopyCtor((ICPPClassType) type)) { + !hasTrivialCopyCtor((ICPPClassType) type, point)) { return false; } } @@ -924,23 +924,24 @@ public class ClassTypeHelper { * Similar to std::tr1::has_trivial_default_constructor. * * @param classTarget the class to check + * @param point * @return true if the class has a trivial default constructor */ - public static boolean hasTrivialDefaultConstructor(ICPPClassType classTarget) { - for (ICPPConstructor ctor : classTarget.getConstructors()) { + public static boolean hasTrivialDefaultConstructor(ICPPClassType classTarget, IASTNode point) { + for (ICPPConstructor ctor : getConstructors(classTarget, point)) { if (!ctor.isImplicit() && ctor.getParameters().length == 0) return false; } for (ICPPClassType baseClass : getAllBases(classTarget, null)) { - if (!classTarget.isSameType(baseClass) && !hasTrivialDefaultConstructor(baseClass)) + if (!classTarget.isSameType(baseClass) && !hasTrivialDefaultConstructor(baseClass, point)) return false; } - for (ICPPField field : classTarget.getDeclaredFields()) { + for (ICPPField field : getDeclaredFields(classTarget, point)) { if (!field.isStatic()) { IType type = field.getType(); type = SemanticUtil.getNestedType(type, TDEF | CVTYPE | ARRAY); if (type instanceof ICPPClassType && !classTarget.isSameType(type) && - !hasTrivialDefaultConstructor((ICPPClassType) type)) { + !hasTrivialDefaultConstructor((ICPPClassType) type, point)) { return false; } } @@ -962,21 +963,21 @@ public class ClassTypeHelper { * @param classTarget the class to check * @return true if the class has a trivial destructor */ - public static boolean hasTrivialDestructor(ICPPClassType classTarget) { - for (ICPPMethod method : classTarget.getDeclaredMethods()) { + public static boolean hasTrivialDestructor(ICPPClassType classTarget, IASTNode point) { + for (ICPPMethod method : getDeclaredMethods(classTarget, point)) { if (method.isDestructor()) return false; } for (ICPPClassType baseClass : getAllBases(classTarget, null)) { - if (!classTarget.isSameType(baseClass) && !hasTrivialDestructor(baseClass)) + if (!classTarget.isSameType(baseClass) && !hasTrivialDestructor(baseClass, point)) return false; } - for (ICPPField field : classTarget.getDeclaredFields()) { + for (ICPPField field : getDeclaredFields(classTarget, point)) { if (!field.isStatic()) { IType type = field.getType(); type = SemanticUtil.getNestedType(type, TDEF | CVTYPE | ARRAY); if (type instanceof ICPPClassType && !classTarget.isSameType(type) && - !hasTrivialDestructor((ICPPClassType) type)) { + !hasTrivialDestructor((ICPPClassType) type, point)) { return false; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java index cb3e0dad436..4086f1bd98c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVariableReadWriteFlags.java @@ -61,7 +61,7 @@ public final class CPPVariableReadWriteFlags extends VariableReadWriteFlags { IType type = CPPVisitor.createType(parent); if (type instanceof ICPPUnknownType || type instanceof ICPPClassType && - !ClassTypeHelper.hasTrivialDefaultConstructor((ICPPClassType) type)) { + !ClassTypeHelper.hasTrivialDefaultConstructor((ICPPClassType) type, parent)) { return WRITE; } return super.rwInDeclarator(parent, indirection);