Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/codan
diff options
context:
space:
mode:
authorSergey Prigogin2013-04-03 06:48:43 +0000
committerSergey Prigogin2013-04-03 06:48:43 +0000
commitcc82847af694b8c4059d74f3c9b0c8bb320886db (patch)
treed826a97183b5c13d5b36bb4cf49418667bf2bb68 /codan
parentf987bfe27c12dc042f7bc04d2305155c36e51b75 (diff)
downloadorg.eclipse.cdt-cc82847af694b8c4059d74f3c9b0c8bb320886db.tar.gz
org.eclipse.cdt-cc82847af694b8c4059d74f3c9b0c8bb320886db.tar.xz
org.eclipse.cdt-cc82847af694b8c4059d74f3c9b0c8bb320886db.zip
Bug 404774 - Invalid implicit ctor call is not marked as error
Diffstat (limited to 'codan')
-rw-r--r--codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java21
-rw-r--r--codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ProblemBindingCheckerTest.java29
2 files changed, 32 insertions, 18 deletions
diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java
index c57ce603003..17fa59f78fd 100644
--- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java
+++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ProblemBindingChecker.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2011 Marc-Andre Laperle and others.
+ * Copyright (c) 2010, 2013 Marc-Andre Laperle and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
* Contributors:
* Marc-Andre Laperle - Initial API and implementation
* Tomasz Wesolowski - Extension for fixes
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.codan.internal.checkers;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
+import org.eclipse.cdt.core.dom.ast.IASTImplicitName;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -32,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
@@ -74,6 +77,7 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker {
ast.accept(new ASTVisitor() {
{
shouldVisitNames = true;
+ shouldVisitImplicitNames = true;
}
@Override
@@ -82,7 +86,7 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker {
IBinding binding = name.resolveBinding();
if (binding instanceof IProblemBinding) {
IASTNode parentNode = name.getParent();
- // Don't report multiple problems with qualified names
+ // Don't report multiple problems with qualified names.
if (parentNode instanceof ICPPASTQualifiedName) {
if (((ICPPASTQualifiedName) parentNode).resolveBinding() instanceof IProblemBinding)
return PROCESS_CONTINUE;
@@ -137,11 +141,11 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker {
return PROCESS_CONTINUE;
}
// From this point, we'll deal only with NAME_NOT_FOUND problems.
- // If it's something else continue because we don't want to give bad messages
+ // If it's something else continue because we don't want to give bad messages.
if (id != IProblemBinding.SEMANTIC_NAME_NOT_FOUND) {
return PROCESS_CONTINUE;
}
- if (isFunctionCall(parentNode)) {
+ if (isFunctionCall(name, parentNode)) {
handleFunctionProblem(name, problemBinding, contextFlagsString);
} else if (parentNode instanceof IASTFieldReference) {
handleMemberProblem(name, parentNode, problemBinding, contextFlagsString);
@@ -227,14 +231,16 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker {
reportProblem(ERR_ID_VariableResolutionProblem, name, name.getBinding().getName(), contextFlagsString, name.getRawSignature());
}
- private boolean isFunctionCall(IASTNode parentNode) {
+ private boolean isFunctionCall(IASTName name, IASTNode parentNode) {
if (parentNode instanceof IASTIdExpression) {
IASTIdExpression expression = (IASTIdExpression) parentNode;
IASTNode parentParentNode = expression.getParent();
if (parentParentNode instanceof IASTFunctionCallExpression
- && expression.getPropertyInParent().getName().equals(IASTFunctionCallExpression.FUNCTION_NAME.getName())) {
+ && expression.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) {
return true;
}
+ } else if (parentNode instanceof ICPPASTDeclarator && name instanceof IASTImplicitName) {
+ return true;
}
return false;
}
@@ -280,8 +286,7 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker {
}
/**
- * Returns a string of the function signature : returntype + function +
- * parameters
+ * Returns a string of the function signature : returntype + function + parameters
*
* @param functionBinding The function to get the signature
* @return A string of the function signature
diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ProblemBindingCheckerTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ProblemBindingCheckerTest.java
index 924fc446545..3e250a259cd 100644
--- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ProblemBindingCheckerTest.java
+++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/ProblemBindingCheckerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011 Marc-Andre Laperle and others.
+ * Copyright (c) 2011, 2013 Marc-Andre Laperle and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Marc-Andre Laperle - Initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.codan.core.internal.checkers;
@@ -20,15 +21,11 @@ public class ProblemBindingCheckerTest extends CheckerTestCase {
return true;
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.cdt.codan.core.test.CodanTestCase#setUp()
- */
@Override
public void setUp() throws Exception {
super.setUp();
- enableProblems(ProblemBindingChecker.ERR_ID_AmbiguousProblem, ProblemBindingChecker.ERR_ID_Candidates,
+ enableProblems(
+ ProblemBindingChecker.ERR_ID_AmbiguousProblem, ProblemBindingChecker.ERR_ID_Candidates,
ProblemBindingChecker.ERR_ID_CircularReferenceProblem, ProblemBindingChecker.ERR_ID_FieldResolutionProblem,
ProblemBindingChecker.ERR_ID_FunctionResolutionProblem, ProblemBindingChecker.ERR_ID_InvalidArguments,
ProblemBindingChecker.ERR_ID_InvalidTemplateArgumentsProblem, ProblemBindingChecker.ERR_ID_LabelStatementNotFoundProblem,
@@ -42,11 +39,23 @@ public class ProblemBindingCheckerTest extends CheckerTestCase {
// struct X {} x;
// fun(x.y);
// }
- public void testBug338683FieldInFunctionCall() {
+ public void testFieldInFunctionCall_338683() {
loadCodeAndRun(getAboveComment());
checkErrorLine(3, ProblemBindingChecker.ERR_ID_FieldResolutionProblem);
}
+ // struct A {
+ // A(int x, int y);
+ // };
+ //
+ // void test() {
+ // A a("hi", 1, 2);
+ // }
+ public void testImplicitConstructorCall_404774() {
+ loadCodeAndRun(getAboveComment());
+ checkErrorLine(6, ProblemBindingChecker.ERR_ID_InvalidArguments);
+ }
+
// int main () {
// struct X {} x;
// x.b(
@@ -61,7 +70,7 @@ public class ProblemBindingCheckerTest extends CheckerTestCase {
// x.y,
// a.b()))));
// }
- public void testBug338683VariousFieldMethodCombinations() {
+ public void testVariousFieldMethodCombinations_338683() {
loadCodeAndRun(getAboveComment());
checkErrorLine(3, ProblemBindingChecker.ERR_ID_MethodResolutionProblem);
checkErrorLine(4, ProblemBindingChecker.ERR_ID_MethodResolutionProblem);
@@ -81,7 +90,7 @@ public class ProblemBindingCheckerTest extends CheckerTestCase {
// MACRO(foo());
// return 0;
// }
- public void testBug341089DontUnderlineWholeMacro() {
+ public void testDontUnderlineWholeMacro_341089() {
loadCodeAndRun(getAboveComment());
IMarker marker = checkErrorLine(3, ProblemBindingChecker.ERR_ID_FunctionResolutionProblem);
assertFalse(marker.getAttribute(IMarker.MESSAGE, "").contains("MACRO")); //$NON-NLS-1$//$NON-NLS-2$

Back to the top