From 46e5ebaae81f25579405e78d067b691fddb007f2 Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Thu, 28 Sep 2023 23:15:54 +0100 Subject: [PATCH 1/9] A7-3-1: Refactor to avoid join on name Refactor to: 1. Avoid any potential performance problems from equating names of two member functions. 2. Report the Declaration, not the DeclarationEntry of the hidden function, which reduces duplication. --- ...enInheritedNonOverridableMemberFunction.ql | 19 +++++++++++++------ ...ritedNonOverridableMemberFunction.expected | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql index 0083fb0cb4..1f0eb4a19b 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql @@ -16,17 +16,24 @@ import cpp import codingstandards.cpp.autosar -from FunctionDeclarationEntry overridingDecl, FunctionDeclarationEntry hiddenDecl +/** + * Holds if the class has a non-virtual member function with the given name. + */ +predicate hasNonVirtualMemberFunction(Class clazz, MemberFunction mf, string name) { + mf.getDeclaringType() = clazz and + mf.getName() = name and + not mf.isVirtual() +} + +from FunctionDeclarationEntry overridingDecl, MemberFunction hiddenDecl where not isExcluded(overridingDecl, ScopePackage::hiddenInheritedNonOverridableMemberFunctionQuery()) and // Check if we are overriding a non-virtual inherited member function - overridingDecl.getName() = hiddenDecl.getName() and - overridingDecl.getDeclaration().getDeclaringType().getABaseClass() = - hiddenDecl.getDeclaration().getDeclaringType() and - not hiddenDecl.getDeclaration().isVirtual() and + hasNonVirtualMemberFunction(overridingDecl.getDeclaration().getDeclaringType().getABaseClass(), + hiddenDecl, overridingDecl.getName()) and // Where the hidden member function isn't explicitly brought in scope through a using declaration. not exists(UsingDeclarationEntry ude | - ude.getDeclaration() = hiddenDecl.getDeclaration() and + ude.getDeclaration() = hiddenDecl and ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() and ude.getLocation().getStartLine() < overridingDecl.getLocation().getStartLine() ) and diff --git a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected index 85ede1ada2..ca10ea31f3 100644 --- a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected +++ b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected @@ -1 +1 @@ -| test.cpp:16:8:16:9 | declaration of f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | declaration of f1 | f1 | +| test.cpp:16:8:16:9 | declaration of f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | f1 | f1 | From 1263d08214a847a1cd1a14cf2fa473b0a427f7af Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Thu, 28 Sep 2023 23:36:29 +0100 Subject: [PATCH 2/9] A7-3-1: Ignore order of using and decl The filter on order between overriding declaration and using was problematic because: 1. It produced a bad join order related to start lines. 2. It did not check if they were in the same file. 3. It used the wrong declaration - the order of the overriding declaration and the using declaration doesn't matter. I think the intention was to confirm that the hidden declaration appeared before the using declaration (so that it was in scope), but errors of this kind would be identified by the DefinitionNotConsideredForUnqualifiedLookup.ql query, so there's no need to factor that in here. --- ...enInheritedNonOverridableMemberFunction.ql | 3 +-- cpp/autosar/test/rules/A7-3-1/test.cpp | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql index 1f0eb4a19b..1365d00f76 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql @@ -34,8 +34,7 @@ where // Where the hidden member function isn't explicitly brought in scope through a using declaration. not exists(UsingDeclarationEntry ude | ude.getDeclaration() = hiddenDecl and - ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() and - ude.getLocation().getStartLine() < overridingDecl.getLocation().getStartLine() + ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() ) and // Exclude compiler generated member functions which include things like copy constructor that hide base class // copy constructors. diff --git a/cpp/autosar/test/rules/A7-3-1/test.cpp b/cpp/autosar/test/rules/A7-3-1/test.cpp index 7aaeb26567..ce54c0abeb 100644 --- a/cpp/autosar/test/rules/A7-3-1/test.cpp +++ b/cpp/autosar/test/rules/A7-3-1/test.cpp @@ -47,7 +47,7 @@ void f1() { l1.f1(0); // calls C2::f1(double) instead of C1::f1(int) l1.f2(0); // calls C2::f2(double) instead of C1::f2(int) // S1 s1; - // l1.f2(s1); Won't compile because there is no suitable conversion fro S1 to + // l1.f2(s1); Won't compile because there is no suitable conversion from S1 to // double. C1 &l2{l1}; l2.f1(0); // calls C1::f1(int) @@ -60,3 +60,20 @@ void f1() { S1 l4; l3.f2(l4); // calls C1:f2(S1) } + +class C5 : public C1 { +public: + void f1(double); // COMPLIANT + using C1::f1; // order of using and f1 declaration is not relevant + + void f2(double) override; // COMPLIANT + using C1::f2; // order of using and f1 declaration is not relevant +}; + +void f2() { + C5 c5; + c5.f1(0); // calls C1::f1(int) + c5.f1(0.0); // calls C5::f1(double) + c5.f2(0); // calls C1::f2(int) + c5.f2(0.0); // calls C5::f2(double) +} \ No newline at end of file From 5283bc85304943721acd78a93e3bab8f9cca637d Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Thu, 28 Sep 2023 23:57:48 +0100 Subject: [PATCH 3/9] A7-3-1: Report the declaration not the entry There is no need to report every declaration entry. This commit also fixes performance issues that occurred when making this change. --- ...enInheritedNonOverridableMemberFunction.ql | 24 +++++++++++++------ ...ritedNonOverridableMemberFunction.expected | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql index 1365d00f76..5a4d8068bd 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql @@ -19,26 +19,36 @@ import codingstandards.cpp.autosar /** * Holds if the class has a non-virtual member function with the given name. */ +pragma[noinline, nomagic] predicate hasNonVirtualMemberFunction(Class clazz, MemberFunction mf, string name) { mf.getDeclaringType() = clazz and mf.getName() = name and not mf.isVirtual() } -from FunctionDeclarationEntry overridingDecl, MemberFunction hiddenDecl +/** + * Holds if the member function is in a class with the given base class, and has the given name. + */ +pragma[noinline, nomagic] +predicate hasDeclarationBaseClass(MemberFunction mf, Class baseClass, string functionName) { + baseClass = mf.getDeclaringType().getABaseClass() and + functionName = mf.getName() +} + +from MemberFunction overridingDecl, MemberFunction hiddenDecl, Class baseClass, string name where not isExcluded(overridingDecl, ScopePackage::hiddenInheritedNonOverridableMemberFunctionQuery()) and // Check if we are overriding a non-virtual inherited member function - hasNonVirtualMemberFunction(overridingDecl.getDeclaration().getDeclaringType().getABaseClass(), - hiddenDecl, overridingDecl.getName()) and + hasNonVirtualMemberFunction(baseClass, hiddenDecl, name) and + hasDeclarationBaseClass(overridingDecl, baseClass, name) and // Where the hidden member function isn't explicitly brought in scope through a using declaration. not exists(UsingDeclarationEntry ude | ude.getDeclaration() = hiddenDecl and - ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() + ude.getEnclosingElement() = overridingDecl.getDeclaringType() ) and // Exclude compiler generated member functions which include things like copy constructor that hide base class // copy constructors. - not overridingDecl.getDeclaration().isCompilerGenerated() + not overridingDecl.isCompilerGenerated() select overridingDecl, - "Declaration for member '" + overridingDecl.getName() + - "' hides non-overridable inherited member function $@", hiddenDecl, hiddenDecl.getName() + "Declaration for member '" + name + "' hides non-overridable inherited member function $@", + hiddenDecl, hiddenDecl.getName() diff --git a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected index ca10ea31f3..bf75699c4d 100644 --- a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected +++ b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected @@ -1 +1 @@ -| test.cpp:16:8:16:9 | declaration of f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | f1 | f1 | +| test.cpp:16:8:16:9 | f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | f1 | f1 | From 2dc3c188fa39ecfbe7dcd8d5eafad2885225cb5c Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Fri, 29 Sep 2023 08:29:25 +0100 Subject: [PATCH 4/9] A7-3-1: Do not report special member functions Special member functions are not inheritable. --- .../A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql | 5 ++++- cpp/autosar/test/rules/A7-3-1/test.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql index 5a4d8068bd..dab395777e 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql @@ -15,6 +15,7 @@ import cpp import codingstandards.cpp.autosar +import codingstandards.cpp.Class /** * Holds if the class has a non-virtual member function with the given name. @@ -48,7 +49,9 @@ where ) and // Exclude compiler generated member functions which include things like copy constructor that hide base class // copy constructors. - not overridingDecl.isCompilerGenerated() + not overridingDecl.isCompilerGenerated() and + // Exclude special member functions, which cannot be inherited. + not overridingDecl instanceof SpecialMemberFunction select overridingDecl, "Declaration for member '" + name + "' hides non-overridable inherited member function $@", hiddenDecl, hiddenDecl.getName() diff --git a/cpp/autosar/test/rules/A7-3-1/test.cpp b/cpp/autosar/test/rules/A7-3-1/test.cpp index ce54c0abeb..1b82860ca2 100644 --- a/cpp/autosar/test/rules/A7-3-1/test.cpp +++ b/cpp/autosar/test/rules/A7-3-1/test.cpp @@ -76,4 +76,9 @@ void f2() { c5.f1(0.0); // calls C5::f1(double) c5.f2(0); // calls C1::f2(int) c5.f2(0.0); // calls C5::f2(double) -} \ No newline at end of file +} + +class C6 : public C1 { +public: + C6 &operator=(const C6 &); // COMPLIANT +}; \ No newline at end of file From 40ef3c6270887e973dd804f0306b8ece14d49caf Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Fri, 29 Sep 2023 08:31:56 +0100 Subject: [PATCH 5/9] Add change note --- change_notes/2023-09-28-a7-3-1-updates.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 change_notes/2023-09-28-a7-3-1-updates.md diff --git a/change_notes/2023-09-28-a7-3-1-updates.md b/change_notes/2023-09-28-a7-3-1-updates.md new file mode 100644 index 0000000000..68ce080cbe --- /dev/null +++ b/change_notes/2023-09-28-a7-3-1-updates.md @@ -0,0 +1,6 @@ + * `A7-3-1` - `HiddenInheritedNonOverridableMemberFunction.ql`: + - Reduce duplication by reporting only a single location for each declaration of a problematic element. + - Reduce duplication when reporting the hidden function by reporting only one declaration entry. + - Improve performance by eliminating a number of bad join orders. + - Fix false positives where the using declaration occurred after the function declaration. + - Exclude special member functions, which cannot be inherited. \ No newline at end of file From 77ac3d09f523c924ed357a0896070d445461dda6 Mon Sep 17 00:00:00 2001 From: Luke Cartey <5377966+lcartey@users.noreply.github.com> Date: Fri, 6 Oct 2023 00:03:24 +0100 Subject: [PATCH 6/9] Update cpp/autosar/test/rules/A7-3-1/test.cpp Co-authored-by: Remco Vermeulen --- cpp/autosar/test/rules/A7-3-1/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/autosar/test/rules/A7-3-1/test.cpp b/cpp/autosar/test/rules/A7-3-1/test.cpp index 1b82860ca2..667ee63579 100644 --- a/cpp/autosar/test/rules/A7-3-1/test.cpp +++ b/cpp/autosar/test/rules/A7-3-1/test.cpp @@ -67,7 +67,7 @@ class C5 : public C1 { using C1::f1; // order of using and f1 declaration is not relevant void f2(double) override; // COMPLIANT - using C1::f2; // order of using and f1 declaration is not relevant + using C1::f2; // order of using and f2 declaration is not relevant }; void f2() { From 6e35de7de268921ffd780ea70cca3793b2b7965b Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Fri, 6 Oct 2023 14:12:10 +0100 Subject: [PATCH 7/9] A7-3-1: Enable using to be on any line Similar change to NonOverridable case. --- .../rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql index 4a252ecb51..f0200f684a 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql @@ -36,8 +36,7 @@ where // and the hidden declaration isn't explicitly brought in scope through a using declaration. not exists(UsingDeclarationEntry ude | ude.getDeclaration() = hiddenDecl.getDeclaration() and - ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() and - ude.getLocation().getStartLine() < overridingDecl.getLocation().getStartLine() + ude.getEnclosingElement() = overridingDecl.getDeclaration().getDeclaringType() ) or // 2. if the overriding declaration doesn't override a base member function but has the same name From 73736d9040ebfdfb587b3da5e5bb71f8f6ef4704 Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Mon, 23 Oct 2023 00:09:11 +0100 Subject: [PATCH 8/9] A7-3-1: Exclude private member functions Private member functions can't be inherited. --- change_notes/2023-09-28-a7-3-1-updates.md | 3 ++- .../HiddenInheritedNonOverridableMemberFunction.ql | 4 +++- .../A7-3-1/HiddenInheritedOverridableMemberFunction.ql | 2 ++ ...iddenInheritedNonOverridableMemberFunction.expected | 2 +- .../HiddenInheritedOverridableMemberFunction.expected | 10 +++++----- cpp/autosar/test/rules/A7-3-1/test.cpp | 10 ++++++++++ 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/change_notes/2023-09-28-a7-3-1-updates.md b/change_notes/2023-09-28-a7-3-1-updates.md index 68ce080cbe..f56d706e74 100644 --- a/change_notes/2023-09-28-a7-3-1-updates.md +++ b/change_notes/2023-09-28-a7-3-1-updates.md @@ -3,4 +3,5 @@ - Reduce duplication when reporting the hidden function by reporting only one declaration entry. - Improve performance by eliminating a number of bad join orders. - Fix false positives where the using declaration occurred after the function declaration. - - Exclude special member functions, which cannot be inherited. \ No newline at end of file + - Exclude special member functions, which cannot be inherited. + - Exclude private member functions, which cannot be inherited. \ No newline at end of file diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql index dab395777e..fa1859c229 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.ql @@ -24,7 +24,9 @@ pragma[noinline, nomagic] predicate hasNonVirtualMemberFunction(Class clazz, MemberFunction mf, string name) { mf.getDeclaringType() = clazz and mf.getName() = name and - not mf.isVirtual() + not mf.isVirtual() and + // Exclude private member functions, which cannot be inherited. + not mf.isPrivate() } /** diff --git a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql index f0200f684a..437c8798f9 100644 --- a/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql +++ b/cpp/autosar/src/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.ql @@ -21,6 +21,8 @@ where not isExcluded(overridingDecl, ScopePackage::hiddenInheritedOverridableMemberFunctionQuery()) and // Check if we are overriding a virtual inherited member function hiddenDecl.getDeclaration().isVirtual() and + // Exclude private member functions, which cannot be inherited. + not hiddenDecl.getDeclaration().(MemberFunction).isPrivate() and // The overriding declaration hides the hidden declaration if: ( // 1. the overriding declaration overrides a function in a base class that is an overload of the hidden declaration diff --git a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected index bf75699c4d..dc762e5a2d 100644 --- a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected +++ b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedNonOverridableMemberFunction.expected @@ -1 +1 @@ -| test.cpp:16:8:16:9 | f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | f1 | f1 | +| test.cpp:20:8:20:9 | f1 | Declaration for member 'f1' hides non-overridable inherited member function $@ | test.cpp:7:8:7:9 | f1 | f1 | diff --git a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.expected b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.expected index c2f8ee1f40..2e0e8809e8 100644 --- a/cpp/autosar/test/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.expected +++ b/cpp/autosar/test/rules/A7-3-1/HiddenInheritedOverridableMemberFunction.expected @@ -1,5 +1,5 @@ -| test.cpp:18:8:18:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:9:16:9:17 | declaration of f2 | f2 | -| test.cpp:18:8:18:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:11:16:11:17 | declaration of f2 | f2 | -| test.cpp:23:8:23:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:9:16:9:17 | declaration of f2 | f2 | -| test.cpp:23:8:23:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:10:16:10:17 | declaration of f2 | f2 | -| test.cpp:23:8:23:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:11:16:11:17 | declaration of f2 | f2 | +| test.cpp:22:8:22:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:9:16:9:17 | declaration of f2 | f2 | +| test.cpp:22:8:22:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:11:16:11:17 | declaration of f2 | f2 | +| test.cpp:27:8:27:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:9:16:9:17 | declaration of f2 | f2 | +| test.cpp:27:8:27:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:10:16:10:17 | declaration of f2 | f2 | +| test.cpp:27:8:27:9 | declaration of f2 | Declaration for member 'f2' hides overridable inherited member function $@ | test.cpp:11:16:11:17 | declaration of f2 | f2 | diff --git a/cpp/autosar/test/rules/A7-3-1/test.cpp b/cpp/autosar/test/rules/A7-3-1/test.cpp index 667ee63579..c0904238c3 100644 --- a/cpp/autosar/test/rules/A7-3-1/test.cpp +++ b/cpp/autosar/test/rules/A7-3-1/test.cpp @@ -9,6 +9,10 @@ class C1 { virtual void f2(int); virtual void f2(double); virtual void f2(S1); + +private: + void f3(int); + void f4(int); }; class C2 : public C1 { @@ -81,4 +85,10 @@ void f2() { class C6 : public C1 { public: C6 &operator=(const C6 &); // COMPLIANT +}; + +class C7 : public C1 { + void f3(int); // COMPLIANT + + void f4(int); // COMPLIANT }; \ No newline at end of file From 492b578fedce3689246cb5fd5b9bb808ffcc7573 Mon Sep 17 00:00:00 2001 From: Luke Cartey Date: Mon, 23 Oct 2023 22:56:56 +0100 Subject: [PATCH 9/9] Update expected results. --- .../A7-3-1/DefinitionNotConsideredForUnqualifiedLookup.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/autosar/test/rules/A7-3-1/DefinitionNotConsideredForUnqualifiedLookup.expected b/cpp/autosar/test/rules/A7-3-1/DefinitionNotConsideredForUnqualifiedLookup.expected index ea0f998533..1a1e0e5297 100644 --- a/cpp/autosar/test/rules/A7-3-1/DefinitionNotConsideredForUnqualifiedLookup.expected +++ b/cpp/autosar/test/rules/A7-3-1/DefinitionNotConsideredForUnqualifiedLookup.expected @@ -1 +1 @@ -| test.cpp:42:6:42:7 | declaration of f1 | Definition for 'f1' is not available for unqualified lookup because it is declared after $@ | test.cpp:39:12:39:13 | using f1 | using-declaration | +| test.cpp:46:6:46:7 | declaration of f1 | Definition for 'f1' is not available for unqualified lookup because it is declared after $@ | test.cpp:43:12:43:13 | using f1 | using-declaration |