From ae8442fd6d7392dddfdfdc8202ad2834e8b9bea2 Mon Sep 17 00:00:00 2001 From: Bassem Girgis Date: Mon, 8 Oct 2018 00:52:13 -0500 Subject: [PATCH] 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 --- .../ClassMembersInitializationChecker.java | 4 ++++ .../ClassMembersInitializationCheckerTest.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java index 481049217a8..c0d37e7a199 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java @@ -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.index.IIndex; 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.CPPVariableReadWriteFlags; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; @@ -291,6 +292,9 @@ public class ClassMembersInitializationChecker extends AbstractIndexAstChecker { } else if (memberBinding instanceof ICPPConstructor) { classType = ((ICPPConstructor) memberBinding).getClassOwner(); } + if (classType instanceof ICPPDeferredClassInstance) { + classType = ((ICPPDeferredClassInstance) classType).getClassTemplate(); + } if (classType != null && classType.isSameType(constructor.getClassOwner())) return null; } diff --git a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/ClassMembersInitializationCheckerTest.java b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/ClassMembersInitializationCheckerTest.java index dc39eb9044a..51b059bf9c4 100644 --- a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/ClassMembersInitializationCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/ClassMembersInitializationCheckerTest.java @@ -639,6 +639,24 @@ public class ClassMembersInitializationCheckerTest extends CheckerTestCase { checkNoErrors(); } + // template + // 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 { // A() {}; // int x = 0;