1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Bug 519311 Handle delegating constructor in class template

- Fixed delegating constructor resolution for templated classes in
ClassMembersInitializationChecker
- Added a unit test for this bug

Change-Id: Idb072ec05e66e0f10af53db8258459ad14f7f329
Signed-off-by: Bassem Girgis <brgirgis@gmail.com>
This commit is contained in:
Bassem Girgis 2018-10-08 00:52:13 -05:00 committed by Nathan Ridge
parent 9c04b1bcf7
commit ae8442fd6d
2 changed files with 22 additions and 0 deletions

View file

@ -52,6 +52,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries; import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
@ -291,6 +292,9 @@ public class ClassMembersInitializationChecker extends AbstractIndexAstChecker {
} else if (memberBinding instanceof ICPPConstructor) { } else if (memberBinding instanceof ICPPConstructor) {
classType = ((ICPPConstructor) memberBinding).getClassOwner(); classType = ((ICPPConstructor) memberBinding).getClassOwner();
} }
if (classType instanceof ICPPDeferredClassInstance) {
classType = ((ICPPDeferredClassInstance) classType).getClassTemplate();
}
if (classType != null && classType.isSameType(constructor.getClassOwner())) if (classType != null && classType.isSameType(constructor.getClassOwner()))
return null; return null;
} }

View file

@ -639,6 +639,24 @@ public class ClassMembersInitializationCheckerTest extends CheckerTestCase {
checkNoErrors(); checkNoErrors();
} }
// template <typename T>
// class TemplateWithWarning {
// public:
// TemplateWithWarning(int number) {
// internalNumber = number;
// }
//
// TemplateWithWarning(int number, bool someFlag)
// : TemplateWithWarning(number) {}
//
// protected:
// int internalNumber;
// };
public void testDelegatingConstructorWithTemplate_519311() throws Exception {
loadCodeAndRun(getAboveComment());
checkNoErrors();
}
// struct A { // struct A {
// A() {}; // A() {};
// int x = 0; // int x = 0;