Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/codan
diff options
context:
space:
mode:
authorBassem Girgis2018-10-08 05:52:13 +0000
committerNathan Ridge2018-10-10 04:09:22 +0000
commitae8442fd6d7392dddfdfdc8202ad2834e8b9bea2 (patch)
treeeacdf482e6f13eff34e6e47061f427daf68ac48a /codan
parent9c04b1bcf7ddec24a80c9e389ca77e43ef530e0d (diff)
downloadorg.eclipse.cdt-ae8442fd6d7392dddfdfdc8202ad2834e8b9bea2.tar.gz
org.eclipse.cdt-ae8442fd6d7392dddfdfdc8202ad2834e8b9bea2.tar.xz
org.eclipse.cdt-ae8442fd6d7392dddfdfdc8202ad2834e8b9bea2.zip
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>
Diffstat (limited to 'codan')
-rw-r--r--codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java4
-rw-r--r--codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/ClassMembersInitializationCheckerTest.java18
2 files changed, 22 insertions, 0 deletions
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 <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 {
// A() {};
// int x = 0;

Back to the top