diff --git a/cpp/ql/src/semmle/code/cpp/XML.qll b/cpp/ql/src/semmle/code/cpp/XML.qll index 76e96fa1fc0a..21e48302788b 100644 --- a/cpp/ql/src/semmle/code/cpp/XML.qll +++ b/cpp/ql/src/semmle/code/cpp/XML.qll @@ -31,6 +31,12 @@ abstract class XMLLocatable extends @xmllocatable { * both of which can contain other elements. */ class XMLParent extends @xmlparent { + XMLParent() { + // explicitly restrict `this` to be either an `XMLElement` or an `XMLFile`; + // the type `@xmlparent` currently also includes non-XML files + this instanceof @xmlelement or xmlEncoding(this, _) + } + /** * Gets a printable representation of this XML parent. * (Intended to be overridden in subclasses.) diff --git a/cpp/ql/test/library-tests/files/FilePath.expected b/cpp/ql/test/library-tests/files/FilePath.expected deleted file mode 100644 index 6647c1e1fd7a..000000000000 --- a/cpp/ql/test/library-tests/files/FilePath.expected +++ /dev/null @@ -1,4 +0,0 @@ -| c.c | library-tests/files/c.c | -| files1.cpp | library-tests/files/files1.cpp | -| files1.h | library-tests/files/files1.h | -| files2.cpp | library-tests/files/files2.cpp | diff --git a/cpp/ql/test/library-tests/files/FilePath.ql b/cpp/ql/test/library-tests/files/FilePath.ql deleted file mode 100644 index 724c4b45ae79..000000000000 --- a/cpp/ql/test/library-tests/files/FilePath.ql +++ /dev/null @@ -1,5 +0,0 @@ -import cpp - -from File f -where f.toString() != "" -select f.toString(), f.getRelativePath() diff --git a/cpp/ql/test/library-tests/files/Files.expected b/cpp/ql/test/library-tests/files/Files.expected new file mode 100644 index 000000000000..68187793433b --- /dev/null +++ b/cpp/ql/test/library-tests/files/Files.expected @@ -0,0 +1,4 @@ +| c.c | library-tests/files/c.c | CFile, MetricFile | C | | | +| files1.cpp | library-tests/files/files1.cpp | CppFile, MetricFile | C++ | swap | t | +| files1.h | library-tests/files/files1.h | HeaderFile, MetricFile | | swap | | +| files2.cpp | library-tests/files/files2.cpp | CppFile, MetricFile | C++ | g | x, y | diff --git a/cpp/ql/test/library-tests/files/Files.ql b/cpp/ql/test/library-tests/files/Files.ql new file mode 100644 index 000000000000..ee489c01843c --- /dev/null +++ b/cpp/ql/test/library-tests/files/Files.ql @@ -0,0 +1,18 @@ +import cpp + +string describe(File f) { + f.compiledAsC() and + result = "C" + or + f.compiledAsCpp() and + result = "C++" + or + f instanceof XMLParent and + result = "XMLParent" // regression tests a bug in the characteristic predicate of XMLParent +} + +from File f +where f.toString() != "" +select f.toString(), f.getRelativePath(), concat(f.getAQlClass().toString(), ", "), + concat(describe(f), ", "), concat(f.getATopLevelDeclaration().toString(), ", "), + concat(LocalVariable v | f.getADeclaration() = v | v.toString(), ", ") diff --git a/cpp/ql/test/library-tests/files/Files1.expected b/cpp/ql/test/library-tests/files/Files1.expected deleted file mode 100644 index ef11fb83e9be..000000000000 --- a/cpp/ql/test/library-tests/files/Files1.expected +++ /dev/null @@ -1 +0,0 @@ -| files1.h:0:0:0:0 | files1.h | files1.cpp:4:6:4:9 | swap | diff --git a/cpp/ql/test/library-tests/files/Files1.ql b/cpp/ql/test/library-tests/files/Files1.ql deleted file mode 100644 index a4db35de1b83..000000000000 --- a/cpp/ql/test/library-tests/files/Files1.ql +++ /dev/null @@ -1,4 +0,0 @@ -import cpp - -from HeaderFile f -select f, f.getATopLevelDeclaration() diff --git a/cpp/ql/test/library-tests/files/Files2.expected b/cpp/ql/test/library-tests/files/Files2.expected deleted file mode 100644 index 7a2649c09e4a..000000000000 --- a/cpp/ql/test/library-tests/files/Files2.expected +++ /dev/null @@ -1,8 +0,0 @@ -| CFile | C | --- | c.c | -| CppFile | - | C++ | files1.cpp | -| CppFile | - | C++ | files2.cpp | -| HeaderFile | - | --- | files1.h | -| MetricFile | - | --- | files1.h | -| MetricFile | - | C++ | files1.cpp | -| MetricFile | - | C++ | files2.cpp | -| MetricFile | C | --- | c.c | diff --git a/cpp/ql/test/library-tests/files/Files2.ql b/cpp/ql/test/library-tests/files/Files2.ql deleted file mode 100644 index b87a06b97611..000000000000 --- a/cpp/ql/test/library-tests/files/Files2.ql +++ /dev/null @@ -1,11 +0,0 @@ -import cpp - -string isCompiledAsC(File f) { if f.compiledAsC() then result = "C" else result = "-" } - -string isCompiledAsCpp(File f) { if f.compiledAsCpp() then result = "C++" else result = "---" } - -from File f -// On 64bit Linux, __va_list_tag is in the unknown file (""). Ignore it. -where f.getAbsolutePath() != "" -select (f.getAQlClass().toString() + " ").prefix(10), isCompiledAsC(f), isCompiledAsCpp(f), - f.toString() diff --git a/cpp/ql/test/library-tests/files/Files3.expected b/cpp/ql/test/library-tests/files/Files3.expected deleted file mode 100644 index f17f4192871c..000000000000 --- a/cpp/ql/test/library-tests/files/Files3.expected +++ /dev/null @@ -1,3 +0,0 @@ -| files1.cpp | files1.cpp:4:6:4:9 | swap | -| files1.h | files1.cpp:4:6:4:9 | swap | -| files2.cpp | files2.cpp:3:6:3:6 | g | diff --git a/cpp/ql/test/library-tests/files/Files3.ql b/cpp/ql/test/library-tests/files/Files3.ql deleted file mode 100644 index 9d8d2ffc83c5..000000000000 --- a/cpp/ql/test/library-tests/files/Files3.ql +++ /dev/null @@ -1,7 +0,0 @@ -import cpp - -from File f, Declaration d -where - d = f.getATopLevelDeclaration() and - d.getName() != "__va_list_tag" -select f.toString(), d diff --git a/cpp/ql/test/library-tests/files/Files4.expected b/cpp/ql/test/library-tests/files/Files4.expected deleted file mode 100644 index 188b7161d991..000000000000 --- a/cpp/ql/test/library-tests/files/Files4.expected +++ /dev/null @@ -1,3 +0,0 @@ -| files1.cpp | files1.cpp:6:6:6:6 | t | -| files2.cpp | files2.cpp:4:6:4:6 | x | -| files2.cpp | files2.cpp:5:6:5:6 | y | diff --git a/cpp/ql/test/library-tests/files/Files4.ql b/cpp/ql/test/library-tests/files/Files4.ql deleted file mode 100644 index 104029795415..000000000000 --- a/cpp/ql/test/library-tests/files/Files4.ql +++ /dev/null @@ -1,5 +0,0 @@ -import cpp - -from File f, LocalVariable v -where f.getADeclaration() = v -select f.toString(), v