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 f332e315812..481049217a8 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 @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -127,9 +128,15 @@ public class ClassMembersInitializationChecker extends AbstractIndexAstChecker { if (!actualConstructorFields.isEmpty()) { IASTFunctionCallExpression fCall = (IASTFunctionCallExpression) expression; IASTExpression fNameExp = fCall.getFunctionNameExpression(); + IBinding fBinding = null; if (fNameExp instanceof IASTIdExpression) { IASTIdExpression fName = (IASTIdExpression) fNameExp; - IBinding fBinding = fName.getName().resolveBinding(); + fBinding = fName.getName().resolveBinding(); + } else if (fNameExp instanceof ICPPASTFieldReference) { + ICPPASTFieldReference fName = (ICPPASTFieldReference) fNameExp; + fBinding = fName.getFieldName().resolveBinding(); + } + if (fBinding != null) { if (fBinding instanceof ICPPMethod) { ICPPMethod method = (ICPPMethod) fBinding; ICompositeType constructorOwner = actualConstructorFields.iterator().next().getCompositeTypeOwner(); 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 5cd0fa13aa1..dc39eb9044a 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 @@ -647,4 +647,21 @@ public class ClassMembersInitializationCheckerTest extends CheckerTestCase { loadCodeAndRun(getAboveComment()); checkNoErrors(); } + + // class ClassWithWarning { + // public: + // ClassWithWarning(char* n) { + // this->initClass(n); + // } + // + // private: + // char *name; + // void initClass(char *name) { + // this->name = name; + // } + // }; + public void testMemberFunctionCalling_519473() throws Exception { + loadCodeAndRun(getAboveComment()); + checkNoErrors(); + } }