1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 299911. Improved propagation of template instantiation context.

This commit is contained in:
Sergey Prigogin 2012-08-10 14:10:07 -07:00
parent b774b53a26
commit 2fc1fe1a7d
4 changed files with 24 additions and 24 deletions

View file

@ -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 {

View file

@ -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;
}
}

View file

@ -870,7 +870,7 @@ public class ClassTypeHelper {
* @param classTarget the class to check
* @return <code>true</code> 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 <code>std::tr1::has_trivial_default_constructor</code>.
*
* @param classTarget the class to check
* @param point
* @return <code>true</code> 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 <code>true</code> 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;
}
}

View file

@ -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);