From 59de5c303fa4acb288a734742afc6ea017579225 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 17 Dec 2015 23:50:14 -0500 Subject: [PATCH] Bug 484619 - Make sure ProblemBindingChecker reports unresolved user-defined literal operators Change-Id: Idbb157c33b3aae06a00a10f7e7836e96db9f9b63 Signed-off-by: Nathan Ridge --- .../internal/checkers/ProblemBindingChecker.java | 4 ++++ .../checkers/ProblemBindingCheckerTest.java | 14 ++++++++++++++ .../dom/parser/cpp/semantics/CPPSemantics.java | 4 ++-- 3 files changed, 20 insertions(+), 2 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 75e2ecba211..a309e728b51 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 @@ -35,6 +35,7 @@ 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.ICPPASTLiteralExpression; 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; @@ -245,6 +246,9 @@ public class ProblemBindingChecker extends AbstractIndexAstChecker { } } else if (parentNode instanceof ICPPASTDeclarator && name instanceof IASTImplicitName) { return true; + } else if (parentNode instanceof ICPPASTLiteralExpression && name instanceof IASTImplicitName) { + // Implicit name for user-defined literal operator. + return true; } return false; } 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 3e250a259cd..67cbccdadae 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 @@ -95,4 +95,18 @@ public class ProblemBindingCheckerTest extends CheckerTestCase { IMarker marker = checkErrorLine(3, ProblemBindingChecker.ERR_ID_FunctionResolutionProblem); assertFalse(marker.getAttribute(IMarker.MESSAGE, "").contains("MACRO")); //$NON-NLS-1$//$NON-NLS-2$ } + + // auto d = 42_waldo; + public void testNonexistentUDLOperator_484619() { + loadCodeAndRun(getAboveComment()); + checkErrorLine(1, ProblemBindingChecker.ERR_ID_FunctionResolutionProblem); + } + + // struct R {}; + // R operator "" _waldo(const char*, unsigned long); // expects a string literal + // auto d = 42_waldo; // passing an integer + public void testUDLOperatorWithWrongType_484619() { + loadCodeAndRun(getAboveComment()); + checkErrorLine(3, ProblemBindingChecker.ERR_ID_InvalidArguments); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 5a14ad8c180..cb670ee54ff 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -3137,7 +3137,7 @@ public class CPPSemantics { if (funcs.length == 0) { // S shall not be empty - return new ProblemBinding(data.getLookupName(), exp, IProblemBinding.SEMANTIC_INVALID_TYPE); + return new ProblemBinding(data.getLookupName(), exp, IProblemBinding.SEMANTIC_NAME_NOT_FOUND); } if (kind == IASTLiteralExpression.lk_integer_constant || kind == IASTLiteralExpression.lk_float_constant) { @@ -3209,7 +3209,7 @@ public class CPPSemantics { } else if (ret == null) { // Couldn't find a valid operator - return new ProblemBinding(data.getLookupName(), exp, IProblemBinding.SEMANTIC_INVALID_TYPE); + return new ProblemBinding(data.getLookupName(), exp, IProblemBinding.SEMANTIC_INVALID_OVERLOAD); } } else if (kind == IASTLiteralExpression.lk_string_literal) { /*