From 98f147556a4a811c53dddb3d1f9103bc0dc89908 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 10 Jun 2026 14:27:56 +0200 Subject: [PATCH] C++: Add namequalifier test with inconsistency While where the remove the file restriction in QL. --- .../library-tests/name_qualifiers/DB-CHECK.expected | 5 +++++ .../name_qualifiers/NameQualifiers1.expected | 4 ++++ .../library-tests/name_qualifiers/NameQualifiers1.ql | 4 +--- .../library-tests/name_qualifiers/inconsistency.cpp | 4 ++-- .../library-tests/name_qualifiers/inconsistency2.cpp | 12 ++++++++++++ 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 cpp/ql/test/library-tests/name_qualifiers/DB-CHECK.expected create mode 100644 cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp diff --git a/cpp/ql/test/library-tests/name_qualifiers/DB-CHECK.expected b/cpp/ql/test/library-tests/name_qualifiers/DB-CHECK.expected new file mode 100644 index 00000000000..e27957d308d --- /dev/null +++ b/cpp/ql/test/library-tests/name_qualifiers/DB-CHECK.expected @@ -0,0 +1,5 @@ +[VALUE_NOT_IN_TYPE] predicate namequalifiers(@namequalifier id, @namequalifiableelement qualifiableelement, @namequalifyingelement qualifyingelement, @location_default location): Value 272 of field qualifyingelement is not in type @namequalifyingelement. The value is however in the following types: @type_with_specifiers. Appears in tuple (-16777185,-16777184,272,307) + Relevant element: qualifyingelement=272 + Full ID for 272: @"typeref_const(216)". The ID may expand to @"typeref_const{@"type_decl_s_nonproto[struct_complete]_{@"namespace_decl_(namespace line:1, {@"/Users/jketema/development/semmle-code/ql/cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp;sourcefile"}){@"not_inline"}"}_321bfec50edc"}" + Relevant element: location=307 + Full ID for 307: @"loc,(212),3,3,3,11". The ID may expand to @"loc,{@"/Users/jketema/development/semmle-code/ql/cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp;sourcefile"},3,3,3,11" diff --git a/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.expected b/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.expected index 72d7d615c81..d9419b833a1 100644 --- a/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.expected +++ b/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.expected @@ -1,3 +1,7 @@ +| inconsistency2.cpp:3:3:3:5 | T:: | inconsistency2.cpp:3:3:3:6 | x | inconsistency2.cpp:2:20:2:20 | T | +| inconsistency2.cpp:3:3:3:11 | (no string representation) | inconsistency2.cpp:3:3:3:6 | x | file://:0:0:0:0 | const s | +| inconsistency.cpp:7:20:7:22 | S:: | inconsistency.cpp:7:20:7:23 | (int)... | inconsistency.cpp:4:8:4:8 | S | +| inconsistency.cpp:7:20:7:22 | S:: | inconsistency.cpp:7:20:7:23 | A | inconsistency.cpp:4:8:4:8 | S | | name_qualifiers.cpp:29:7:29:8 | :: | name_qualifiers.cpp:29:7:29:9 | x | file://:0:0:0:0 | (global namespace) | | name_qualifiers.cpp:31:7:31:10 | N1:: | name_qualifiers.cpp:31:7:31:12 | nx | name_qualifiers.cpp:4:11:4:12 | N1 | | name_qualifiers.cpp:34:7:34:8 | :: | name_qualifiers.cpp:34:9:34:12 | N1:: | file://:0:0:0:0 | (global namespace) | diff --git a/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.ql b/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.ql index 77a8e195ebe..b5b40e35caa 100644 --- a/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.ql +++ b/cpp/ql/test/library-tests/name_qualifiers/NameQualifiers1.ql @@ -1,7 +1,5 @@ import cpp from NameQualifier nq, Location l -where - l = nq.getQualifiedElement().getLocation() and - l.getFile().getShortName() = "name_qualifiers" +where l = nq.getQualifiedElement().getLocation() select nq, nq.getQualifiedElement(), nq.getQualifyingElement() diff --git a/cpp/ql/test/library-tests/name_qualifiers/inconsistency.cpp b/cpp/ql/test/library-tests/name_qualifiers/inconsistency.cpp index caa5a6817c1..94c61bf8e23 100644 --- a/cpp/ql/test/library-tests/name_qualifiers/inconsistency.cpp +++ b/cpp/ql/test/library-tests/name_qualifiers/inconsistency.cpp @@ -1,8 +1,8 @@ // This file is present to test whether name-qualifying an enum constant leads to a database inconsistency. -// As such, there is no QL part of the test. + struct S { enum E { A }; }; -static int f() { +static void f() { switch(0) { case S::A: break; } } diff --git a/cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp b/cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp new file mode 100644 index 00000000000..d1fec43cb84 --- /dev/null +++ b/cpp/ql/test/library-tests/name_qualifiers/inconsistency2.cpp @@ -0,0 +1,12 @@ +namespace { +template T f() { + T::x; + return {}; +} +struct s { + static int x; +}; +struct t { + s x = f(); +}; +}