From b3908852119605af78ddf21b758ee13795fad92a Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Wed, 1 Jun 2022 13:59:41 +0200 Subject: [PATCH] Bug 580062 - Self assignment check fix Fix for false positive error in assignment operator checker when a noexcept specifier is used. Change-Id: If82788cda4a37af1c628a937a6960f59de6b0f5b --- .../checkers/AssignmentOperatorChecker.java | 2 +- .../checkers/AssignmentOperatorCheckerTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AssignmentOperatorChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AssignmentOperatorChecker.java index c3196b940fe..167b6dd0bfd 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AssignmentOperatorChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AssignmentOperatorChecker.java @@ -112,7 +112,7 @@ public class AssignmentOperatorChecker extends AbstractIndexAstChecker { reportProblem(MISS_SELF_CHECK_ID, info.decl); } info.decl = null; - } else { + } else if (expression.getPropertyInParent() != ICPPASTFunctionDeclarator.NOEXCEPT_EXPRESSION) { reportProblem(MISS_SELF_CHECK_ID, info.decl); info.decl = null; } diff --git a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/AssignmentOperatorCheckerTest.java b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/AssignmentOperatorCheckerTest.java index 3d687bd8c8c..1185530036a 100644 --- a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/AssignmentOperatorCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/AssignmentOperatorCheckerTest.java @@ -47,6 +47,22 @@ public class AssignmentOperatorCheckerTest extends CheckerTestCase { checkNoErrorsOfKind(MISS_SELF_ID); } + //class Foo { + //public: + //Foo& operator=(Foo& f) noexcept (false); + //}; + //Foo& Foo::operator=(Foo& f) noexcept (false) { + // if (this != &f) { + // return *this; + // } + // return *this; + //} + public void testWithNoErrorNoexcept() throws Exception { + loadCodeAndRun(getAboveComment()); + checkNoErrorsOfKind(MISS_REF_ID); + checkNoErrorsOfKind(MISS_SELF_ID); + } + //class Foo { //public: //Foo operator=(const Foo& f);