diff --git a/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/old.dbscheme b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/old.dbscheme new file mode 100644 index 000000000000..f0156f5f88ab --- /dev/null +++ b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/old.dbscheme @@ -0,0 +1,2339 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/semmlecode.cpp.dbscheme b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..e51fad7a2436 --- /dev/null +++ b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/semmlecode.cpp.dbscheme @@ -0,0 +1,2323 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/upgrade.properties b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/upgrade.properties new file mode 100644 index 000000000000..cf362f384dae --- /dev/null +++ b/cpp/downgrades/f0156f5f88ab5967c79162012c20f30600ca5ebf/upgrade.properties @@ -0,0 +1,3 @@ +description: Implement compilation_build_mode/2 +compatibility: full +compilation_build_mode.rel: delete diff --git a/cpp/ql/lib/semmle/code/cpp/Compilation.qll b/cpp/ql/lib/semmle/code/cpp/Compilation.qll index 1a8d90f991c1..407dc31e05f1 100644 --- a/cpp/ql/lib/semmle/code/cpp/Compilation.qll +++ b/cpp/ql/lib/semmle/code/cpp/Compilation.qll @@ -112,4 +112,7 @@ class Compilation extends @compilation { * termination, but crashing due to something like a segfault is not. */ predicate normalTermination() { compilation_finished(this, _, _) } + + /** Holds if this compilation was compiled using the "none" build mode. */ + predicate buildModeNone() { compilation_build_mode(this, 0) } } diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index e51fad7a2436..f0156f5f88ab 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -46,6 +46,22 @@ compilation_args( string arg : string ref ); +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + /** * The source files that are compiled by a compiler invocation. * If `id` is for the compiler invocation diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index 7f0d99272e7e..758aba346080 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -18,7 +18,7 @@ @location_default - 29764890 + 29746763 @location_stmt @@ -34,11 +34,11 @@ @file - 123251 + 123176 @folder - 16340 + 16330 @macro_expansion @@ -46,23 +46,23 @@ @other_macro_reference - 859029 + 858505 @function - 4179363 + 4176817 @fun_decl - 4543516 + 4541216 @var_decl - 8039391 + 8034962 @type_decl - 3283451 + 3281452 @namespace_decl @@ -70,11 +70,11 @@ @using_declaration - 363219 + 362998 @using_directive - 6536 + 6532 @using_enum_declaration @@ -86,7 +86,7 @@ @parameter - 6190611 + 6186841 @membervariable @@ -98,7 +98,7 @@ @localvariable - 576945 + 576952 @enumconstant @@ -330,15 +330,15 @@ @pointer - 568173 + 567827 @type_with_specifiers - 852026 + 851507 @array - 110179 + 110112 @routineptr @@ -346,7 +346,7 @@ @reference - 1276405 + 1275627 @gnu_vector @@ -358,7 +358,7 @@ @rvalue_reference - 333340 + 333137 @block @@ -366,15 +366,15 @@ @decltype - 27078 + 27061 @usertype - 5234008 + 5230820 @mangledname - 6061757 + 6058065 @type_mention @@ -386,15 +386,15 @@ @ptrtomember - 37815 + 37792 @specifier - 24743 + 24728 @gnuattribute - 553700 + 553363 @stdattribute @@ -410,15 +410,15 @@ @alignas - 4668 + 4665 @attribute_arg_token - 25210 + 25195 @attribute_arg_constant_expr - 318400 + 318207 @attribute_arg_empty @@ -450,7 +450,7 @@ @namespace - 12138 + 12131 @specialnamequalifyingelement @@ -482,7 +482,7 @@ @parexpr - 3587463 + 3587464 @arithnegexpr @@ -582,11 +582,11 @@ @gtexpr - 104110 + 104047 @ltexpr - 101776 + 101714 @geexpr @@ -634,7 +634,7 @@ @assignorexpr - 23627 + 23628 @assignxorexpr @@ -662,11 +662,11 @@ @subscriptexpr - 364477 + 364481 @callexpr - 316533 + 316340 @vastartexpr @@ -678,7 +678,7 @@ @vaendexpr - 2801 + 2799 @vacopyexpr @@ -830,7 +830,7 @@ @sizeof_pack - 5602 + 5598 @hasassignexpr @@ -978,7 +978,7 @@ @lambdaexpr - 21475 + 21462 @param_ref @@ -1022,7 +1022,7 @@ @istriviallycopyableexpr - 3734 + 3732 @isliteraltypeexpr @@ -1374,7 +1374,7 @@ @lambdacapture - 28011 + 27994 @stmt_expr @@ -1398,11 +1398,11 @@ @stmt_return - 1280140 + 1279827 @stmt_block - 1419265 + 1418867 @stmt_end_test_while @@ -1430,7 +1430,7 @@ @stmt_empty - 192682 + 192685 @stmt_continue @@ -1462,7 +1462,7 @@ @stmt_range_based_for - 8403 + 8398 @stmt_handler @@ -1478,31 +1478,31 @@ @ppd_if - 667148 + 666741 @ppd_ifdef - 263311 + 263150 @ppd_ifndef - 266579 + 266416 @ppd_elif - 25210 + 25195 @ppd_else - 209154 + 209027 @ppd_endif - 1197038 + 1196309 @ppd_plain_include - 311398 + 311208 @ppd_define @@ -1510,15 +1510,15 @@ @ppd_undef - 258642 + 258484 @ppd_include_next - 1867 + 1866 @ppd_line - 27520 + 27521 @ppd_error @@ -1900,6 +1900,54 @@ + + compilation_build_mode + 9742 + + + id + 9742 + + + mode + 11 + + + + + id + mode + + + 12 + + + 1 + 2 + 9742 + + + + + + + mode + id + + + 12 + + + 863 + 864 + 11 + + + + + + + compilation_compiling_files 11546 @@ -2164,7 +2212,7 @@ seconds - 8429 + 8030 @@ -2245,47 +2293,52 @@ 3 4 - 639 + 799 4 5 - 359 + 199 - 6 + 5 7 119 8 - 10 - 159 + 9 + 79 - 10 - 11 + 9 + 10 119 - 11 - 15 + 10 + 12 159 - 16 - 19 + 12 + 16 + 119 + + + 17 + 20 159 - 19 - 24 + 21 + 42 159 - 40 - 89 - 119 + 55 + 90 + 79 @@ -2368,7 +2421,7 @@ 6 7 - 439 + 399 7 @@ -2377,18 +2430,18 @@ 8 - 10 - 279 + 9 + 239 - 10 - 26 + 9 + 24 279 - 28 - 81 - 199 + 25 + 85 + 279 @@ -2439,8 +2492,8 @@ 79 - 125 - 126 + 124 + 125 39 @@ -2462,27 +2515,37 @@ 1 2 - 3635 + 3755 2 3 - 1917 + 1398 3 4 - 1558 + 998 4 + 5 + 759 + + + 5 6 - 719 + 439 6 - 48 - 599 + 25 + 639 + + + 46 + 47 + 39 @@ -2498,27 +2561,27 @@ 1 2 - 3595 + 3515 2 3 - 1438 + 1278 3 4 - 1358 + 599 4 5 - 639 + 878 5 6 - 479 + 759 6 @@ -2527,8 +2590,8 @@ 8 - 73 - 239 + 76 + 319 @@ -2544,12 +2607,12 @@ 1 2 - 6512 + 5753 2 3 - 1917 + 2277 @@ -2893,7 +2956,7 @@ cpu_seconds - 7507 + 7292 elapsed_seconds @@ -2943,17 +3006,17 @@ 1 2 - 6242 + 5937 2 3 - 835 + 846 3 - 15 - 428 + 16 + 507 @@ -2969,12 +3032,12 @@ 1 2 - 6976 + 6682 2 3 - 530 + 609 @@ -3003,48 +3066,48 @@ 11 - 6 - 7 + 7 + 8 11 - 9 - 10 + 8 + 9 11 - 11 - 12 + 12 + 13 11 - 16 - 17 + 13 + 14 11 - 49 - 50 + 51 + 52 11 - 154 - 155 + 163 + 164 11 - 160 - 161 + 167 + 168 11 - 204 - 205 + 187 + 188 11 - 248 - 249 + 249 + 250 11 @@ -3074,48 +3137,48 @@ 11 - 6 - 7 + 7 + 8 11 - 9 - 10 + 8 + 9 11 - 11 - 12 + 12 + 13 11 - 16 - 17 + 13 + 14 11 - 47 - 48 + 49 + 50 11 - 118 - 119 + 120 + 121 11 - 128 - 129 + 123 + 124 11 - 149 - 150 + 138 + 139 11 - 222 - 223 + 224 + 225 11 @@ -4888,31 +4951,31 @@ locations_default - 29764890 + 29746763 id - 29764890 + 29746763 container - 123251 + 123176 startLine - 2095283 + 2094007 startColumn - 36882 + 36859 endLine - 2099485 + 2098207 endColumn - 48086 + 48057 @@ -4926,7 +4989,7 @@ 1 2 - 29764890 + 29746763 @@ -4942,7 +5005,7 @@ 1 2 - 29764890 + 29746763 @@ -4958,7 +5021,7 @@ 1 2 - 29764890 + 29746763 @@ -4974,7 +5037,7 @@ 1 2 - 29764890 + 29746763 @@ -4990,7 +5053,7 @@ 1 2 - 29764890 + 29746763 @@ -5006,67 +5069,67 @@ 1 11 - 9804 + 9798 11 18 - 10270 + 10264 18 30 - 9337 + 9331 30 42 - 9804 + 9798 43 61 - 9804 + 9798 61 79 - 9337 + 9331 80 106 - 9804 + 9798 108 149 - 9337 + 9331 149 199 - 9337 + 9331 206 291 - 9337 + 9331 304 469 - 9337 + 9331 482 850 - 9337 + 9331 936 2380 - 8403 + 8398 @@ -5082,67 +5145,67 @@ 1 8 - 9337 + 9331 8 13 - 9337 + 9331 13 20 - 9804 + 9798 20 32 - 9337 + 9331 32 43 - 9804 + 9798 44 61 - 9337 + 9331 62 72 - 9337 + 9331 73 93 - 9337 + 9331 97 128 - 9337 + 9331 128 180 - 9337 + 9331 180 267 - 9337 + 9331 277 414 - 9337 + 9331 439 1465 - 9337 + 9331 1557 @@ -5163,67 +5226,67 @@ 1 4 - 8870 + 8865 4 5 - 7936 + 7931 5 6 - 7469 + 7465 6 8 - 11204 + 11197 8 10 - 9337 + 9331 10 15 - 10737 + 10731 15 23 - 9804 + 9798 23 28 - 11204 + 11197 28 34 - 9804 + 9798 34 44 - 9337 + 9331 44 55 - 9337 + 9331 55 66 - 9804 + 9798 66 77 - 8403 + 8398 @@ -5239,67 +5302,67 @@ 1 8 - 9337 + 9331 8 13 - 9337 + 9331 13 20 - 9804 + 9798 20 32 - 9337 + 9331 32 43 - 9804 + 9798 43 60 - 9337 + 9331 61 71 - 9337 + 9331 72 93 - 9337 + 9331 94 127 - 9337 + 9331 128 179 - 9337 + 9331 180 268 - 9337 + 9331 278 413 - 9337 + 9331 437 1465 - 9337 + 9331 1554 @@ -5320,67 +5383,67 @@ 1 9 - 9804 + 9798 9 13 - 9337 + 9331 13 18 - 9337 + 9331 18 26 - 10270 + 10264 27 33 - 9337 + 9331 33 39 - 9337 + 9331 39 47 - 10270 + 10264 47 53 - 9337 + 9331 53 60 - 10270 + 10264 60 66 - 9337 + 9331 66 74 - 9804 + 9798 74 78 - 9804 + 9798 78 90 - 7002 + 6998 @@ -5396,52 +5459,52 @@ 1 2 - 583112 + 582757 2 3 - 314199 + 314007 3 4 - 195615 + 195496 4 6 - 162001 + 161903 6 10 - 183010 + 182899 10 16 - 162935 + 162836 16 25 - 169004 + 168901 25 46 - 161067 + 160969 46 169 - 157333 + 157237 169 265 - 7002 + 6998 @@ -5457,42 +5520,42 @@ 1 2 - 871167 + 870636 2 3 - 273582 + 273415 3 5 - 193748 + 193630 5 8 - 173673 + 173567 8 13 - 188146 + 188031 13 20 - 161067 + 160969 20 51 - 159667 + 159570 51 265 - 74231 + 74186 @@ -5508,47 +5571,47 @@ 1 2 - 612058 + 611685 2 3 - 313265 + 313074 3 4 - 198417 + 198296 4 6 - 183010 + 182899 6 9 - 173206 + 173100 9 13 - 163402 + 163302 13 19 - 174606 + 174500 19 29 - 164802 + 164702 29 52 - 112514 + 112445 @@ -5564,22 +5627,22 @@ 1 2 - 1531779 + 1530846 2 3 - 348747 + 348534 3 5 - 162001 + 161903 5 16 - 52755 + 52723 @@ -5595,47 +5658,47 @@ 1 2 - 587781 + 587423 2 3 - 316066 + 315874 3 4 - 197483 + 197363 4 6 - 168537 + 168435 6 9 - 158266 + 158170 9 14 - 170872 + 170768 14 21 - 175073 + 174967 21 32 - 162468 + 162369 32 63 - 157799 + 157703 64 @@ -5656,67 +5719,67 @@ 1 31 - 2801 + 2799 42 85 - 2801 + 2799 86 128 - 2801 + 2799 129 229 - 2801 + 2799 247 286 - 2801 + 2799 291 360 - 2801 + 2799 373 457 - 2801 + 2799 473 565 - 2801 + 2799 566 619 - 2801 + 2799 619 689 - 2801 + 2799 696 807 - 2801 + 2799 819 1563 - 2801 + 2799 1634 5631 - 2801 + 2799 15295 @@ -5737,67 +5800,67 @@ 1 18 - 2801 + 2799 23 35 - 3268 + 3266 38 43 - 2801 + 2799 44 61 - 2801 + 2799 65 73 - 2801 + 2799 73 84 - 3268 + 3266 84 96 - 2801 + 2799 96 101 - 3268 + 3266 101 105 - 3268 + 3266 107 112 - 2801 + 2799 112 126 - 2801 + 2799 137 170 - 2801 + 2799 195 265 - 1400 + 1399 @@ -5813,67 +5876,67 @@ 1 19 - 2801 + 2799 30 72 - 2801 + 2799 83 122 - 2801 + 2799 122 205 - 2801 + 2799 214 261 - 2801 + 2799 265 322 - 2801 + 2799 322 379 - 2801 + 2799 404 430 - 2801 + 2799 453 474 - 2801 + 2799 478 505 - 2801 + 2799 511 583 - 2801 + 2799 585 836 - 2801 + 2799 1104 2196 - 2801 + 2799 2387 @@ -5894,67 +5957,67 @@ 1 19 - 2801 + 2799 30 72 - 2801 + 2799 83 122 - 2801 + 2799 122 205 - 2801 + 2799 214 261 - 2801 + 2799 265 322 - 2801 + 2799 322 380 - 2801 + 2799 404 430 - 2801 + 2799 453 474 - 2801 + 2799 477 504 - 2801 + 2799 514 582 - 2801 + 2799 585 835 - 2801 + 2799 1109 2203 - 2801 + 2799 2382 @@ -5975,67 +6038,67 @@ 1 7 - 2801 + 2799 7 11 - 3268 + 3266 11 16 - 3268 + 3266 16 22 - 2801 + 2799 22 24 - 3268 + 3266 24 28 - 2801 + 2799 29 34 - 3268 + 3266 34 41 - 3268 + 3266 41 46 - 2801 + 2799 47 49 - 1867 + 1866 49 54 - 2801 + 2799 54 74 - 2801 + 2799 75 86 - 1867 + 1866 @@ -6051,52 +6114,52 @@ 1 2 - 593383 + 593022 2 3 - 306262 + 306076 3 4 - 198417 + 198296 4 6 - 159667 + 159570 6 10 - 182543 + 182432 10 16 - 162001 + 161903 16 25 - 171338 + 171234 25 46 - 158733 + 158636 46 161 - 158266 + 158170 162 265 - 8870 + 8865 @@ -6112,47 +6175,47 @@ 1 2 - 886574 + 886034 2 3 - 260043 + 259884 3 4 - 125119 + 125043 4 6 - 140992 + 140906 6 10 - 184877 + 184765 10 15 - 168537 + 168435 15 26 - 163402 + 163302 26 120 - 158266 + 158170 121 265 - 11671 + 11664 @@ -6168,22 +6231,22 @@ 1 2 - 1529445 + 1528513 2 3 - 341744 + 341536 3 5 - 170872 + 170768 5 10 - 57424 + 57389 @@ -6199,47 +6262,47 @@ 1 2 - 623262 + 622883 2 3 - 303461 + 303276 3 4 - 201685 + 201562 4 6 - 183944 + 183832 6 9 - 169938 + 169834 9 13 - 166670 + 166568 13 19 - 175073 + 174967 19 29 - 161067 + 160969 29 52 - 114381 + 114311 @@ -6255,52 +6318,52 @@ 1 2 - 599919 + 599554 2 3 - 306262 + 306076 3 4 - 197016 + 196896 4 6 - 169004 + 168901 6 9 - 156399 + 156304 9 14 - 169004 + 168901 14 21 - 177875 + 177766 21 32 - 162001 + 161903 32 60 - 158266 + 158170 60 65 - 3734 + 3732 @@ -6316,67 +6379,67 @@ 1 2 - 5135 + 5132 2 8 - 3734 + 3732 9 186 - 3734 + 3732 193 288 - 3734 + 3732 294 495 - 3734 + 3732 503 555 - 3734 + 3732 561 633 - 3734 + 3732 640 758 - 3734 + 3732 758 869 - 3734 + 3732 875 1074 - 3734 + 3732 1074 1281 - 3734 + 3732 1289 1590 - 3734 + 3732 1685 2418 - 1867 + 1866 @@ -6392,62 +6455,62 @@ 1 2 - 5602 + 5598 2 5 - 3734 + 3732 5 65 - 3734 + 3732 70 100 - 3734 + 3732 100 111 - 3734 + 3732 112 122 - 4201 + 4199 122 140 - 3734 + 3732 143 153 - 3734 + 3732 153 161 - 4201 + 4199 161 173 - 4201 + 4199 173 178 - 3734 + 3732 188 265 - 3734 + 3732 @@ -6463,62 +6526,62 @@ 1 2 - 5602 + 5598 2 8 - 3734 + 3732 9 105 - 3734 + 3732 155 241 - 3734 + 3732 253 336 - 3734 + 3732 340 426 - 3734 + 3732 434 488 - 3734 + 3732 489 572 - 3734 + 3732 573 623 - 3734 + 3732 626 696 - 4201 + 4199 701 813 - 3734 + 3732 818 1095 - 3734 + 3732 1172 @@ -6539,67 +6602,67 @@ 1 2 - 6069 + 6065 2 4 - 3734 + 3732 4 8 - 4201 + 4199 8 15 - 3734 + 3732 15 23 - 3734 + 3732 23 29 - 3734 + 3732 29 35 - 4201 + 4199 35 39 - 3268 + 3266 39 42 - 3268 + 3266 42 44 - 3268 + 3266 44 46 - 3734 + 3732 46 49 - 3734 + 3732 49 53 - 1400 + 1399 @@ -6615,67 +6678,67 @@ 1 2 - 5602 + 5598 2 8 - 3734 + 3732 9 156 - 3734 + 3732 159 240 - 3734 + 3732 251 335 - 3734 + 3732 342 430 - 3734 + 3732 432 490 - 3734 + 3732 490 573 - 3734 + 3732 574 622 - 3734 + 3732 626 698 - 3734 + 3732 700 798 - 3734 + 3732 811 987 - 3734 + 3732 1096 1180 - 1400 + 1399 @@ -10599,23 +10662,23 @@ numlines - 1383783 + 1382941 element_id - 1376780 + 1375942 num_lines - 101776 + 101714 num_code - 84969 + 84917 num_comment - 59758 + 59722 @@ -10629,12 +10692,12 @@ 1 2 - 1369777 + 1368943 2 3 - 7002 + 6998 @@ -10650,12 +10713,12 @@ 1 2 - 1370711 + 1369876 2 3 - 6069 + 6065 @@ -10671,7 +10734,7 @@ 1 2 - 1376780 + 1375942 @@ -10687,27 +10750,27 @@ 1 2 - 68162 + 68120 2 3 - 12138 + 12131 3 4 - 7469 + 7465 4 21 - 7936 + 7931 29 921 - 6069 + 6065 @@ -10723,27 +10786,27 @@ 1 2 - 70496 + 70453 2 3 - 12138 + 12131 3 4 - 8403 + 8398 4 6 - 9337 + 9331 6 7 - 1400 + 1399 @@ -10759,22 +10822,22 @@ 1 2 - 69562 + 69520 2 3 - 14939 + 14930 3 4 - 10737 + 10731 4 7 - 6536 + 6532 @@ -10790,27 +10853,27 @@ 1 2 - 52755 + 52723 2 3 - 14472 + 14463 3 5 - 6536 + 6532 5 42 - 6536 + 6532 44 922 - 4668 + 4665 @@ -10826,27 +10889,27 @@ 1 2 - 52755 + 52723 2 3 - 16807 + 16796 3 5 - 6069 + 6065 5 8 - 6536 + 6532 8 12 - 2801 + 2799 @@ -10862,27 +10925,27 @@ 1 2 - 53222 + 53190 2 3 - 15873 + 15863 3 5 - 7469 + 7465 5 7 - 5135 + 5132 7 10 - 3268 + 3266 @@ -10898,32 +10961,32 @@ 1 2 - 34547 + 34526 2 3 - 9337 + 9331 3 4 - 4201 + 4199 4 6 - 4668 + 4665 6 11 - 5135 + 5132 17 2596 - 1867 + 1866 @@ -10939,32 +11002,32 @@ 1 2 - 34547 + 34526 2 3 - 9337 + 9331 3 4 - 4201 + 4199 4 6 - 4668 + 4665 6 8 - 4668 + 4665 10 38 - 2334 + 2332 @@ -10980,32 +11043,32 @@ 1 2 - 34547 + 34526 2 3 - 9337 + 9331 3 4 - 4201 + 4199 4 6 - 4668 + 4665 6 10 - 4668 + 4665 10 37 - 2334 + 2332 @@ -11647,15 +11710,15 @@ files - 123251 + 123176 id - 123251 + 123176 name - 123251 + 123176 @@ -11669,7 +11732,7 @@ 1 2 - 123251 + 123176 @@ -11685,7 +11748,7 @@ 1 2 - 123251 + 123176 @@ -11695,15 +11758,15 @@ folders - 16340 + 16330 id - 16340 + 16330 name - 16340 + 16330 @@ -11717,7 +11780,7 @@ 1 2 - 16340 + 16330 @@ -11733,7 +11796,7 @@ 1 2 - 16340 + 16330 @@ -11743,15 +11806,15 @@ containerparent - 138658 + 138574 parent - 16340 + 16330 child - 138658 + 138574 @@ -11765,32 +11828,32 @@ 1 2 - 7469 + 7465 2 3 - 3268 + 3266 3 4 - 1400 + 1399 4 12 - 1400 + 1399 23 28 - 1400 + 1399 40 67 - 1400 + 1399 @@ -11806,7 +11869,7 @@ 1 2 - 138658 + 138574 @@ -12392,15 +12455,15 @@ inmacroexpansion - 109779080 + 109779103 id - 18027694 + 18027697 inv - 2700160 + 2700159 @@ -12414,12 +12477,12 @@ 1 3 - 1582361 + 1582360 3 5 - 1077793 + 1077794 5 @@ -12429,17 +12492,17 @@ 6 7 - 4819903 + 4819904 7 8 - 6385932 + 6385934 8 9 - 2605242 + 2605243 9 @@ -12460,12 +12523,12 @@ 1 2 - 378424 + 378422 2 3 - 544104 + 544105 3 @@ -12500,7 +12563,7 @@ 11 337 - 224847 + 224845 339 @@ -12520,15 +12583,15 @@ affectedbymacroexpansion - 35689251 + 35689257 id - 5156949 + 5156948 inv - 2784762 + 2784761 @@ -12542,7 +12605,7 @@ 1 2 - 2816079 + 2816078 2 @@ -12588,7 +12651,7 @@ 1 4 - 229116 + 229115 4 @@ -12603,12 +12666,12 @@ 9 12 - 251119 + 251120 12 13 - 333984 + 333985 13 @@ -12628,7 +12691,7 @@ 16 17 - 276608 + 276609 17 @@ -13607,19 +13670,19 @@ functions - 4179363 + 4176817 id - 4179363 + 4176817 name - 1895466 + 1894311 kind - 3268 + 3266 @@ -13633,7 +13696,7 @@ 1 2 - 4179363 + 4176817 @@ -13649,7 +13712,7 @@ 1 2 - 4179363 + 4176817 @@ -13665,22 +13728,22 @@ 1 2 - 1498165 + 1497253 2 3 - 153131 + 153038 3 5 - 142860 + 142773 5 952 - 101309 + 101247 @@ -13696,7 +13759,7 @@ 1 2 - 1894999 + 1893845 2 @@ -13798,15 +13861,15 @@ function_entry_point - 1151752 + 1151517 id - 1141948 + 1141719 entry_point - 1151752 + 1151517 @@ -13820,12 +13883,12 @@ 1 2 - 1132144 + 1131921 2 3 - 9804 + 9798 @@ -13841,7 +13904,7 @@ 1 2 - 1151752 + 1151517 @@ -13851,15 +13914,15 @@ function_return_type - 4184498 + 4181950 id - 4179363 + 4176817 return_type - 817945 + 817446 @@ -13873,12 +13936,12 @@ 1 2 - 4174227 + 4171685 2 3 - 5135 + 5132 @@ -13894,22 +13957,22 @@ 1 2 - 506080 + 505771 2 3 - 211489 + 211360 3 7 - 66294 + 66254 7 2231 - 34081 + 34060 @@ -14200,33 +14263,33 @@ function_deleted - 96173 + 96115 id - 96173 + 96115 function_defaulted - 73764 + 73719 id - 73764 + 73719 function_prototyped - 4087391 + 4084901 id - 4087391 + 4084901 @@ -14379,27 +14442,27 @@ fun_decls - 4548652 + 4546348 id - 4543516 + 4541216 function - 4035569 + 4033111 type_id - 816544 + 816047 name - 1797891 + 1796796 location - 3370755 + 3368702 @@ -14413,7 +14476,7 @@ 1 2 - 4543516 + 4541216 @@ -14429,12 +14492,12 @@ 1 2 - 4538381 + 4536084 2 3 - 5135 + 5132 @@ -14450,7 +14513,7 @@ 1 2 - 4543516 + 4541216 @@ -14466,7 +14529,7 @@ 1 2 - 4543516 + 4541216 @@ -14482,17 +14545,17 @@ 1 2 - 3606521 + 3603858 2 3 - 356216 + 356466 3 7 - 72830 + 72786 @@ -14508,12 +14571,12 @@ 1 2 - 3995885 + 3993452 2 3 - 39683 + 39659 @@ -14529,7 +14592,7 @@ 1 2 - 4035569 + 4033111 @@ -14545,17 +14608,17 @@ 1 2 - 3663012 + 3660781 2 3 - 311864 + 311674 3 6 - 60692 + 60655 @@ -14571,22 +14634,22 @@ 1 2 - 431381 + 431119 2 3 - 274048 + 273882 3 6 - 63493 + 63454 6 - 2476 - 47620 + 2477 + 47591 @@ -14602,22 +14665,22 @@ 1 2 - 515417 + 515103 2 3 - 203085 + 202961 3 7 - 63026 + 62988 7 2192 - 35014 + 34993 @@ -14633,17 +14696,17 @@ 1 2 - 690024 + 689604 2 4 - 67228 + 67187 4 773 - 59291 + 59255 @@ -14659,22 +14722,22 @@ 1 2 - 595251 + 594888 2 3 - 121384 + 121310 3 7 - 63493 + 63454 7 1959 - 36415 + 36393 @@ -14690,27 +14753,27 @@ 1 2 - 1228318 + 1227570 2 3 - 267045 + 266883 3 4 - 77966 + 77918 4 7 - 146128 + 146039 7 986 - 78433 + 78385 @@ -14726,22 +14789,22 @@ 1 2 - 1407593 + 1406736 2 3 - 152197 + 152104 3 5 - 136791 + 136707 5 936 - 101309 + 101247 @@ -14757,17 +14820,17 @@ 1 2 - 1579399 + 1578437 2 4 - 134923 + 134841 4 562 - 83568 + 83517 @@ -14783,27 +14846,27 @@ 1 2 - 1236254 + 1235502 2 3 - 293190 + 293011 3 4 - 78899 + 78851 4 8 - 137257 + 137174 8 542 - 52288 + 52256 @@ -14819,17 +14882,17 @@ 1 2 - 2966451 + 2964644 2 4 - 277783 + 277614 4 55 - 126520 + 126442 @@ -14845,17 +14908,17 @@ 1 2 - 3033679 + 3031832 2 7 - 244169 + 244020 7 55 - 92905 + 92849 @@ -14871,12 +14934,12 @@ 1 2 - 3207353 + 3205399 2 18 - 163402 + 163302 @@ -14892,12 +14955,12 @@ 1 2 - 3232563 + 3230595 2 13 - 138191 + 138107 @@ -14907,22 +14970,22 @@ fun_def - 1888930 + 1888246 id - 1888930 + 1888246 fun_specialized - 26144 + 26128 id - 26144 + 26128 @@ -14940,15 +15003,15 @@ fun_decl_specifiers - 2906692 + 2904922 id - 1689579 + 1688550 name - 2801 + 2799 @@ -14962,17 +15025,17 @@ 1 2 - 491140 + 490841 2 3 - 1179764 + 1179045 3 4 - 18674 + 18663 @@ -15144,11 +15207,11 @@ fun_decl_empty_throws - 1472021 + 1471124 fun_decl - 1472021 + 1471124 @@ -15208,11 +15271,11 @@ fun_decl_empty_noexcept - 863230 + 863171 fun_decl - 863230 + 863171 @@ -15317,19 +15380,19 @@ param_decl_bind - 6995017 + 6991224 id - 6995017 + 6991224 index - 7936 + 7931 fun_decl - 3835284 + 3833415 @@ -15343,7 +15406,7 @@ 1 2 - 6995017 + 6991224 @@ -15359,7 +15422,7 @@ 1 2 - 6995017 + 6991224 @@ -15438,8 +15501,8 @@ 466 - 8215 - 8216 + 8216 + 8217 466 @@ -15519,8 +15582,8 @@ 466 - 8215 - 8216 + 8216 + 8217 466 @@ -15537,27 +15600,27 @@ 1 2 - 1973899 + 1973163 2 3 - 1061647 + 1061001 3 4 - 502812 + 502505 4 8 - 290856 + 290678 8 18 - 6069 + 6065 @@ -15573,27 +15636,27 @@ 1 2 - 1973899 + 1973163 2 3 - 1061647 + 1061001 3 4 - 502812 + 502505 4 8 - 290856 + 290678 8 18 - 6069 + 6065 @@ -15603,27 +15666,27 @@ var_decls - 8110354 + 8105882 id - 8039391 + 8034962 variable - 7027231 + 7022951 type_id - 2043462 + 2042217 name - 667614 + 667208 location - 5311974 + 5308739 @@ -15637,7 +15700,7 @@ 1 2 - 8039391 + 8034962 @@ -15653,12 +15716,12 @@ 1 2 - 7971229 + 7966841 2 3 - 68162 + 68120 @@ -15674,7 +15737,7 @@ 1 2 - 8039391 + 8034962 @@ -15690,12 +15753,12 @@ 1 2 - 8036590 + 8032162 2 3 - 2801 + 2799 @@ -15711,17 +15774,17 @@ 1 2 - 6175205 + 6170977 2 3 - 698427 + 698469 3 7 - 153598 + 153504 @@ -15737,12 +15800,12 @@ 1 2 - 6855892 + 6851717 2 4 - 171338 + 171234 @@ -15758,12 +15821,12 @@ 1 2 - 6911916 + 6907706 2 3 - 115315 + 115245 @@ -15779,17 +15842,17 @@ 1 2 - 6481934 + 6477987 2 3 - 542962 + 542631 3 4 - 2334 + 2332 @@ -15805,27 +15868,27 @@ 1 2 - 1165758 + 1165048 2 3 - 477134 + 476377 3 4 - 94773 + 95182 4 7 - 184877 + 184765 7 762 - 120917 + 120844 @@ -15841,22 +15904,22 @@ 1 2 - 1299281 + 1298490 2 3 - 452390 + 452115 3 6 - 155932 + 155837 6 724 - 135857 + 135774 @@ -15872,17 +15935,17 @@ 1 2 - 1539249 + 1538311 2 3 - 383295 + 383061 3 128 - 120917 + 120844 @@ -15898,22 +15961,22 @@ 1 2 - 1365576 + 1364744 2 3 - 404303 + 404057 3 7 - 173206 + 173100 7 592 - 100375 + 100314 @@ -15929,37 +15992,37 @@ 1 2 - 341277 + 341069 2 3 - 86836 + 86783 3 4 - 48553 + 48524 4 6 - 51821 + 51790 6 12 - 52288 + 52256 12 33 - 50421 + 50390 34 - 2384 - 36415 + 2385 + 36393 @@ -15975,37 +16038,37 @@ 1 2 - 368822 + 368597 2 3 - 77966 + 77918 3 4 - 45285 + 45258 4 6 - 49487 + 49457 6 14 - 53222 + 53190 14 56 - 50888 + 50857 56 2301 - 21942 + 21929 @@ -16021,27 +16084,27 @@ 1 2 - 457059 + 456781 2 3 - 93839 + 93782 3 5 - 46686 + 46657 5 19 - 50888 + 50857 19 1182 - 19141 + 19129 @@ -16057,32 +16120,32 @@ 1 2 - 379093 + 378862 2 3 - 90571 + 90516 3 5 - 59758 + 59722 5 9 - 51354 + 51323 9 21 - 50421 + 50390 21 1010 - 36415 + 36393 @@ -16098,17 +16161,17 @@ 1 2 - 4496363 + 4493625 2 3 - 531757 + 531433 3 - 896 - 283853 + 897 + 283680 @@ -16124,17 +16187,17 @@ 1 2 - 4885727 + 4882752 2 17 - 415508 + 415255 17 892 - 10737 + 10731 @@ -16150,12 +16213,12 @@ 1 2 - 4961826 + 4958804 2 759 - 350147 + 349934 @@ -16171,12 +16234,12 @@ 1 2 - 5302637 + 5299407 2 6 - 9337 + 9331 @@ -16186,26 +16249,26 @@ var_def - 3994952 + 3992985 id - 3994952 + 3992985 var_decl_specifiers - 378626 + 378395 id - 378626 + 378395 name - 1867 + 1866 @@ -16219,7 +16282,7 @@ 1 2 - 378626 + 378395 @@ -16271,19 +16334,19 @@ type_decls - 3283451 + 3281452 id - 3283451 + 3281452 type_id - 3233030 + 3231061 location - 3166269 + 3164340 @@ -16297,7 +16360,7 @@ 1 2 - 3283451 + 3281452 @@ -16313,7 +16376,7 @@ 1 2 - 3283451 + 3281452 @@ -16329,12 +16392,12 @@ 1 2 - 3191479 + 3189536 2 5 - 41550 + 41525 @@ -16350,12 +16413,12 @@ 1 2 - 3191479 + 3189536 2 5 - 41550 + 41525 @@ -16371,12 +16434,12 @@ 1 2 - 3113980 + 3112083 2 20 - 52288 + 52256 @@ -16392,12 +16455,12 @@ 1 2 - 3113980 + 3112083 2 20 - 52288 + 52256 @@ -16407,22 +16470,22 @@ type_def - 2641981 + 2640372 id - 2641981 + 2640372 type_decl_top - 743713 + 743260 type_decl - 743713 + 743260 @@ -16795,19 +16858,19 @@ usings - 369755 + 369530 id - 369755 + 369530 element_id - 315599 + 315407 location - 247904 + 247753 kind @@ -16825,7 +16888,7 @@ 1 2 - 369755 + 369530 @@ -16841,7 +16904,7 @@ 1 2 - 369755 + 369530 @@ -16857,7 +16920,7 @@ 1 2 - 369755 + 369530 @@ -16873,17 +16936,17 @@ 1 2 - 263311 + 263150 2 3 - 50888 + 50857 3 5 - 1400 + 1399 @@ -16899,17 +16962,17 @@ 1 2 - 263311 + 263150 2 3 - 50888 + 50857 3 5 - 1400 + 1399 @@ -16925,7 +16988,7 @@ 1 2 - 315599 + 315407 @@ -16941,22 +17004,22 @@ 1 2 - 202618 + 202495 2 4 - 10737 + 10731 4 5 - 31279 + 31260 5 11 - 3268 + 3266 @@ -16972,22 +17035,22 @@ 1 2 - 202618 + 202495 2 4 - 10737 + 10731 4 5 - 31279 + 31260 5 11 - 3268 + 3266 @@ -17003,7 +17066,7 @@ 1 2 - 247904 + 247753 @@ -17787,23 +17850,23 @@ params - 6354480 + 6350610 id - 6190611 + 6186841 function - 3491673 + 3489546 index - 7936 + 7931 type_id - 1846445 + 1845321 @@ -17817,7 +17880,7 @@ 1 2 - 6190611 + 6186841 @@ -17833,7 +17896,7 @@ 1 2 - 6190611 + 6186841 @@ -17849,12 +17912,12 @@ 1 2 - 6066892 + 6063198 2 4 - 123718 + 123643 @@ -17870,22 +17933,22 @@ 1 2 - 1867454 + 1866317 2 3 - 952868 + 952288 3 4 - 429981 + 429719 4 18 - 241368 + 241221 @@ -17901,22 +17964,22 @@ 1 2 - 1867454 + 1866317 2 3 - 952868 + 952288 3 4 - 429981 + 429719 4 18 - 241368 + 241221 @@ -17932,22 +17995,22 @@ 1 2 - 2165780 + 2164461 2 3 - 826815 + 826311 3 4 - 346412 + 346201 4 12 - 152664 + 152571 @@ -18145,7 +18208,7 @@ 6 7 - 1400 + 1399 7 @@ -18201,22 +18264,22 @@ 1 2 - 1183966 + 1183245 2 3 - 406171 + 405923 3 7 - 154064 + 153971 7 518 - 102243 + 102180 @@ -18232,22 +18295,22 @@ 1 2 - 1404792 + 1403937 2 3 - 212422 + 212293 3 7 - 147528 + 147439 7 502 - 81701 + 81651 @@ -18263,17 +18326,17 @@ 1 2 - 1420199 + 1419334 2 3 - 347346 + 347135 3 13 - 78899 + 78851 @@ -18283,11 +18346,11 @@ overrides - 125725 + 125735 new - 122752 + 122762 old @@ -18305,7 +18368,7 @@ 1 2 - 119788 + 119797 2 @@ -18713,11 +18776,11 @@ localvariables - 576945 + 576952 id - 576945 + 576952 type_id @@ -18725,7 +18788,7 @@ name - 90547 + 90549 @@ -18739,7 +18802,7 @@ 1 2 - 576945 + 576952 @@ -18755,7 +18818,7 @@ 1 2 - 576945 + 576952 @@ -18812,7 +18875,7 @@ 1 2 - 26912 + 26913 2 @@ -18848,12 +18911,12 @@ 1 2 - 57031 + 57032 2 3 - 14284 + 14285 3 @@ -18884,7 +18947,7 @@ 1 2 - 76491 + 76492 2 @@ -18894,7 +18957,7 @@ 3 1486 - 6644 + 6645 @@ -19922,31 +19985,31 @@ builtintypes - 26144 + 26128 id - 26144 + 26128 name - 26144 + 26128 kind - 26144 + 26128 size - 3268 + 3266 sign - 1400 + 1399 alignment - 2334 + 2332 @@ -19960,7 +20023,7 @@ 1 2 - 26144 + 26128 @@ -19976,7 +20039,7 @@ 1 2 - 26144 + 26128 @@ -19992,7 +20055,7 @@ 1 2 - 26144 + 26128 @@ -20008,7 +20071,7 @@ 1 2 - 26144 + 26128 @@ -20024,7 +20087,7 @@ 1 2 - 26144 + 26128 @@ -20040,7 +20103,7 @@ 1 2 - 26144 + 26128 @@ -20056,7 +20119,7 @@ 1 2 - 26144 + 26128 @@ -20072,7 +20135,7 @@ 1 2 - 26144 + 26128 @@ -20088,7 +20151,7 @@ 1 2 - 26144 + 26128 @@ -20104,7 +20167,7 @@ 1 2 - 26144 + 26128 @@ -20120,7 +20183,7 @@ 1 2 - 26144 + 26128 @@ -20136,7 +20199,7 @@ 1 2 - 26144 + 26128 @@ -20152,7 +20215,7 @@ 1 2 - 26144 + 26128 @@ -20168,7 +20231,7 @@ 1 2 - 26144 + 26128 @@ -20184,7 +20247,7 @@ 1 2 - 26144 + 26128 @@ -20343,7 +20406,7 @@ 3 4 - 2334 + 2332 @@ -20359,12 +20422,12 @@ 1 2 - 1867 + 1866 2 3 - 1400 + 1399 @@ -20479,7 +20542,7 @@ 5 6 - 1400 + 1399 @@ -20603,7 +20666,7 @@ 2 3 - 2334 + 2332 @@ -20619,7 +20682,7 @@ 3 4 - 2334 + 2332 @@ -20629,23 +20692,23 @@ derivedtypes - 3669548 + 3667313 id - 3669548 + 3667313 name - 1552788 + 1551842 kind - 2801 + 2799 type_id - 2362796 + 2361357 @@ -20659,7 +20722,7 @@ 1 2 - 3669548 + 3667313 @@ -20675,7 +20738,7 @@ 1 2 - 3669548 + 3667313 @@ -20691,7 +20754,7 @@ 1 2 - 3669548 + 3667313 @@ -20707,17 +20770,17 @@ 1 2 - 1324025 + 1323218 2 4 - 120450 + 120377 4 1153 - 108312 + 108246 @@ -20733,7 +20796,7 @@ 1 2 - 1551854 + 1550909 2 @@ -20754,17 +20817,17 @@ 1 2 - 1324025 + 1323218 2 4 - 120450 + 120377 4 1135 - 108312 + 108246 @@ -20903,22 +20966,22 @@ 1 2 - 1515439 + 1514516 2 3 - 546230 + 545897 3 4 - 218492 + 218359 4 72 - 82634 + 82584 @@ -20934,22 +20997,22 @@ 1 2 - 1526644 + 1525714 2 3 - 538760 + 538432 3 4 - 215690 + 215559 4 72 - 81701 + 81651 @@ -20965,22 +21028,22 @@ 1 2 - 1519641 + 1518715 2 3 - 549965 + 549630 3 4 - 217558 + 217425 4 6 - 75631 + 75585 @@ -20990,11 +21053,11 @@ pointerishsize - 2707342 + 2705693 id - 2707342 + 2705693 size @@ -21016,7 +21079,7 @@ 1 2 - 2707342 + 2705693 @@ -21032,7 +21095,7 @@ 1 2 - 2707342 + 2705693 @@ -21106,23 +21169,23 @@ arraysizes - 88237 + 88183 id - 88237 + 88183 num_elements - 31746 + 31727 bytesize - 33147 + 33127 alignment - 1867 + 1866 @@ -21136,7 +21199,7 @@ 1 2 - 88237 + 88183 @@ -21152,7 +21215,7 @@ 1 2 - 88237 + 88183 @@ -21168,7 +21231,7 @@ 1 2 - 88237 + 88183 @@ -21184,22 +21247,22 @@ 1 2 - 1867 + 1866 2 3 - 23810 + 23795 3 5 - 2801 + 2799 5 13 - 2801 + 2799 13 @@ -21220,17 +21283,17 @@ 1 2 - 26611 + 26595 2 3 - 2334 + 2332 3 7 - 2801 + 2799 @@ -21246,17 +21309,17 @@ 1 2 - 26611 + 26595 2 3 - 2801 + 2799 3 5 - 2334 + 2332 @@ -21272,27 +21335,27 @@ 1 2 - 1867 + 1866 2 3 - 23810 + 23795 3 4 - 3268 + 3266 4 6 - 2334 + 2332 7 16 - 1867 + 1866 @@ -21308,17 +21371,17 @@ 1 2 - 27544 + 27528 2 3 - 3734 + 3732 3 5 - 1867 + 1866 @@ -21334,12 +21397,12 @@ 1 2 - 27544 + 27528 2 3 - 4668 + 4665 4 @@ -21791,19 +21854,19 @@ usertypes - 5234008 + 5230820 id - 5234008 + 5230820 name - 1352503 + 1351680 kind - 5135 + 5132 @@ -21817,7 +21880,7 @@ 1 2 - 5234008 + 5230820 @@ -21833,7 +21896,7 @@ 1 2 - 5234008 + 5230820 @@ -21849,27 +21912,27 @@ 1 2 - 983681 + 983082 2 3 - 153598 + 153504 3 7 - 104577 + 104513 7 61 - 101776 + 101714 65 874 - 8870 + 8865 @@ -21885,17 +21948,17 @@ 1 2 - 1211977 + 1211239 2 3 - 125586 + 125509 3 7 - 14939 + 14930 @@ -22037,19 +22100,19 @@ usertypesize - 1706386 + 1705347 id - 1706386 + 1705347 size - 13539 + 13530 alignment - 2334 + 2332 @@ -22063,7 +22126,7 @@ 1 2 - 1706386 + 1705347 @@ -22079,7 +22142,7 @@ 1 2 - 1706386 + 1705347 @@ -22095,12 +22158,12 @@ 1 2 - 3268 + 3266 2 3 - 4201 + 4199 3 @@ -22151,12 +22214,12 @@ 1 2 - 10270 + 10264 2 3 - 2801 + 2799 3 @@ -22307,15 +22370,15 @@ mangled_name - 9019338 + 9013845 id - 9019338 + 9013845 mangled_name - 6061757 + 6058065 is_complete @@ -22333,7 +22396,7 @@ 1 2 - 9019338 + 9013845 @@ -22349,7 +22412,7 @@ 1 2 - 9019338 + 9013845 @@ -22365,12 +22428,12 @@ 1 2 - 5789108 + 5785583 2 874 - 272648 + 272482 @@ -22386,7 +22449,7 @@ 1 2 - 6061757 + 6058065 @@ -22439,48 +22502,48 @@ is_standard_layout_class - 1253995 + 1253232 id - 1253995 + 1253232 is_complete - 1645694 + 1644692 id - 1645694 + 1644692 is_class_template - 398234 + 397992 id - 398234 + 397992 class_instantiation - 1089659 + 1088996 to - 1089659 + 1088996 from - 168537 + 168435 @@ -22494,7 +22557,7 @@ 1 2 - 1089659 + 1088996 @@ -22510,47 +22573,47 @@ 1 2 - 59758 + 59722 2 3 - 29412 + 29394 3 4 - 15873 + 15863 4 5 - 13072 + 13064 5 6 - 9804 + 9798 6 10 - 12605 + 12597 10 16 - 13072 + 13064 16 70 - 13539 + 13530 70 84 - 1400 + 1399 @@ -22801,19 +22864,19 @@ class_template_argument_value - 495342 + 495040 type_id - 304861 + 304676 index - 1867 + 1866 arg_value - 495342 + 495040 @@ -22827,17 +22890,17 @@ 1 2 - 249772 + 249619 2 3 - 53222 + 53190 3 4 - 1867 + 1866 @@ -22853,22 +22916,22 @@ 1 2 - 189546 + 189431 2 3 - 81234 + 81184 3 4 - 12138 + 12131 4 9 - 21942 + 21929 @@ -22946,7 +23009,7 @@ 1 2 - 495342 + 495040 @@ -22962,7 +23025,7 @@ 1 2 - 495342 + 495040 @@ -22972,15 +23035,15 @@ is_proxy_class_for - 62092 + 62055 id - 62092 + 62055 templ_param_id - 62092 + 62055 @@ -22994,7 +23057,7 @@ 1 2 - 62092 + 62055 @@ -23010,7 +23073,7 @@ 1 2 - 62092 + 62055 @@ -23316,11 +23379,11 @@ is_function_template - 1402925 + 1402070 id - 1402925 + 1402070 @@ -24451,19 +24514,19 @@ routinetypeargs - 983214 + 982616 routine - 423445 + 423187 index - 7936 + 7931 type_id - 226895 + 226757 @@ -24477,27 +24540,27 @@ 1 2 - 152664 + 152571 2 3 - 133989 + 133908 3 4 - 63493 + 63454 4 5 - 45752 + 45724 5 18 - 27544 + 27528 @@ -24513,27 +24576,27 @@ 1 2 - 182543 + 182432 2 3 - 133522 + 133441 3 4 - 58824 + 58788 4 5 - 33614 + 33593 5 11 - 14939 + 14930 @@ -24574,7 +24637,7 @@ 10 11 - 1400 + 1399 13 @@ -24635,7 +24698,7 @@ 4 5 - 1400 + 1399 5 @@ -24691,27 +24754,27 @@ 1 2 - 146595 + 146505 2 3 - 30812 + 30794 3 5 - 16807 + 16796 5 12 - 18207 + 18196 12 110 - 14472 + 14463 @@ -24727,22 +24790,22 @@ 1 2 - 172739 + 172634 2 3 - 30812 + 30794 3 6 - 18674 + 18663 6 14 - 4668 + 4665 @@ -24752,19 +24815,19 @@ ptrtomembers - 37815 + 37792 id - 37815 + 37792 type_id - 37815 + 37792 class_id - 15406 + 15397 @@ -24778,7 +24841,7 @@ 1 2 - 37815 + 37792 @@ -24794,7 +24857,7 @@ 1 2 - 37815 + 37792 @@ -24810,7 +24873,7 @@ 1 2 - 37815 + 37792 @@ -24826,7 +24889,7 @@ 1 2 - 37815 + 37792 @@ -24842,12 +24905,12 @@ 1 2 - 13539 + 13530 8 9 - 1400 + 1399 28 @@ -24868,12 +24931,12 @@ 1 2 - 13539 + 13530 8 9 - 1400 + 1399 28 @@ -24888,15 +24951,15 @@ specifiers - 24743 + 24728 id - 24743 + 24728 str - 24743 + 24728 @@ -24910,7 +24973,7 @@ 1 2 - 24743 + 24728 @@ -24926,7 +24989,7 @@ 1 2 - 24743 + 24728 @@ -24936,15 +24999,15 @@ typespecifiers - 1132144 + 1131454 type_id - 1113936 + 1113258 spec_id - 3734 + 3732 @@ -24958,12 +25021,12 @@ 1 2 - 1095728 + 1095061 2 3 - 18207 + 18196 @@ -25019,15 +25082,15 @@ funspecifiers - 10305080 + 10298338 func_id - 4068249 + 4065772 spec_id - 8403 + 8398 @@ -25041,27 +25104,27 @@ 1 2 - 1357639 + 1356812 2 3 - 640536 + 640613 3 4 - 985549 + 984482 4 5 - 780129 + 779654 5 8 - 304395 + 304209 @@ -25160,8 +25223,8 @@ 466 - 6435 - 6436 + 6434 + 6435 466 @@ -25172,15 +25235,15 @@ varspecifiers - 2246080 + 2244713 var_id - 1225050 + 1224304 spec_id - 3734 + 3732 @@ -25194,22 +25257,22 @@ 1 2 - 730174 + 729730 2 3 - 202618 + 202495 3 4 - 58357 + 58322 4 5 - 233898 + 233756 @@ -25318,19 +25381,19 @@ attributes - 561636 + 561294 id - 561636 + 561294 kind - 1400 + 1399 name - 11204 + 11197 name_space @@ -25338,7 +25401,7 @@ location - 481336 + 481043 @@ -25352,7 +25415,7 @@ 1 2 - 561636 + 561294 @@ -25368,7 +25431,7 @@ 1 2 - 561636 + 561294 @@ -25384,7 +25447,7 @@ 1 2 - 561636 + 561294 @@ -25400,7 +25463,7 @@ 1 2 - 561636 + 561294 @@ -25591,7 +25654,7 @@ 1 2 - 10270 + 10264 2 @@ -25612,7 +25675,7 @@ 1 2 - 11204 + 11197 @@ -25783,17 +25846,17 @@ 1 2 - 431848 + 431585 2 3 - 20075 + 20062 3 7 - 29412 + 29394 @@ -25809,7 +25872,7 @@ 1 2 - 481336 + 481043 @@ -25825,17 +25888,17 @@ 1 2 - 433249 + 432985 2 3 - 19608 + 19596 3 4 - 28478 + 28461 @@ -25851,7 +25914,7 @@ 1 2 - 481336 + 481043 @@ -25861,27 +25924,27 @@ attribute_args - 344078 + 343868 id - 344078 + 343868 kind - 1400 + 1399 attribute - 262844 + 262684 index - 1400 + 1399 location - 327738 + 327538 @@ -25895,7 +25958,7 @@ 1 2 - 344078 + 343868 @@ -25911,7 +25974,7 @@ 1 2 - 344078 + 343868 @@ -25927,7 +25990,7 @@ 1 2 - 344078 + 343868 @@ -25943,7 +26006,7 @@ 1 2 - 344078 + 343868 @@ -26058,17 +26121,17 @@ 1 2 - 197483 + 197363 2 3 - 49487 + 49457 3 4 - 15873 + 15863 @@ -26084,12 +26147,12 @@ 1 2 - 252573 + 252419 2 3 - 10270 + 10264 @@ -26105,17 +26168,17 @@ 1 2 - 197483 + 197363 2 3 - 49487 + 49457 3 4 - 15873 + 15863 @@ -26131,17 +26194,17 @@ 1 2 - 197483 + 197363 2 3 - 49487 + 49457 3 4 - 15873 + 15863 @@ -26256,12 +26319,12 @@ 1 2 - 313732 + 313541 2 7 - 14005 + 13997 @@ -26277,12 +26340,12 @@ 1 2 - 315132 + 314941 2 3 - 12605 + 12597 @@ -26298,12 +26361,12 @@ 1 2 - 313732 + 313541 2 7 - 14005 + 13997 @@ -26319,7 +26382,7 @@ 1 2 - 327738 + 327538 @@ -26329,15 +26392,15 @@ attribute_arg_value - 25210 + 25195 arg - 25210 + 25195 value - 15873 + 15863 @@ -26351,7 +26414,7 @@ 1 2 - 25210 + 25195 @@ -26367,12 +26430,12 @@ 1 2 - 14472 + 14463 2 16 - 1400 + 1399 @@ -26430,15 +26493,15 @@ attribute_arg_constant - 318400 + 318207 arg - 318400 + 318207 constant - 318400 + 318207 @@ -26452,7 +26515,7 @@ 1 2 - 318400 + 318207 @@ -26468,7 +26531,7 @@ 1 2 - 318400 + 318207 @@ -26647,15 +26710,15 @@ funcattributes - 630265 + 629882 func_id - 443520 + 443250 spec_id - 524754 + 524435 @@ -26669,17 +26732,17 @@ 1 2 - 338476 + 338269 2 3 - 64427 + 64387 3 6 - 39683 + 39659 6 @@ -26700,12 +26763,12 @@ 1 2 - 506080 + 505771 2 17 - 18674 + 18663 @@ -26841,15 +26904,15 @@ unspecifiedtype - 9488069 + 9482291 type_id - 9488069 + 9482291 unspecified_type_id - 6490338 + 6486385 @@ -26863,7 +26926,7 @@ 1 2 - 9488069 + 9482291 @@ -26879,17 +26942,17 @@ 1 2 - 4558923 + 4556146 2 3 - 1715723 + 1714678 3 145 - 215690 + 215559 @@ -26899,19 +26962,19 @@ member - 3881037 + 3878673 parent - 545763 + 545431 index - 92905 + 92849 child - 3809607 + 3807287 @@ -26925,47 +26988,47 @@ 1 2 - 129788 + 129709 2 3 - 64894 + 64854 3 4 - 73297 + 73252 4 5 - 75165 + 75119 5 6 - 40617 + 40592 6 8 - 46686 + 46657 8 14 - 45752 + 45724 14 30 - 41550 + 41525 30 200 - 28011 + 27994 @@ -26981,52 +27044,52 @@ 1 2 - 129788 + 129709 2 3 - 64894 + 64854 3 4 - 73297 + 73252 4 5 - 76098 + 76052 5 6 - 39683 + 39659 6 7 - 24276 + 24262 7 9 - 42017 + 41992 9 17 - 43885 + 43858 17 41 - 41550 + 41525 41 200 - 10270 + 10264 @@ -27042,62 +27105,62 @@ 1 2 - 26144 + 26128 2 3 - 7002 + 6998 3 4 - 3734 + 3732 4 5 - 7936 + 7931 5 6 - 5602 + 5598 6 7 - 5602 + 5598 7 9 - 7469 + 7465 9 16 - 7002 + 6998 16 52 - 7002 + 6998 52 107 - 7002 + 6998 108 577 - 7002 + 6998 737 1162 - 1400 + 1399 @@ -27113,62 +27176,62 @@ 1 2 - 26144 + 26128 2 3 - 7002 + 6998 3 4 - 3734 + 3732 4 5 - 7936 + 7931 5 6 - 5602 + 5598 6 7 - 5602 + 5598 7 9 - 7469 + 7465 9 16 - 7002 + 6998 16 52 - 7002 + 6998 52 107 - 7002 + 6998 108 577 - 7002 + 6998 738 1163 - 1400 + 1399 @@ -27184,7 +27247,7 @@ 1 2 - 3809607 + 3807287 @@ -27200,12 +27263,12 @@ 1 2 - 3738177 + 3735900 2 3 - 71430 + 71386 @@ -28735,15 +28798,15 @@ commentbinding - 3091104 + 3089221 id - 2445431 + 2443942 element - 3014538 + 3012702 @@ -28757,12 +28820,12 @@ 1 2 - 2368399 + 2366956 2 97 - 77032 + 76985 @@ -28778,12 +28841,12 @@ 1 2 - 2937972 + 2936183 2 3 - 76565 + 76519 @@ -28793,15 +28856,15 @@ exprconv - 7032991 + 7032993 converted - 7032991 + 7032993 conversion - 7032991 + 7032993 @@ -28815,7 +28878,7 @@ 1 2 - 7032991 + 7032993 @@ -28831,7 +28894,7 @@ 1 2 - 7032991 + 7032993 @@ -29188,15 +29251,15 @@ namespaces - 12138 + 12131 id - 12138 + 12131 name - 9804 + 9798 @@ -29210,7 +29273,7 @@ 1 2 - 12138 + 12131 @@ -29226,7 +29289,7 @@ 1 2 - 8403 + 8398 2 @@ -29246,26 +29309,26 @@ namespace_inline - 1400 + 1399 id - 1400 + 1399 namespacembrs - 2388007 + 2386553 parentid - 10270 + 10264 memberid - 2388007 + 2386553 @@ -29279,7 +29342,7 @@ 1 2 - 1867 + 1866 2 @@ -29340,7 +29403,7 @@ 1 2 - 2388007 + 2386553 @@ -29836,7 +29899,7 @@ qualifyingelement - 97518 + 97537 location @@ -29950,7 +30013,7 @@ 1 2 - 58401 + 58420 2 @@ -29986,7 +30049,7 @@ 1 2 - 58401 + 58420 2 @@ -30022,7 +30085,7 @@ 1 2 - 63815 + 63834 2 @@ -30135,12 +30198,12 @@ 1 2 - 137073 + 137054 2 3 - 55684 + 55703 3 @@ -32081,7 +32144,7 @@ expr_types - 18451442 + 18451397 id @@ -32107,12 +32170,12 @@ 1 2 - 18188121 + 18188166 2 3 - 131660 + 131615 @@ -32149,17 +32212,17 @@ 2 3 - 249334 + 249345 3 4 - 102840 + 102817 4 5 - 81865 + 81877 5 @@ -32174,12 +32237,12 @@ 14 41 - 91664 + 91653 41 125325 - 44579 + 44590 @@ -33706,11 +33769,11 @@ lambdas - 21475 + 21462 expr - 21475 + 21462 default_capture @@ -33732,7 +33795,7 @@ 1 2 - 21475 + 21462 @@ -33748,7 +33811,7 @@ 1 2 - 21475 + 21462 @@ -33822,15 +33885,15 @@ lambda_capture - 28011 + 27994 id - 28011 + 27994 lambda - 20541 + 20529 index @@ -33838,7 +33901,7 @@ field - 28011 + 27994 captured_by_reference @@ -33850,7 +33913,7 @@ location - 2801 + 2799 @@ -33864,7 +33927,7 @@ 1 2 - 28011 + 27994 @@ -33880,7 +33943,7 @@ 1 2 - 28011 + 27994 @@ -33896,7 +33959,7 @@ 1 2 - 28011 + 27994 @@ -33912,7 +33975,7 @@ 1 2 - 28011 + 27994 @@ -33928,7 +33991,7 @@ 1 2 - 28011 + 27994 @@ -33944,7 +34007,7 @@ 1 2 - 28011 + 27994 @@ -33960,12 +34023,12 @@ 1 2 - 13072 + 13064 2 3 - 7469 + 7465 @@ -33981,12 +34044,12 @@ 1 2 - 13072 + 13064 2 3 - 7469 + 7465 @@ -34002,12 +34065,12 @@ 1 2 - 13072 + 13064 2 3 - 7469 + 7465 @@ -34023,7 +34086,7 @@ 1 2 - 20541 + 20529 @@ -34039,7 +34102,7 @@ 1 2 - 20541 + 20529 @@ -34055,12 +34118,12 @@ 1 2 - 13072 + 13064 2 3 - 7469 + 7465 @@ -34192,7 +34255,7 @@ 1 2 - 28011 + 27994 @@ -34208,7 +34271,7 @@ 1 2 - 28011 + 27994 @@ -34224,7 +34287,7 @@ 1 2 - 28011 + 27994 @@ -34240,7 +34303,7 @@ 1 2 - 28011 + 27994 @@ -34256,7 +34319,7 @@ 1 2 - 28011 + 27994 @@ -34272,7 +34335,7 @@ 1 2 - 28011 + 27994 @@ -34480,7 +34543,7 @@ 8 9 - 1867 + 1866 14 @@ -34501,7 +34564,7 @@ 8 9 - 1867 + 1866 14 @@ -34522,7 +34585,7 @@ 1 2 - 2801 + 2799 @@ -34538,7 +34601,7 @@ 8 9 - 1867 + 1866 14 @@ -34559,7 +34622,7 @@ 1 2 - 2801 + 2799 @@ -34575,7 +34638,7 @@ 1 2 - 2801 + 2799 @@ -36318,11 +36381,11 @@ stmt_decl_bind - 580842 + 580849 stmt - 541060 + 541066 num @@ -36330,7 +36393,7 @@ decl - 580738 + 580745 @@ -36344,7 +36407,7 @@ 1 2 - 520371 + 520377 2 @@ -36365,7 +36428,7 @@ 1 2 - 520371 + 520377 2 @@ -36568,7 +36631,7 @@ 1 2 - 580700 + 580707 2 @@ -36589,7 +36652,7 @@ 1 2 - 580738 + 580745 @@ -36599,11 +36662,11 @@ stmt_decl_entry_bind - 580842 + 580849 stmt - 541060 + 541066 num @@ -36611,7 +36674,7 @@ decl_entry - 580784 + 580791 @@ -36625,7 +36688,7 @@ 1 2 - 520371 + 520377 2 @@ -36646,7 +36709,7 @@ 1 2 - 520371 + 520377 2 @@ -36849,7 +36912,7 @@ 1 2 - 580763 + 580770 3 @@ -36870,7 +36933,7 @@ 1 2 - 580784 + 580791 @@ -36880,15 +36943,15 @@ blockscope - 1410861 + 1410469 block - 1410861 + 1410469 enclosing - 1295546 + 1295224 @@ -36902,7 +36965,7 @@ 1 2 - 1410861 + 1410469 @@ -36918,12 +36981,12 @@ 1 2 - 1230185 + 1229903 2 13 - 65360 + 65321 @@ -37119,19 +37182,19 @@ preprocdirects - 4190567 + 4188015 id - 4190567 + 4188015 kind - 5135 + 5132 location - 4149950 + 4147423 @@ -37145,7 +37208,7 @@ 1 2 - 4190567 + 4188015 @@ -37161,7 +37224,7 @@ 1 2 - 4190567 + 4188015 @@ -37309,7 +37372,7 @@ 1 2 - 4149483 + 4146956 88 @@ -37330,7 +37393,7 @@ 1 2 - 4149950 + 4147423 @@ -37340,15 +37403,15 @@ preprocpair - 1431403 + 1430532 begin - 1197038 + 1196309 elseelifend - 1431403 + 1430532 @@ -37362,17 +37425,17 @@ 1 2 - 978546 + 977950 2 3 - 208221 + 208094 3 11 - 10270 + 10264 @@ -37388,7 +37451,7 @@ 1 2 - 1431403 + 1430532 @@ -37398,22 +37461,22 @@ preproctrue - 767056 + 766589 branch - 767056 + 766589 preprocfalse - 331473 + 331271 branch - 331473 + 331271 @@ -37566,15 +37629,15 @@ includes - 313265 + 313074 id - 313265 + 313074 included - 117182 + 117111 @@ -37588,7 +37651,7 @@ 1 2 - 313265 + 313074 @@ -37604,32 +37667,32 @@ 1 2 - 61159 + 61121 2 3 - 21942 + 21929 3 4 - 12605 + 12597 4 6 - 10270 + 10264 6 14 - 8870 + 8865 14 47 - 2334 + 2332 diff --git a/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/old.dbscheme b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/old.dbscheme new file mode 100644 index 000000000000..e51fad7a2436 --- /dev/null +++ b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/old.dbscheme @@ -0,0 +1,2323 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..f0156f5f88ab --- /dev/null +++ b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/semmlecode.cpp.dbscheme @@ -0,0 +1,2339 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * Optionally, record the build mode for each compilation. + */ +compilation_build_mode( + unique int id : @compilation ref, + int mode : int ref +); + +/* +case @compilation_build_mode.mode of + 0 = @build_mode_none +| 1 = @build_mode_manual +| 2 = @build_mode_auto +; +*/ + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +extractor_version( + string codeql_version: string ref, + string frontend_version: string ref +) + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +case @macroinvocation.kind of + 1 = @macro_expansion +| 2 = @other_macro_reference +; + +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* +case @function.kind of + 1 = @normal_function +| 2 = @constructor +| 3 = @destructor +| 4 = @conversion_function +| 5 = @operator +| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk +| 7 = @user_defined_literal +| 8 = @deduction_guide +; +*/ + +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point( + int id: @function ref, + unique int entry_point: @stmt ref +); + +function_return_type( + int id: @function ref, + int return_type: @type ref +); + +/** + * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits` + * instance associated with it, and the variables representing the `handle` and `promise` + * for it. + */ +coroutine( + unique int function: @function ref, + int traits: @type ref +); + +/* +case @coroutine_placeholder_variable.kind of + 1 = @handle +| 2 = @promise +| 3 = @init_await_resume +; +*/ + +coroutine_placeholder_variable( + unique int placeholder_variable: @variable ref, + int kind: int ref, + int function: @function ref +) + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +function_prototyped(unique int id: @function ref) + +deduction_guide_for_class( + int id: @function ref, + int class_template: @usertype ref +) + +member_function_this_type( + unique int id: @function ref, + int this_type: @type ref +); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) +is_structured_binding(unique int id: @variable ref); + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +case @using.kind of + 1 = @using_declaration +| 2 = @using_directive +| 3 = @using_enum_declaration +; + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref, + int kind: int ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @parameterized_element ref, + int index: int ref, + int type_id: @type ref +); + +overrides( + int new: @function ref, + int old: @function ref +); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +orphaned_variables( + int var: @localvariable ref, + int function: @function ref +) + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/** + * Built-in types are the fundamental types, e.g., integral, floating, and void. + */ +case @builtintype.kind of + 1 = @errortype +| 2 = @unknowntype +| 3 = @void +| 4 = @boolean +| 5 = @char +| 6 = @unsigned_char +| 7 = @signed_char +| 8 = @short +| 9 = @unsigned_short +| 10 = @signed_short +| 11 = @int +| 12 = @unsigned_int +| 13 = @signed_int +| 14 = @long +| 15 = @unsigned_long +| 16 = @signed_long +| 17 = @long_long +| 18 = @unsigned_long_long +| 19 = @signed_long_long +// ... 20 Microsoft-specific __int8 +// ... 21 Microsoft-specific __int16 +// ... 22 Microsoft-specific __int32 +// ... 23 Microsoft-specific __int64 +| 24 = @float +| 25 = @double +| 26 = @long_double +| 27 = @complex_float // C99-specific _Complex float +| 28 = @complex_double // C99-specific _Complex double +| 29 = @complex_long_double // C99-specific _Complex long double +| 30 = @imaginary_float // C99-specific _Imaginary float +| 31 = @imaginary_double // C99-specific _Imaginary double +| 32 = @imaginary_long_double // C99-specific _Imaginary long double +| 33 = @wchar_t // Microsoft-specific +| 34 = @decltype_nullptr // C++11 +| 35 = @int128 // __int128 +| 36 = @unsigned_int128 // unsigned __int128 +| 37 = @signed_int128 // signed __int128 +| 38 = @float128 // __float128 +| 39 = @complex_float128 // _Complex __float128 +| 40 = @decimal32 // _Decimal32 +| 41 = @decimal64 // _Decimal64 +| 42 = @decimal128 // _Decimal128 +| 43 = @char16_t +| 44 = @char32_t +| 45 = @std_float32 // _Float32 +| 46 = @float32x // _Float32x +| 47 = @std_float64 // _Float64 +| 48 = @float64x // _Float64x +| 49 = @std_float128 // _Float128 +// ... 50 _Float128x +| 51 = @char8_t +| 52 = @float16 // _Float16 +| 53 = @complex_float16 // _Complex _Float16 +| 54 = @fp16 // __fp16 +| 55 = @std_bfloat16 // __bf16 +| 56 = @std_float16 // std::float16_t +| 57 = @complex_std_float32 // _Complex _Float32 +| 58 = @complex_float32x // _Complex _Float32x +| 59 = @complex_std_float64 // _Complex _Float64 +| 60 = @complex_float64x // _Complex _Float64x +| 61 = @complex_std_float128 // _Complex _Float128 +; + +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/** + * Derived types are types that are directly derived from existing types and + * point to, refer to, transform type data to return a new type. + */ +case @derivedtype.kind of + 1 = @pointer +| 2 = @reference +| 3 = @type_with_specifiers +| 4 = @array +| 5 = @gnu_vector +| 6 = @routineptr +| 7 = @routinereference +| 8 = @rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated +| 10 = @block +; + +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +/** + * An instance of the C++11 `decltype` operator. For example: + * ``` + * int a; + * decltype(1+a) b; + * ``` + * Here `expr` is `1+a`. + * + * Sometimes an additional pair of parentheses around the expression + * would change the semantics of this decltype, e.g. + * ``` + * struct A { double x; }; + * const A* a = new A(); + * decltype( a->x ); // type is double + * decltype((a->x)); // type is const double& + * ``` + * (Please consult the C++11 standard for more details). + * `parentheses_would_change_meaning` is `true` iff that is the case. + */ +#keyset[id, expr] +decltypes( + int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* +case @usertype.kind of + 1 = @struct +| 2 = @class +| 3 = @union +| 4 = @enum +| 5 = @typedef // classic C: typedef typedef type name +| 6 = @template +| 7 = @template_parameter +| 8 = @template_template_parameter +| 9 = @proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated +| 13 = @scoped_enum +| 14 = @using_alias // a using name = type style typedef +; +*/ + +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname, + boolean is_complete: boolean ref +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the frontend. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +explicit_specifier_exprs( + unique int func_id: @function ref, + int constant: @expr ref +) + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +| 4 = @attribute_arg_constant_expr +| 5 = @attribute_arg_expr +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_constant( + unique int arg: @attribute_arg ref, + int constant: @expr ref +) +attribute_arg_expr( + unique int arg: @attribute_arg ref, + int expr: @expr ref +) +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + | @c11_generic + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall( + unique int caller: @funbindexpr ref, + int kind: int ref +); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + ; + +@assign_pointer_expr = @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr + | @assign_bitwise_expr + | @assign_pointer_expr + ; + +@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr + +/* + Binary encoding of the allocator form. + + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + Binary encoding of the deallocator form. + + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 4 = destroying_delete + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +braced_initialisers( + int init: @initialiser ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +expr_reuse( + int reuse: @expr ref, + int original: @expr ref, + int value_category: int ref +) + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // frontend internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +| 330 = @isassignable +| 331 = @isaggregate +| 332 = @hasuniqueobjectrepresentations +| 333 = @builtinbitcast +| 334 = @builtinshuffle +| 335 = @blockassignexpr +| 336 = @issame +| 337 = @isfunction +| 338 = @islayoutcompatible +| 339 = @ispointerinterconvertiblebaseof +| 340 = @isarray +| 341 = @arrayrank +| 342 = @arrayextent +| 343 = @isarithmetic +| 344 = @iscompletetype +| 345 = @iscompound +| 346 = @isconst +| 347 = @isfloatingpoint +| 348 = @isfundamental +| 349 = @isintegral +| 350 = @islvaluereference +| 351 = @ismemberfunctionpointer +| 352 = @ismemberobjectpointer +| 353 = @ismemberpointer +| 354 = @isobject +| 355 = @ispointer +| 356 = @isreference +| 357 = @isrvaluereference +| 358 = @isscalar +| 359 = @issigned +| 360 = @isunsigned +| 361 = @isvoid +| 362 = @isvolatile +| 363 = @reuseexpr +| 364 = @istriviallycopyassignable +| 365 = @isassignablenopreconditioncheck +| 366 = @referencebindstotemporary +| 367 = @issameas +| 368 = @builtinhasattribute +| 369 = @ispointerinterconvertiblewithclass +| 370 = @builtinispointerinterconvertiblewithclass +| 371 = @iscorrespondingmember +| 372 = @builtiniscorrespondingmember +| 373 = @isboundedarray +| 374 = @isunboundedarray +| 375 = @isreferenceable +| 378 = @isnothrowconvertible +| 379 = @referenceconstructsfromtemporary +| 380 = @referenceconvertsfromtemporary +| 381 = @isconvertible +| 382 = @isvalidwinrttype +| 383 = @iswinclass +| 384 = @iswininterface +| 385 = @istriviallyequalitycomparable +| 386 = @isscopedenum +| 387 = @istriviallyrelocatable +| 388 = @datasizeof +| 389 = @c11_generic +| 390 = @requires_expr +| 391 = @nested_requirement +| 392 = @compound_requirement +| 393 = @concept_id +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @istrivialexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + | @isassignable + | @isaggregate + | @hasuniqueobjectrepresentations + | @builtinbitcast + | @builtinshuffle + | @issame + | @isfunction + | @islayoutcompatible + | @ispointerinterconvertiblebaseof + | @isarray + | @arrayrank + | @arrayextent + | @isarithmetic + | @iscompletetype + | @iscompound + | @isconst + | @isfloatingpoint + | @isfundamental + | @isintegral + | @islvaluereference + | @ismemberfunctionpointer + | @ismemberobjectpointer + | @ismemberpointer + | @isobject + | @ispointer + | @isreference + | @isrvaluereference + | @isscalar + | @issigned + | @isunsigned + | @isvoid + | @isvolatile + | @istriviallycopyassignable + | @isassignablenopreconditioncheck + | @referencebindstotemporary + | @issameas + | @builtinhasattribute + | @ispointerinterconvertiblewithclass + | @builtinispointerinterconvertiblewithclass + | @iscorrespondingmember + | @builtiniscorrespondingmember + | @isboundedarray + | @isunboundedarray + | @isreferenceable + | @isnothrowconvertible + | @referenceconstructsfromtemporary + | @referenceconvertsfromtemporary + | @isconvertible + | @isvalidwinrttype + | @iswinclass + | @iswininterface + | @istriviallyequalitycomparable + | @isscopedenum + | @istriviallyrelocatable + ; + +compound_requirement_is_noexcept( + int expr: @compound_requirement ref +); + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref, + int position: int ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. Position is used to sort repeated initializers. + */ +#keyset[aggregate, position] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref, + int position: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_initialization( + unique int if_stmt: @stmt_if ref, + int init_id: @stmt ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_initialization( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int init_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +switch_initialization( + unique int switch_stmt: @stmt_switch ref, + int init_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +@stmt_for_or_range_based_for = @stmt_for + | @stmt_range_based_for; + +for_initialization( + unique int for_stmt: @stmt_for_or_range_based_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@parameterized_element = @function | @stmt_block | @requires_expr; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @parameterized_element ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/upgrade.properties b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/upgrade.properties new file mode 100644 index 000000000000..08e1dc42eb29 --- /dev/null +++ b/cpp/ql/lib/upgrades/e51fad7a2436caefab0c6bd52f05e28e7cce4d92/upgrade.properties @@ -0,0 +1,2 @@ +description: Implement compilation_build_mode/2 +compatibility: backwards diff --git a/cpp/ql/src/Likely Bugs/Underspecified Functions/TooFewArguments.qll b/cpp/ql/src/Likely Bugs/Underspecified Functions/TooFewArguments.qll index 6f3f4d43e9aa..218a54b36c51 100644 --- a/cpp/ql/src/Likely Bugs/Underspecified Functions/TooFewArguments.qll +++ b/cpp/ql/src/Likely Bugs/Underspecified Functions/TooFewArguments.qll @@ -51,5 +51,7 @@ predicate tooFewArguments(FunctionCall fc, Function f) { hasDefiniteNumberOfParameters(fde) | fde.getNumberOfParameters() > fc.getNumberOfArguments() - ) + ) and + // Don't report on implicit function declarations, as these are likely extraction errors. + not f.getADeclarationEntry().isImplicit() } diff --git a/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md b/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md new file mode 100644 index 000000000000..116df08838a1 --- /dev/null +++ b/cpp/ql/src/change-notes/2024-11-22-too-few-arguments.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The "Call to function with fewer arguments than declared parameters" query (`cpp/too-few-arguments`) query no longer produces results if the function has been implicitly declared. diff --git a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.expected b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.expected index 8547894e769b..d3e0ecbd591b 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.expected @@ -1,9 +1,9 @@ | test.c:28:3:28:12 | call to undeclared | Function call implicitly declares 'undeclared'. | | test.c:31:3:31:19 | call to not_yet_declared1 | Function call implicitly declares 'not_yet_declared1'. | | test.c:32:3:32:19 | call to not_yet_declared2 | Function call implicitly declares 'not_yet_declared2'. | -| test.c:43:3:43:27 | call to not_declared_defined_with | Function call implicitly declares 'not_declared_defined_with'. | -| test.c:54:3:54:21 | call to defined_with_double | Function call implicitly declares 'defined_with_double'. | -| test.c:66:3:66:22 | call to defined_with_ptr_ptr | Function call implicitly declares 'defined_with_ptr_ptr'. | -| test.c:68:3:68:22 | call to defined_with_ptr_arr | Function call implicitly declares 'defined_with_ptr_arr'. | -| test.c:132:3:132:22 | call to implicit_declaration | Function call implicitly declares 'implicit_declaration'. | -| test.c:133:3:133:30 | call to implicit_declaration_k_and_r | Function call implicitly declares 'implicit_declaration_k_and_r'. | +| test.c:44:3:44:27 | call to not_declared_defined_with | Function call implicitly declares 'not_declared_defined_with'. | +| test.c:55:3:55:21 | call to defined_with_double | Function call implicitly declares 'defined_with_double'. | +| test.c:67:3:67:22 | call to defined_with_ptr_ptr | Function call implicitly declares 'defined_with_ptr_ptr'. | +| test.c:69:3:69:22 | call to defined_with_ptr_arr | Function call implicitly declares 'defined_with_ptr_arr'. | +| test.c:133:3:133:22 | call to implicit_declaration | Function call implicitly declares 'implicit_declaration'. | +| test.c:134:3:134:30 | call to implicit_declaration_k_and_r | Function call implicitly declares 'implicit_declaration_k_and_r'. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/MistypedFunctionArguments.expected b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/MistypedFunctionArguments.expected index b6015dad4564..d067430aba9c 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/MistypedFunctionArguments.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/MistypedFunctionArguments.expected @@ -1,18 +1,18 @@ -| test.c:33:3:33:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:32:3:32:3 | not_yet_declared2 | not_yet_declared2 | test.c:33:21:33:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:76:24:76:26 | (unnamed parameter 0) | int (unnamed parameter 0) | -| test.c:33:3:33:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:76:6:76:22 | not_yet_declared2 | not_yet_declared2 | test.c:33:21:33:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:76:24:76:26 | (unnamed parameter 0) | int (unnamed parameter 0) | -| test.c:40:3:40:29 | call to declared_empty_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:77:6:77:32 | declared_empty_defined_with | declared_empty_defined_with | test.c:40:31:40:32 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:77:38:77:38 | x | int x | -| test.c:44:3:44:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:80:6:80:30 | not_declared_defined_with | not_declared_defined_with | test.c:44:29:44:31 | 4 | 4 | file://:0:0:0:0 | long long | long long | test.c:80:36:80:36 | x | int x | -| test.c:44:3:44:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:80:6:80:30 | not_declared_defined_with | not_declared_defined_with | test.c:44:37:44:42 | 2500000000.0 | 2500000000.0 | file://:0:0:0:0 | float | float | test.c:80:50:80:50 | z | int z | -| test.c:47:3:47:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:47:26:47:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:92:34:92:34 | x | int * x | -| test.c:47:3:47:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:47:34:47:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:92:43:92:43 | y | void * y | -| test.c:47:3:47:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:92:6:92:27 | declared_with_pointers | declared_with_pointers | test.c:47:26:47:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:92:34:92:34 | x | int * x | -| test.c:47:3:47:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:92:6:92:27 | declared_with_pointers | declared_with_pointers | test.c:47:34:47:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:92:43:92:43 | y | void * y | -| test.c:49:3:49:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:6:6:6:24 | declared_with_array | declared_with_array | test.c:49:23:49:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:93:31:93:31 | a | char[6] a | -| test.c:49:3:49:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:6:93:24 | declared_with_array | declared_with_array | test.c:49:23:49:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:93:31:93:31 | a | char[6] a | -| test.c:51:3:51:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:95:7:95:24 | defined_with_float | defined_with_float | test.c:51:22:51:24 | 2.0 | 2.0 | file://:0:0:0:0 | float | float | test.c:95:32:95:32 | f | float f | -| test.c:52:3:52:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:95:7:95:24 | defined_with_float | defined_with_float | test.c:52:22:52:24 | 2.0 | 2.0 | file://:0:0:0:0 | double | double | test.c:95:32:95:32 | f | float f | -| test.c:55:3:55:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:99:8:99:26 | defined_with_double | defined_with_double | test.c:55:23:55:25 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:99:35:99:35 | d | double d | -| test.c:57:3:57:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:103:11:103:32 | defined_with_long_long | defined_with_long_long | test.c:57:26:57:28 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:103:44:103:45 | ll | long long ll | -| test.c:58:3:58:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:103:11:103:32 | defined_with_long_long | defined_with_long_long | test.c:58:26:58:26 | 3 | 3 | file://:0:0:0:0 | int | int | test.c:103:44:103:45 | ll | long long ll | -| test.c:60:3:60:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:99:8:99:26 | defined_with_double | defined_with_double | test.c:60:23:60:25 | 2 | 2 | file://:0:0:0:0 | long long | long long | test.c:99:35:99:35 | d | double d | -| test.c:61:3:61:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:103:11:103:32 | defined_with_long_long | defined_with_long_long | test.c:61:26:61:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:103:44:103:45 | ll | long long ll | +| test.c:33:3:33:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:32:3:32:3 | not_yet_declared2 | not_yet_declared2 | test.c:33:21:33:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:77:24:77:26 | (unnamed parameter 0) | int (unnamed parameter 0) | +| test.c:33:3:33:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:77:6:77:22 | not_yet_declared2 | not_yet_declared2 | test.c:33:21:33:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:77:24:77:26 | (unnamed parameter 0) | int (unnamed parameter 0) | +| test.c:41:3:41:29 | call to declared_empty_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:78:6:78:32 | declared_empty_defined_with | declared_empty_defined_with | test.c:41:31:41:32 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:78:38:78:38 | x | int x | +| test.c:45:3:45:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:81:6:81:30 | not_declared_defined_with | not_declared_defined_with | test.c:45:29:45:31 | 4 | 4 | file://:0:0:0:0 | long long | long long | test.c:81:36:81:36 | x | int x | +| test.c:45:3:45:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:81:6:81:30 | not_declared_defined_with | not_declared_defined_with | test.c:45:37:45:42 | 2500000000.0 | 2500000000.0 | file://:0:0:0:0 | float | float | test.c:81:50:81:50 | z | int z | +| test.c:48:3:48:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:48:26:48:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:93:34:93:34 | x | int * x | +| test.c:48:3:48:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:48:34:48:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:93:43:93:43 | y | void * y | +| test.c:48:3:48:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:6:93:27 | declared_with_pointers | declared_with_pointers | test.c:48:26:48:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:93:34:93:34 | x | int * x | +| test.c:48:3:48:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:6:93:27 | declared_with_pointers | declared_with_pointers | test.c:48:34:48:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:93:43:93:43 | y | void * y | +| test.c:50:3:50:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:6:6:6:24 | declared_with_array | declared_with_array | test.c:50:23:50:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:94:31:94:31 | a | char[6] a | +| test.c:50:3:50:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:94:6:94:24 | declared_with_array | declared_with_array | test.c:50:23:50:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:94:31:94:31 | a | char[6] a | +| test.c:52:3:52:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:96:7:96:24 | defined_with_float | defined_with_float | test.c:52:22:52:24 | 2.0 | 2.0 | file://:0:0:0:0 | float | float | test.c:96:32:96:32 | f | float f | +| test.c:53:3:53:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:96:7:96:24 | defined_with_float | defined_with_float | test.c:53:22:53:24 | 2.0 | 2.0 | file://:0:0:0:0 | double | double | test.c:96:32:96:32 | f | float f | +| test.c:56:3:56:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:100:8:100:26 | defined_with_double | defined_with_double | test.c:56:23:56:25 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:100:35:100:35 | d | double d | +| test.c:58:3:58:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:104:11:104:32 | defined_with_long_long | defined_with_long_long | test.c:58:26:58:28 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:104:44:104:45 | ll | long long ll | +| test.c:59:3:59:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:104:11:104:32 | defined_with_long_long | defined_with_long_long | test.c:59:26:59:26 | 3 | 3 | file://:0:0:0:0 | int | int | test.c:104:44:104:45 | ll | long long ll | +| test.c:61:3:61:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:100:8:100:26 | defined_with_double | defined_with_double | test.c:61:23:61:25 | 2 | 2 | file://:0:0:0:0 | long long | long long | test.c:100:35:100:35 | d | double d | +| test.c:62:3:62:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:104:11:104:32 | defined_with_long_long | defined_with_long_long | test.c:62:26:62:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:104:44:104:45 | ll | long long ll | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooFewArguments.expected b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooFewArguments.expected index 42c4f7f94559..90468d3a9bfc 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooFewArguments.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooFewArguments.expected @@ -1,4 +1,2 @@ -| test.c:34:3:34:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:32:3:32:3 | not_yet_declared2 | not_yet_declared2 | -| test.c:34:3:34:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:76:6:76:22 | not_yet_declared2 | not_yet_declared2 | -| test.c:36:3:36:29 | call to declared_empty_defined_with | This call has fewer arguments than required by $@. | test.c:77:6:77:32 | declared_empty_defined_with | declared_empty_defined_with | -| test.c:87:10:87:20 | call to dereference | This call has fewer arguments than required by $@. | test.c:90:5:90:15 | dereference | dereference | +| test.c:37:3:37:29 | call to declared_empty_defined_with | This call has fewer arguments than required by $@. | test.c:78:6:78:32 | declared_empty_defined_with | declared_empty_defined_with | +| test.c:88:10:88:20 | call to dereference | This call has fewer arguments than required by $@. | test.c:91:5:91:15 | dereference | dereference | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooManyArguments.expected b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooManyArguments.expected index bc64434578b2..6eff27c3adb3 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooManyArguments.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/TooManyArguments.expected @@ -1,2 +1,2 @@ -| test.c:41:3:41:29 | call to declared_empty_defined_with | This call has more arguments than required by $@. | test.c:77:6:77:32 | declared_empty_defined_with | declared_empty_defined_with | -| test.c:72:3:72:28 | call to declared_and_defined_empty | This call has more arguments than required by $@. | test.c:114:6:114:31 | declared_and_defined_empty | declared_and_defined_empty | +| test.c:42:3:42:29 | call to declared_empty_defined_with | This call has more arguments than required by $@. | test.c:78:6:78:32 | declared_empty_defined_with | declared_empty_defined_with | +| test.c:73:3:73:28 | call to declared_and_defined_empty | This call has more arguments than required by $@. | test.c:115:6:115:31 | declared_and_defined_empty | declared_and_defined_empty | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/test.c b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/test.c index 86e940a8e282..d77c16683ed6 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/test.c +++ b/cpp/ql/test/query-tests/Likely Bugs/Underspecified Functions/test.c @@ -30,8 +30,9 @@ void test(int *argv[]) { not_yet_declared1(1); // BAD (GOOD for everything except for cpp/implicit-function-declaration) not_yet_declared2(1); // BAD (GOOD for everything except for cpp/implicit-function-declaration) - not_yet_declared2(ca); // BAD - not_yet_declared2(); // BAD + not_yet_declared2(ca); // BAD (GOOD for everything except for cpp/mistyped-function-arguments + // and cpp/too-few-arguments. Not detected in the case of cpp/too-few-arguments.) + not_yet_declared2(); // BAD [NOT DETECTED] (GOOD for everything except for cpp/too-few-arguments) declared_empty_defined_with(); // BAD declared_empty_defined_with(1); // GOOD diff --git a/java/ql/automodel/publish.sh b/java/ql/automodel/publish.sh deleted file mode 100755 index 7304f0da1809..000000000000 --- a/java/ql/automodel/publish.sh +++ /dev/null @@ -1,197 +0,0 @@ -#!/bin/bash -set -e - -help="Usage: ./publish [--override-release] [--dry-run] -Publish the automodel query pack. - -If no arguments are provided, publish the version of the codeql repo specified by the latest official release of the codeml-automodel repo. -If the --override-release argument is provided, your current local HEAD is used (for unofficial releases or patching). -If the --dry-run argument is provided, the release is not published (for testing purposes)." - -# Echo the help message -if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then - echo "$help" - exit 0 -fi - -# Check the number of arguments are valid -if [ $# -gt 2 ]; then - echo "Error: Invalid arguments provided" - echo "$help" - exit 1 -fi - -OVERRIDE_RELEASE=0 -DRY_RUN=0 -for arg in "$@" -do - case $arg in - --override-release) - OVERRIDE_RELEASE=1 - shift # Remove --override-release from processing - ;; - --dry-run) - DRY_RUN=1 - shift # Remove --dry-run from processing - ;; - *) - echo "Error: Invalid argument provided: $arg" - echo "$help" - exit 1 - ;; - esac -done - -# Describe what we're about to do based on the command-line arguments -if [ $OVERRIDE_RELEASE = 1 ]; then - echo "Publishing the current HEAD of the automodel repo" -else - echo "Publishing the version of the automodel repo specified by the latest official release of the codeml-automodel repo" -fi -if [ $DRY_RUN = 1 ]; then - echo "Dry run: we will step through the process but we won't publish the query pack" -else - echo "Not a dry run! Publishing the query pack" -fi - -# If we're publishing the codeml-automodel release then we will checkout the sha specified in the release. -# So we need to check that there are no uncommitted changes in the local branch. -# And, if we're publishing the current HEAD, it's cleaner to ensure that there are no uncommitted changes. -if ! git diff --quiet; then - echo "Error: Uncommitted changes exist. Please commit or stash your changes before publishing." - exit 1 -fi - -# Check the above environment variables are set -if [ -z "${GITHUB_TOKEN}" ]; then - echo "Error: GITHUB_TOKEN environment variable not set. Please set this to a token with package:write permissions to codeql." - exit 1 -fi -if [ -z "${GH_TOKEN}" ]; then - echo "Error: GH_TOKEN environment variable not set. Please set this to a token with repo permissions to github/codeml-automodel." - exit 1 -fi - -# Get the sha of the previous release, i.e. the last commit to the main branch that updated the query pack version -PREVIOUS_RELEASE_SHA=$(git rev-list -n 1 main -- ./src/qlpack.yml) -if [ -z "$PREVIOUS_RELEASE_SHA" ]; then - echo "Error: Could not get the sha of the previous release of codeml-automodel query pack" - exit 1 -else - echo "Previous query-pack release sha: $PREVIOUS_RELEASE_SHA" -fi - -CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) -CURRENT_SHA=$(git rev-parse HEAD) - -if [ $OVERRIDE_RELEASE = 1 ]; then - # Check that the current HEAD is downstream from PREVIOUS_RELEASE_SHA - if ! git merge-base --is-ancestor "$PREVIOUS_RELEASE_SHA" "$CURRENT_SHA"; then - echo "Error: The current HEAD is not downstream from the previous release" - exit 1 - fi -else - # Get the latest release of codeml-automodel - TAG_NAME=$(gh api -H 'Accept: application/vnd.github+json' -H 'X-GitHub-Api-Version: 2022-11-28' /repos/github/codeml-automodel/releases/latest | jq -r .tag_name) - # Check TAG_NAME is not empty - if [ -z "$TAG_NAME" ]; then - echo "Error: Could not get latest release of codeml-automodel" - exit 1 - fi - echo "Updating to latest automodel release: $TAG_NAME" - # Before downloading, delete any existing release.zip, and ignore failure if not present - rm release.zip || true - gh release download $TAG_NAME -A zip -O release.zip --repo 'https://github.com/github/codeml-automodel' - # Before unzipping, delete any existing release directory, and ignore failure if not present - rm -rf release || true - unzip -o release.zip -d release - REVISION=$(jq -r '.["codeql-sha"]' release/codeml-automodel*/codeml-automodel-release.json) - echo "The latest codeml-automodel release specifies the codeql sha $REVISION" - # Check that REVISION is downstream from PREVIOUS_RELEASE_SHA - if ! git merge-base --is-ancestor "$PREVIOUS_RELEASE_SHA" "$REVISION"; then - echo "Error: The codeql version $REVISION is not downstream of the query-pack version $PREVIOUS_RELEASE_SHA" - exit 1 - fi - # Get the version of the codeql code specified by the codeml-automodel release - git checkout "$REVISION" -fi - -# Get the absolute path of the automodel repo -AUTOMODEL_ROOT="$(readlink -f "$(dirname $0)")" -# Get the absolute path of the workspace root -WORKSPACE_ROOT="$AUTOMODEL_ROOT/../../.." -# Specify the groups of queries to test and publish -GRPS="automodel,-test" - -# Install the codeql gh extension -gh extensions install github/gh-codeql - -pushd "$AUTOMODEL_ROOT" -echo Testing automodel queries -gh codeql test run test -popd - -pushd "$WORKSPACE_ROOT" -echo "Preparing the release" -gh codeql pack release --groups $GRPS -v - -if [ $DRY_RUN = 1 ]; then - echo "Dry run: not publishing the query pack" - gh codeql pack publish --groups $GRPS --dry-run -v -else - echo "Not a dry run! Publishing the query pack" - gh codeql pack publish --groups $GRPS -v -fi - -echo "Bumping versions" -gh codeql pack post-release --groups $GRPS -v -popd - -# The above commands update -# ./src/CHANGELOG.md -# ./src/codeql-pack.release.yml -# ./src/qlpack.yml -# and add a new file -# ./src/change-notes/released/.md - -# Get the filename of the most recently created file in ./src/change-notes/released/*.md -# This will be the file for the new release -NEW_CHANGE_NOTES_FILE=$(ls -t ./src/change-notes/released/*.md | head -n 1) - -# Make a copy of the modified files -mv ./src/CHANGELOG.md ./src/CHANGELOG.md.dry-run -mv ./src/codeql-pack.release.yml ./src/codeql-pack.release.yml.dry-run -mv ./src/qlpack.yml ./src/qlpack.yml.dry-run -mv "$NEW_CHANGE_NOTES_FILE" ./src/change-notes/released.md.dry-run - -if [ $OVERRIDE_RELEASE = 1 ]; then - # Restore the original files - git checkout ./src/CHANGELOG.md - git checkout ./src/codeql-pack.release.yml - git checkout ./src/qlpack.yml -else - # Restore the original files - git checkout "$CURRENT_BRANCH" --force -fi - -if [ $DRY_RUN = 1 ]; then - echo "Inspect the updated dry-run version files:" - ls -l ./src/*.dry-run - ls -l ./src/change-notes/*.dry-run -else - # Add the updated files to the current branch - echo "Adding the version changes" - mv -f ./src/CHANGELOG.md.dry-run ./src/CHANGELOG.md - mv -f ./src/codeql-pack.release.yml.dry-run ./src/codeql-pack.release.yml - mv -f ./src/qlpack.yml.dry-run ./src/qlpack.yml - mv -f ./src/change-notes/released.md.dry-run "$NEW_CHANGE_NOTES_FILE" - git add ./src/CHANGELOG.md - git add ./src/codeql-pack.release.yml - git add ./src/qlpack.yml - git add "$NEW_CHANGE_NOTES_FILE" - echo "Added the following updated version files to the current branch:" - git status -s - echo "To complete the release, please commit these files and merge to the main branch" -fi - -echo "Done" \ No newline at end of file diff --git a/java/ql/automodel/src/AutomodelAlertSinkUtil.qll b/java/ql/automodel/src/AutomodelAlertSinkUtil.qll deleted file mode 100644 index f20c8e57b6cc..000000000000 --- a/java/ql/automodel/src/AutomodelAlertSinkUtil.qll +++ /dev/null @@ -1,183 +0,0 @@ -private import java -private import semmle.code.java.dataflow.ExternalFlow as ExternalFlow -private import semmle.code.java.dataflow.TaintTracking -private import semmle.code.java.security.RequestForgeryConfig -private import semmle.code.java.security.CommandLineQuery -private import semmle.code.java.security.SqlConcatenatedQuery -private import semmle.code.java.security.SqlInjectionQuery -private import semmle.code.java.security.UrlRedirectQuery -private import semmle.code.java.security.TaintedPathQuery -private import semmle.code.java.security.SqlInjectionQuery -private import AutomodelJavaUtil - -private newtype TSinkModel = - MkSinkModel( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input, string kind, string provenance - ) { - ExternalFlow::sinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance, - _) - } - -class SinkModel extends TSinkModel { - string package; - string type; - boolean subtypes; - string name; - string signature; - string ext; - string input; - string kind; - string provenance; - - SinkModel() { - this = MkSinkModel(package, type, subtypes, name, signature, ext, input, kind, provenance) - } - - /** Gets the package for this sink model. */ - string getPackage() { result = package } - - /** Gets the type for this sink model. */ - string getType() { result = type } - - /** Gets whether this sink model considers subtypes. */ - boolean getSubtypes() { result = subtypes } - - /** Gets the name for this sink model. */ - string getName() { result = name } - - /** Gets the signature for this sink model. */ - string getSignature() { result = signature } - - /** Gets the input for this sink model. */ - string getInput() { result = input } - - /** Gets the extension for this sink model. */ - string getExt() { result = ext } - - /** Gets the kind for this sink model. */ - string getKind() { result = kind } - - /** Gets the provenance for this sink model. */ - string getProvenance() { result = provenance } - - /** Gets the number of instances of this sink model. */ - int getInstanceCount() { result = count(PotentialSinkModelExpr p | p.getSinkModel() = this) } - - /** Gets a string representation of this sink model. */ - string toString() { - result = - "SinkModel(" + package + ", " + type + ", " + subtypes + ", " + name + ", " + signature + ", " - + ext + ", " + input + ", " + kind + ", " + provenance + ")" - } - - /** Gets a string representation of this sink model as it would appear in a Models-as-Data file. */ - string getRepr() { - result = - "\"" + package + "\", \"" + type + "\", " + pyBool(subtypes) + ", \"" + name + "\", \"" + - signature + "\", \"" + ext + "\", \"" + input + "\", \"" + kind + "\", \"" + provenance + - "\"" - } -} - -/** An expression that may correspond to a sink model. */ -class PotentialSinkModelExpr extends Expr { - /** - * Holds if this expression has the given signature. The signature should contain enough - * information to determine a corresponding sink model, if one exists. - */ - pragma[nomagic] - predicate hasSignature( - string package, string type, boolean subtypes, string name, string signature, string input - ) { - exists(Call call, Callable callable, int argIdx | - call.getCallee().getSourceDeclaration() = callable and - ( - this = call.getArgument(argIdx) - or - this = call.getQualifier() and argIdx = -1 - ) and - (if argIdx = -1 then input = "Argument[this]" else input = "Argument[" + argIdx + "]") and - package = callable.getDeclaringType().getPackage().getName() and - type = callable.getDeclaringType().getErasure().(RefType).getNestedName() and - subtypes = considerSubtypes(callable) and - name = callable.getName() and - signature = ExternalFlow::paramsString(callable) - ) - } - - /** Gets a sink model that corresponds to this expression. */ - SinkModel getSinkModel() { - this.hasSignature(result.getPackage(), result.getType(), result.getSubtypes(), result.getName(), - result.getSignature(), result.getInput()) - } -} - -private string pyBool(boolean b) { - b = true and result = "True" - or - b = false and result = "False" -} - -/** - * Gets a string representation of the existing sink model at the expression `e`, in the format in - * which it would appear in a Models-as-Data file. Also restricts the provenance of the sink model - * to be `ai-generated`. - */ -string getSinkModelRepr(PotentialSinkModelExpr e) { - result = e.getSinkModel().getRepr() and - e.getSinkModel().getProvenance() = "ai-generated" -} - -/** - * Gets the string representation of a sink model in a format suitable for appending to an alert - * message. - */ -string getSinkModelQueryRepr(PotentialSinkModelExpr e) { - result = "\nsinkModel: " + getSinkModelRepr(e) -} - -/** - * A parameterised module that takes a dataflow config, and exposes a predicate for counting the - * number of AI-generated sink models that appear in alerts for that query. - */ -private module SinkTallier { - module ConfigFlow = TaintTracking::Global; - - predicate getSinkModelCount(int c, SinkModel s) { - s = any(ConfigFlow::PathNode sink).getNode().asExpr().(PotentialSinkModelExpr).getSinkModel() and - c = - strictcount(ConfigFlow::PathNode sink | - ConfigFlow::flowPath(_, sink) and - s = sink.getNode().asExpr().(PotentialSinkModelExpr).getSinkModel() - ) - } -} - -predicate sinkModelTallyPerQuery(string queryName, int alertCount, SinkModel sinkModel) { - queryName = "java/request-forgery" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/command-line-injection" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/concatenated-sql-query" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/ssrf" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/path-injection" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/unvalidated-url-redirection" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) - or - queryName = "java/sql-injection" and - SinkTallier::getSinkModelCount(alertCount, sinkModel) -} - -predicate sinkModelTally(int alertCount, SinkModel sinkModel) { - sinkModelTallyPerQuery(_, _, sinkModel) and - alertCount = sum(int c | sinkModelTallyPerQuery(_, c, sinkModel)) -} diff --git a/java/ql/automodel/src/AutomodelAlertSinks.ql b/java/ql/automodel/src/AutomodelAlertSinks.ql deleted file mode 100644 index e9af51b4d637..000000000000 --- a/java/ql/automodel/src/AutomodelAlertSinks.ql +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @name Number of alerts per sink model - * @description Counts the number of alerts using `ai-generated` sink models. - * @kind table - * @id java/ml/metrics-count-alerts-per-sink-model - * @tags internal automodel metrics - */ - -private import java -private import AutomodelAlertSinkUtil - -from int alertCount, SinkModel s -where sinkModelTally(alertCount, s) and s.getProvenance() = "ai-generated" -select alertCount, s.getPackage() as package, s.getType() as type, s.getSubtypes() as subtypes, - s.getName() as name, s.getSignature() as signature, s.getInput() as input, s.getExt() as ext, - s.getKind() as kind, s.getProvenance() as provenance order by alertCount desc diff --git a/java/ql/automodel/src/AutomodelAlertSinksPerQuery.ql b/java/ql/automodel/src/AutomodelAlertSinksPerQuery.ql deleted file mode 100644 index 64a5038d1166..000000000000 --- a/java/ql/automodel/src/AutomodelAlertSinksPerQuery.ql +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @name Number of alerts per sink model and query - * @description Counts the number of alerts per query using `ai-generated` sink models. - * @kind table - * @id java/ml/metrics-count-alerts-per-sink-model-and-query - * @tags internal automodel metrics - */ - -private import java -private import AutomodelAlertSinkUtil - -from string queryId, int alertCount, SinkModel s -where - sinkModelTallyPerQuery(queryId, alertCount, s) and - s.getProvenance() = "ai-generated" -select queryId, alertCount, s.getPackage() as package, s.getType() as type, - s.getSubtypes() as subtypes, s.getName() as name, s.getSignature() as signature, - s.getInput() as input, s.getExt() as ext, s.getKind() as kind, s.getProvenance() as provenance - order by queryId, alertCount desc diff --git a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll b/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll deleted file mode 100644 index 750d776891f3..000000000000 --- a/java/ql/automodel/src/AutomodelApplicationModeCharacteristics.qll +++ /dev/null @@ -1,677 +0,0 @@ -/** - * For internal use only. - */ - -private import java -private import semmle.code.Location as Location -private import semmle.code.java.dataflow.DataFlow -private import semmle.code.java.dataflow.TaintTracking -private import semmle.code.java.dataflow.ExternalFlow as ExternalFlow -private import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl -private import semmle.code.java.security.ExternalAPIs as ExternalAPIs -private import semmle.code.java.Expr as Expr -private import semmle.code.java.security.QueryInjection -private import semmle.code.java.dataflow.internal.ModelExclusions as ModelExclusions -private import AutomodelJavaUtil as AutomodelJavaUtil -private import semmle.code.java.security.PathSanitizer as PathSanitizer -import AutomodelSharedCharacteristics as SharedCharacteristics -import AutomodelEndpointTypes as AutomodelEndpointTypes - -newtype JavaRelatedLocationType = - CallContext() or - MethodDoc() or - ClassDoc() - -newtype TApplicationModeEndpoint = - TExplicitArgument(Call call, DataFlow::Node arg) { - AutomodelJavaUtil::isFromSource(call) and - exists(Argument argExpr | - arg.asExpr() = argExpr and call = argExpr.getCall() and not argExpr.isVararg() - ) and - not AutomodelJavaUtil::isUnexploitableType(arg.getType()) - } or - TInstanceArgument(Call call, DataFlow::Node arg) { - AutomodelJavaUtil::isFromSource(call) and - arg = DataFlow::getInstanceArgument(call) and - not call instanceof ConstructorCall and - not AutomodelJavaUtil::isUnexploitableType(arg.getType()) - } or - TImplicitVarargsArray(Call call, DataFlow::ImplicitVarargsArray arg, int idx) { - AutomodelJavaUtil::isFromSource(call) and - call = arg.getCall() and - idx = call.getCallee().getVaragsParameterIndex() and - not AutomodelJavaUtil::isUnexploitableType(arg.getType()) - } or - TMethodReturnValue(MethodCall call) { - AutomodelJavaUtil::isFromSource(call) and - not AutomodelJavaUtil::isUnexploitableType(call.getType()) - } or - TOverriddenParameter(Parameter p, Method overriddenMethod) { - AutomodelJavaUtil::isFromSource(p) and - p.getCallable().(Method).overrides(overriddenMethod) - } - -/** - * An endpoint is a node that is a candidate for modeling. - */ -abstract private class ApplicationModeEndpoint extends TApplicationModeEndpoint { - /** - * Gets the callable to be modeled that this endpoint represents. - */ - abstract Callable getCallable(); - - /** - * Gets the input (if any) for this endpoint, eg.: `Argument[0]`. - * - * For endpoints that are source candidates, this will be `none()`. - */ - abstract string getMaDInput(); - - /** - * Gets the output (if any) for this endpoint, eg.: `ReturnValue`. - * - * For endpoints that are sink candidates, this will be `none()`. - */ - abstract string getMaDOutput(); - - abstract Top asTop(); - - /** - * Converts the endpoint to a node that can be used in a data flow graph. - */ - abstract DataFlow::Node asNode(); - - string getExtensibleType() { - if not exists(this.getMaDInput()) and exists(this.getMaDOutput()) - then result = "sourceModel" - else - if exists(this.getMaDInput()) and not exists(this.getMaDOutput()) - then result = "sinkModel" - else none() // if both exist, it would be a summaryModel (not yet supported) - } - - abstract string toString(); -} - -class TCallArgument = TExplicitArgument or TInstanceArgument or TImplicitVarargsArray; - -/** - * An endpoint that represents an "argument" to a call in a broad sense, including - * both explicit arguments and the instance argument. - */ -abstract class CallArgument extends ApplicationModeEndpoint, TCallArgument { - Call call; - DataFlow::Node arg; - - override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } - - override string getMaDOutput() { none() } - - override DataFlow::Node asNode() { result = arg } - - Call getCall() { result = call } - - override string toString() { result = arg.toString() } -} - -/** - * An endpoint that represents an explicit argument to a call. - */ -class ExplicitArgument extends CallArgument, TExplicitArgument { - ExplicitArgument() { this = TExplicitArgument(call, arg) } - - private int getArgIndex() { this.asTop() = call.getArgument(result) } - - override string getMaDInput() { result = "Argument[" + this.getArgIndex() + "]" } - - override Top asTop() { result = arg.asExpr() } -} - -/** - * An endpoint that represents the instance argument to a call. - */ -class InstanceArgument extends CallArgument, TInstanceArgument { - InstanceArgument() { this = TInstanceArgument(call, arg) } - - override string getMaDInput() { result = "Argument[this]" } - - override Top asTop() { if exists(arg.asExpr()) then result = arg.asExpr() else result = call } - - override string toString() { result = arg.toString() } -} - -/** - * An endpoint that represents an implicit varargs array. - * We choose to represent the varargs array as a single endpoint, rather than as multiple endpoints. - * - * This avoids the problem of having to deal with redundant endpoints downstream. - * - * In order to be able to distinguish between varargs endpoints and regular endpoints, we export the `isVarargsArray` - * meta data field in the extraction queries. - */ -class ImplicitVarargsArray extends CallArgument, TImplicitVarargsArray { - int idx; - - ImplicitVarargsArray() { this = TImplicitVarargsArray(call, arg, idx) } - - override string getMaDInput() { result = "Argument[" + idx + "]" } - - override Top asTop() { result = call } -} - -/** - * An endpoint that represents a method call. The `ReturnValue` of a method call - * may be a source. - */ -class MethodReturnValue extends ApplicationModeEndpoint, TMethodReturnValue { - MethodCall call; - - MethodReturnValue() { this = TMethodReturnValue(call) } - - override Callable getCallable() { result = call.getCallee().getSourceDeclaration() } - - override string getMaDInput() { none() } - - override string getMaDOutput() { result = "ReturnValue" } - - override Top asTop() { result = call } - - override DataFlow::Node asNode() { result.asExpr() = call } - - override string toString() { result = call.toString() } -} - -/** - * An endpoint that represents a parameter of an overridden method that may be - * a source. - */ -class OverriddenParameter extends ApplicationModeEndpoint, TOverriddenParameter { - Parameter p; - Method overriddenMethod; - - OverriddenParameter() { this = TOverriddenParameter(p, overriddenMethod) } - - override Callable getCallable() { - // NB: we're returning the overridden callable here. This means that the - // candidate model will be about the overridden method, not the overriding - // method. This is a more general model, that also applies to other - // subclasses of the overridden class. - result = overriddenMethod.getSourceDeclaration() - } - - private int getArgIndex() { p.getCallable().getParameter(result) = p } - - override string getMaDInput() { none() } - - override string getMaDOutput() { result = "Parameter[" + this.getArgIndex() + "]" } - - override Top asTop() { result = p } - - override DataFlow::Node asNode() { result.(DataFlow::ParameterNode).asParameter() = p } - - override string toString() { result = p.toString() } -} - -/** - * A candidates implementation. - * - * Some important notes: - * - This mode is using arguments as endpoints. - * - We use the `CallContext` (the surrounding call expression) as related location. - */ -module ApplicationCandidatesImpl implements SharedCharacteristics::CandidateSig { - // for documentation of the implementations here, see the QLDoc in the CandidateSig signature module. - class Endpoint = ApplicationModeEndpoint; - - class EndpointType = AutomodelEndpointTypes::EndpointType; - - class SinkType = AutomodelEndpointTypes::SinkType; - - class SourceType = AutomodelEndpointTypes::SourceType; - - class RelatedLocation = Location::Top; - - class RelatedLocationType = JavaRelatedLocationType; - - // Sanitizers are currently not modeled in MaD. TODO: check if this has large negative impact. - predicate isSanitizer(Endpoint e, EndpointType t) { - exists(t) and - AutomodelJavaUtil::isUnexploitableType([ - // for most endpoints, we can get the type from the node - e.asNode().getType(), - // but not for calls to void methods, where we need to go via the AST - e.asTop().(Expr).getType() - ]) - or - t instanceof AutomodelEndpointTypes::PathInjectionSinkType and - e.asNode() instanceof PathSanitizer::PathInjectionSanitizer - } - - RelatedLocation asLocation(Endpoint e) { result = e.asTop() } - - predicate isKnownKind = AutomodelJavaUtil::isKnownKind/2; - - predicate isSink(Endpoint e, string kind, string provenance) { - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input - | - sinkSpec(e, package, type, subtypes, name, signature, ext, input) and - ExternalFlow::sinkModel(package, type, subtypes, name, [signature, ""], ext, input, kind, - provenance, _) - ) - or - isCustomSink(e, kind) and provenance = "custom-sink" - } - - predicate isSource(Endpoint e, string kind, string provenance) { - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string output - | - sourceSpec(e, package, type, subtypes, name, signature, ext, output) and - ExternalFlow::sourceModel(package, type, subtypes, name, [signature, ""], ext, output, kind, - provenance, _) - ) - } - - predicate isNeutral(Endpoint e) { - exists(string package, string type, string name, string signature, string endpointType | - sinkSpec(e, package, type, _, name, signature, _, _) and - endpointType = "sink" - or - sourceSpec(e, package, type, _, name, signature, _, _) and - endpointType = "source" - | - ExternalFlow::neutralModel(package, type, name, [signature, ""], endpointType, _) - ) - } - - /** - * Holds if the endpoint concerns a callable with the given package, type, name and signature. - * - * If `subtypes` is `false`, only the exact callable is considered. If `true`, the callable and - * all its overrides are considered. - */ - additional predicate endpointCallable( - Endpoint e, string package, string type, boolean subtypes, string name, string signature - ) { - exists(Callable c | - c = e.getCallable() and subtypes in [true, false] - or - e.getCallable().(Method).getSourceDeclaration().overrides+(c) and subtypes = true - | - c.hasQualifiedName(package, type, name) and - signature = ExternalFlow::paramsString(c) - ) - } - - additional predicate sinkSpec( - Endpoint e, string package, string type, boolean subtypes, string name, string signature, - string ext, string input - ) { - endpointCallable(e, package, type, subtypes, name, signature) and - ext = "" and - input = e.getMaDInput() - } - - additional predicate sourceSpec( - Endpoint e, string package, string type, boolean subtypes, string name, string signature, - string ext, string output - ) { - endpointCallable(e, package, type, subtypes, name, signature) and - ext = "" and - output = e.getMaDOutput() - } - - /** - * Gets the related location for the given endpoint. - * - * The only related location we model is the the call expression surrounding to - * which the endpoint is either argument or qualifier (known as the call context). - */ - RelatedLocation getRelatedLocation(Endpoint e, RelatedLocationType type) { - type = CallContext() and - result = e.(CallArgument).getCall() - or - type = MethodDoc() and - result = e.getCallable().(Documentable).getJavadoc() - or - type = ClassDoc() and - result = e.getCallable().getDeclaringType().(Documentable).getJavadoc() - } -} - -/** - * Contains endpoints that are defined in QL code rather than as a MaD model. Ideally this predicate - * should be empty. - */ -private predicate isCustomSink(Endpoint e, string kind) { - e.asNode() instanceof QueryInjectionSink and kind = "sql" -} - -module CharacteristicsImpl = - SharedCharacteristics::SharedCharacteristics; - -class EndpointCharacteristic = CharacteristicsImpl::EndpointCharacteristic; - -class Endpoint = ApplicationCandidatesImpl::Endpoint; - -/* - * Predicates that are used to surface prompt examples and candidates for classification with an ML model. - */ - -/** - * A MetadataExtractor that extracts metadata for application mode. - */ -class ApplicationModeMetadataExtractor extends string { - ApplicationModeMetadataExtractor() { this = "ApplicationModeMetadataExtractor" } - - predicate hasMetadata( - Endpoint e, string package, string type, string subtypes, string name, string signature, - string input, string output, string isVarargsArray, string alreadyAiModeled, - string extensibleType - ) { - exists(Callable callable | e.getCallable() = callable | - (if exists(e.getMaDInput()) then input = e.getMaDInput() else input = "") and - (if exists(e.getMaDOutput()) then output = e.getMaDOutput() else output = "") and - package = callable.getDeclaringType().getPackage().getName() and - // we're using the erased types because the MaD convention is to not specify type parameters. - // Whether something is or isn't a sink doesn't usually depend on the type parameters. - type = callable.getDeclaringType().getErasure().(RefType).getNestedName() and - subtypes = AutomodelJavaUtil::considerSubtypes(callable).toString() and - name = callable.getName() and - signature = ExternalFlow::paramsString(callable) and - ( - if e instanceof ImplicitVarargsArray - then isVarargsArray = "true" - else isVarargsArray = "false" - ) and - extensibleType = e.getExtensibleType() - ) and - ( - not CharacteristicsImpl::isModeled(e, _, extensibleType, _) and alreadyAiModeled = "" - or - CharacteristicsImpl::isModeled(e, _, extensibleType, alreadyAiModeled) - ) - } -} - -/** - * Holds if the given `endpoint` should be considered a candidate for the `extensibleType`. - * - * The other parameters record various other properties of interest. - */ -predicate isCandidate( - Endpoint endpoint, string package, string type, string subtypes, string name, string signature, - string input, string output, string isVarargs, string extensibleType, string alreadyAiModeled -) { - CharacteristicsImpl::isCandidate(endpoint, _) and - not exists(CharacteristicsImpl::UninterestingToModelCharacteristic u | - u.appliesToEndpoint(endpoint) - ) and - any(ApplicationModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, isVarargs, - alreadyAiModeled, extensibleType) and - // If a node is already modeled in MaD, we don't include it as a candidate. Otherwise, we might include it as a - // candidate for query A, but the model will label it as a sink for one of the sink types of query B, for which it's - // already a known sink. This would result in overlap between our detected sinks and the pre-existing modeling. We - // assume that, if a sink has already been modeled in a MaD model, then it doesn't belong to any additional sink - // types, and we don't need to reexamine it. - alreadyAiModeled.matches(["", "%ai-%"]) and - AutomodelJavaUtil::includeAutomodelCandidate(package, type, name, signature) -} - -/** - * Holds if the given `endpoint` is a negative example for the `extensibleType` - * because of the `characteristic`. - * - * The other parameters record various other properties of interest. - */ -predicate isNegativeExample( - Endpoint endpoint, EndpointCharacteristic characteristic, float confidence, string package, - string type, string subtypes, string name, string signature, string input, string output, - string isVarargsArray, string extensibleType -) { - characteristic.appliesToEndpoint(endpoint) and - // the node is known not to be an endpoint of any appropriate type - forall(AutomodelEndpointTypes::EndpointType tp | - tp = CharacteristicsImpl::getAPotentialType(endpoint) - | - characteristic.hasImplications(tp, false, _) - ) and - // the lowest confidence across all endpoint types should be at least highConfidence - confidence = - min(float c | - characteristic.hasImplications(CharacteristicsImpl::getAPotentialType(endpoint), false, c) - ) and - confidence >= SharedCharacteristics::highConfidence() and - any(ApplicationModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, - isVarargsArray, _, extensibleType) and - // It's valid for a node to be both a potential source/sanitizer and a sink. We don't want to include such nodes - // as negative examples in the prompt, because they're ambiguous and might confuse the model, so we explicitly exclude them here. - not exists(EndpointCharacteristic characteristic2, float confidence2 | - characteristic2 != characteristic - | - characteristic2.appliesToEndpoint(endpoint) and - confidence2 >= SharedCharacteristics::maximalConfidence() and - characteristic2 - .hasImplications(CharacteristicsImpl::getAPotentialType(endpoint), true, confidence2) - ) -} - -/** - * Holds if the given `endpoint` is a positive example for the `endpointType`. - * - * The other parameters record various other properties of interest. - */ -predicate isPositiveExample( - Endpoint endpoint, string endpointType, string package, string type, string subtypes, string name, - string signature, string input, string output, string isVarargsArray, string extensibleType -) { - any(ApplicationModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, - isVarargsArray, _, extensibleType) and - CharacteristicsImpl::isKnownAs(endpoint, endpointType, _) and - exists(CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext())) -} - -/* - * EndpointCharacteristic classes that are specific to Automodel for Java. - */ - -/** - * A negative characteristic that indicates that parameters of an is-style boolean method should not be considered sinks. - * - * A sink is highly unlikely to be exploitable if its callable's name starts with `is` and the callable has a boolean return - * type (e.g. `isDirectory`). These kinds of calls normally do only checks, and appear before the proper call that does - * the dangerous/interesting thing, so we want the latter to be modeled as the sink. - * - * TODO: this might filter too much, it's possible that methods with more than one parameter contain interesting sinks - */ -private class UnexploitableIsCharacteristic extends CharacteristicsImpl::NotASinkCharacteristic { - UnexploitableIsCharacteristic() { this = "argument of is-style boolean method" } - - override predicate appliesToEndpoint(Endpoint e) { - e.getCallable().getName().matches("is%") and - e.getCallable().getReturnType() instanceof BooleanType and - not ApplicationCandidatesImpl::isSink(e, _, _) - } -} - -/** - * A negative characteristic that indicates that parameters of an existence-checking boolean method should not be - * considered sinks. - * - * A sink is highly unlikely to be exploitable if its callable's name is `exists` or `notExists` and the callable has a - * boolean return type. These kinds of calls normally do only checks, and appear before the proper call that does the - * dangerous/interesting thing, so we want the latter to be modeled as the sink. - */ -private class UnexploitableExistsCharacteristic extends CharacteristicsImpl::NotASinkCharacteristic { - UnexploitableExistsCharacteristic() { this = "argument of existence-checking boolean method" } - - override predicate appliesToEndpoint(Endpoint e) { - exists(Callable callable | callable = e.getCallable() | - callable.getName().toLowerCase() = ["exists", "notexists"] and - callable.getReturnType() instanceof BooleanType - ) - } -} - -/** - * A negative characteristic that indicates that parameters of an exception method or constructor should not be considered sinks, - * and its return value should not be considered a source. - */ -private class ExceptionCharacteristic extends CharacteristicsImpl::NeitherSourceNorSinkCharacteristic -{ - ExceptionCharacteristic() { this = "argument/result of exception-related method" } - - override predicate appliesToEndpoint(Endpoint e) { - e.getCallable().getDeclaringType().getASupertype*() instanceof TypeThrowable and - ( - e.getExtensibleType() = "sinkModel" and - not ApplicationCandidatesImpl::isSink(e, _, _) - or - e.getExtensibleType() = "sourceModel" and - not ApplicationCandidatesImpl::isSource(e, _, _) and - e.getMaDOutput() = "ReturnValue" - ) - } -} - -/** - * A negative characteristic that indicates that an endpoint is a MaD taint step. MaD modeled taint steps are global, - * so they are not sinks for any query. Non-MaD taint steps might be specific to a particular query, so we don't - * filter those out. - */ -private class IsMaDTaintStepCharacteristic extends CharacteristicsImpl::NotASinkCharacteristic { - IsMaDTaintStepCharacteristic() { this = "taint step" } - - override predicate appliesToEndpoint(Endpoint e) { - FlowSummaryImpl::Private::Steps::summaryThroughStepValue(e.asNode(), _, _) - or - FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(e.asNode(), _, _) - or - FlowSummaryImpl::Private::Steps::summaryGetterStep(e.asNode(), _, _, _) - or - FlowSummaryImpl::Private::Steps::summarySetterStep(e.asNode(), _, _, _) - } -} - -/** - * A call to a method that's known locally will not be considered as a candidate to model. - * - * The reason is that we would expect data/taint flow into the method implementation to uncover - * any sinks that are present there. - */ -private class LocalCall extends CharacteristicsImpl::UninterestingToModelCharacteristic { - LocalCall() { this = "local call" } - - override predicate appliesToEndpoint(Endpoint e) { - e.(CallArgument).getCallable().fromSource() - or - e.(MethodReturnValue).getCallable().fromSource() - } -} - -/** - * A characteristic that marks endpoints as uninteresting to model, according to the Java ModelExclusions module. - */ -private class ExcludedFromModeling extends CharacteristicsImpl::UninterestingToModelCharacteristic { - ExcludedFromModeling() { this = "excluded from modeling" } - - override predicate appliesToEndpoint(Endpoint e) { - ModelExclusions::isUninterestingForModels(e.getCallable()) - } -} - -/** - * A negative characteristic that filters out non-public methods. Non-public methods are not interesting to include in - * the standard Java modeling, because they cannot be called from outside the package. - */ -private class NonPublicMethodCharacteristic extends CharacteristicsImpl::UninterestingToModelCharacteristic -{ - NonPublicMethodCharacteristic() { this = "non-public method" } - - override predicate appliesToEndpoint(Endpoint e) { - exists(Callable c | c = e.getCallable() | not c.isPublic()) - } -} - -/** - * A negative characteristic that indicates that an endpoint is a non-sink argument to a method whose sinks have already - * been modeled _manually_. This is restricted to manual sinks only, because only during the manual process do we have - * the expectation that all sinks present in a method have been considered. - * - * WARNING: These endpoints should not be used as negative samples for training, because some sinks may have been missed - * when the method was modeled. Specifically, as we start using ATM to merge in new declarations, we can be less sure - * that a method with one argument modeled as a MaD sink has also had its remaining arguments manually reviewed. The - * ML model might have predicted argument 0 of some method to be a sink but not argument 1, when in fact argument 1 is - * also a sink. - */ -private class OtherArgumentToModeledMethodCharacteristic extends CharacteristicsImpl::LikelyNotASinkCharacteristic -{ - OtherArgumentToModeledMethodCharacteristic() { - this = "other argument to a method that has already been modeled manually" - } - - override predicate appliesToEndpoint(Endpoint e) { - not ApplicationCandidatesImpl::isSink(e, _, _) and - exists(CallArgument otherSink | - ApplicationCandidatesImpl::isSink(otherSink, _, "manual") and - e.(CallArgument).getCall() = otherSink.getCall() and - e != otherSink - ) - } -} - -/** - * Holds if the type of the given expression is annotated with `@FunctionalInterface`. - */ -predicate hasFunctionalInterfaceType(Expr e) { - exists(RefType tp | tp = e.getType().getErasure() | - tp.getAnAssociatedAnnotation().getType().hasQualifiedName("java.lang", "FunctionalInterface") - ) -} - -/** - * A characteristic that marks functional expression as likely not sinks. - * - * These expressions may well _contain_ sinks, but rarely are sinks themselves. - */ -private class FunctionValueCharacteristic extends CharacteristicsImpl::LikelyNotASinkCharacteristic { - FunctionValueCharacteristic() { this = "function value" } - - override predicate appliesToEndpoint(Endpoint e) { - exists(Expr expr | expr = e.asNode().asExpr() | - expr instanceof FunctionalExpr or hasFunctionalInterfaceType(expr) - ) - } -} - -/** - * A negative characteristic that indicates that an endpoint is not a `to` node for any known taint step. Such a node - * cannot be tainted, because taint can't flow into it. - * - * WARNING: These endpoints should not be used as negative samples for training, because they may include sinks for - * which our taint tracking modeling is incomplete. - */ -private class CannotBeTaintedCharacteristic extends CharacteristicsImpl::LikelyNotASinkCharacteristic -{ - CannotBeTaintedCharacteristic() { this = "cannot be tainted" } - - override predicate appliesToEndpoint(Endpoint e) { not this.isKnownOutNodeForStep(e) } - - /** - * Holds if the node `n` is known as the predecessor in a modeled flow step. - */ - private predicate isKnownOutNodeForStep(Endpoint e) { - e.asNode().asExpr() instanceof Call or // we just assume flow in that case - TaintTracking::localTaintStep(_, e.asNode()) or - FlowSummaryImpl::Private::Steps::summaryThroughStepValue(_, e.asNode(), _) or - FlowSummaryImpl::Private::Steps::summaryThroughStepTaint(_, e.asNode(), _) or - FlowSummaryImpl::Private::Steps::summaryGetterStep(_, _, e.asNode(), _) or - FlowSummaryImpl::Private::Steps::summarySetterStep(_, _, e.asNode(), _) - } -} diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql deleted file mode 100644 index a3fa8b9b46fa..000000000000 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractCandidates.ql +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Surfaces the endpoints that are not already known to be sinks, and are therefore used as candidates for - * classification with an ML model. - * - * Note: This query does not actually classify the endpoints using the model. - * - * @name Automodel candidates (application mode) - * @description A query to extract automodel candidates in application mode. - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-application-candidates - * @tags internal extract automodel application-mode candidates - */ - -import java -private import AutomodelApplicationModeCharacteristics -private import AutomodelJavaUtil - -/** - * Gets a sample of endpoints (of at most `limit` samples) with the given method signature. - * - * The main purpose of this helper predicate is to avoid selecting too many candidates, as this may - * cause the SARIF file to exceed the maximum size limit. - */ -bindingset[limit] -private Endpoint getSampleForSignature( - int limit, string package, string type, string subtypes, string name, string signature, - string input, string output, string isVarargs, string extensibleType, string alreadyAiModeled -) { - exists(int n, int num_endpoints, ApplicationModeMetadataExtractor meta | - num_endpoints = - count(Endpoint e | - meta.hasMetadata(e, package, type, subtypes, name, signature, input, output, isVarargs, - alreadyAiModeled, extensibleType) - ) - | - result = - rank[n](Endpoint e, Location loc | - loc = e.asTop().getLocation() and - meta.hasMetadata(e, package, type, subtypes, name, signature, input, output, isVarargs, - alreadyAiModeled, extensibleType) - | - e - order by - loc.getFile().getAbsolutePath(), loc.getStartLine(), loc.getStartColumn(), - loc.getEndLine(), loc.getEndColumn() - ) and - // To avoid selecting samples that are too close together (as the ranking above goes by file - // path first), we select `limit` evenly spaced samples from the ranked list of endpoints. By - // default this would always include the first sample, so we add a random-chosen prime offset - // to the first sample index, and reduce modulo the number of endpoints. - // Finally, we add 1 to the result, as ranking results in a 1-indexed relation. - n = 1 + (([0 .. limit - 1] * (num_endpoints / limit).floor() + 46337) % num_endpoints) - ) -} - -from - Endpoint endpoint, DollarAtString package, DollarAtString type, DollarAtString subtypes, - DollarAtString name, DollarAtString signature, DollarAtString input, DollarAtString output, - DollarAtString isVarargsArray, DollarAtString alreadyAiModeled, DollarAtString extensibleType -where - isCandidate(endpoint, package, type, subtypes, name, signature, input, output, isVarargsArray, - extensibleType, alreadyAiModeled) and - endpoint = - getSampleForSignature(9, package, type, subtypes, name, signature, input, output, - isVarargsArray, extensibleType, alreadyAiModeled) -select endpoint.asNode(), - "Related locations: $@, $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // method name - signature, "signature", // - input, "input", // - output, "output", // - isVarargsArray, "isVarargsArray", // - alreadyAiModeled, "alreadyAiModeled", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql deleted file mode 100644 index a399c413fa4a..000000000000 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractNegativeExamples.ql +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Surfaces endpoints that are non-sinks with high confidence, for use as negative examples in the prompt. - * - * @name Negative examples (application mode) - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-application-negative-examples - * @tags internal extract automodel application-mode negative examples - */ - -private import java -private import AutomodelApplicationModeCharacteristics -private import AutomodelEndpointTypes -private import AutomodelJavaUtil - -/** - * Gets a sample of endpoints (of at most `limit` samples) for which the given characteristic applies. - * - * The main purpose of this helper predicate is to avoid selecting too many samples, as this may - * cause the SARIF file to exceed the maximum size limit. - */ -bindingset[limit] -Endpoint getSampleForCharacteristic(EndpointCharacteristic c, int limit) { - exists(int n, int num_endpoints | num_endpoints = count(Endpoint e | c.appliesToEndpoint(e)) | - result = - rank[n](Endpoint e, Location loc | - loc = e.asTop().getLocation() and c.appliesToEndpoint(e) - | - e - order by - loc.getFile().getAbsolutePath(), loc.getStartLine(), loc.getStartColumn(), - loc.getEndLine(), loc.getEndColumn() - ) and - // To avoid selecting samples that are too close together (as the ranking above goes by file - // path first), we select `limit` evenly spaced samples from the ranked list of endpoints. By - // default this would always include the first sample, so we add a random-chosen prime offset - // to the first sample index, and reduce modulo the number of endpoints. - // Finally, we add 1 to the result, as ranking results in a 1-indexed relation. - n = 1 + (([0 .. limit - 1] * (num_endpoints / limit).floor() + 46337) % num_endpoints) - ) -} - -from - Endpoint endpoint, EndpointCharacteristic characteristic, float confidence, string message, - DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, - DollarAtString signature, DollarAtString input, DollarAtString output, - DollarAtString isVarargsArray, DollarAtString extensibleType -where - endpoint = getSampleForCharacteristic(characteristic, 100) and - isNegativeExample(endpoint, characteristic, confidence, package, type, subtypes, name, signature, - input, output, isVarargsArray, extensibleType) and - message = characteristic -select endpoint.asNode(), - message + "\nrelated locations: $@, $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // - signature, "signature", // - input, "input", // - output, "output", // - isVarargsArray, "isVarargsArray", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql b/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql deleted file mode 100644 index faf49b73fc14..000000000000 --- a/java/ql/automodel/src/AutomodelApplicationModeExtractPositiveExamples.ql +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Surfaces endpoints that are sinks with high confidence, for use as positive examples in the prompt. - * - * @name Positive examples (application mode) - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-application-positive-examples - * @tags internal extract automodel application-mode positive examples - */ - -private import AutomodelApplicationModeCharacteristics -private import AutomodelEndpointTypes -private import AutomodelJavaUtil - -from - Endpoint endpoint, EndpointType endpointType, ApplicationModeMetadataExtractor meta, - DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, - DollarAtString signature, DollarAtString input, DollarAtString output, - DollarAtString isVarargsArray, DollarAtString extensibleType -where - isPositiveExample(endpoint, endpointType, package, type, subtypes, name, signature, input, output, - isVarargsArray, extensibleType) -select endpoint.asNode(), - endpointType + "\nrelated locations: $@, $@, $@." + - "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, CallContext()), "CallContext", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // - signature, "signature", // - input, "input", // - output, "output", // - isVarargsArray, "isVarargsArray", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelCandidateFilter.yml b/java/ql/automodel/src/AutomodelCandidateFilter.yml deleted file mode 100644 index c945ae3206fe..000000000000 --- a/java/ql/automodel/src/AutomodelCandidateFilter.yml +++ /dev/null @@ -1,5 +0,0 @@ -extensions: - - addsTo: - pack: codeql/java-automodel-queries - extensible: automodelCandidateFilter - data: [] diff --git a/java/ql/automodel/src/AutomodelCountGeneratedSinks.ql b/java/ql/automodel/src/AutomodelCountGeneratedSinks.ql deleted file mode 100644 index 475e3753810b..000000000000 --- a/java/ql/automodel/src/AutomodelCountGeneratedSinks.ql +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @name Number of instances of each sink model - * @description Counts the number of instances of `ai-generated` sink models. - * @kind table - * @id java/ml/metrics-count-instances-per-sink-model - * @tags internal automodel metrics - */ - -private import java -private import AutomodelAlertSinkUtil - -from int instanceCount, SinkModel s -where - instanceCount = s.getInstanceCount() and - instanceCount > 0 and - s.getProvenance() = "ai-generated" -select instanceCount, s.getPackage() as package, s.getType() as type, s.getSubtypes() as subtypes, - s.getName() as name, s.getSignature() as signature, s.getInput() as input, s.getExt() as ext, - s.getKind() as kind, s.getProvenance() as provenance order by instanceCount desc diff --git a/java/ql/automodel/src/AutomodelEndpointTypes.qll b/java/ql/automodel/src/AutomodelEndpointTypes.qll deleted file mode 100644 index f4f7bc8eb7b0..000000000000 --- a/java/ql/automodel/src/AutomodelEndpointTypes.qll +++ /dev/null @@ -1,82 +0,0 @@ -/** - * For internal use only. - * - * Defines the set of classes that endpoint scoring models can predict. Endpoint scoring models must - * only predict classes defined within this file. This file is the source of truth for the integer - * representation of each of these classes. - */ - -/** A class that can be predicted by a classifier. */ -abstract class EndpointType extends string { - /** - * Holds when the string matches the name of the sink / source type. - */ - bindingset[this] - EndpointType() { any() } - - /** - * Gets the name of the sink/source kind for this endpoint type as used in models-as-data. - * - * See https://github.com/github/codeql/blob/44213f0144fdd54bb679ca48d68b28dcf820f7a8/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll#LL353C11-L357C31 - * for sink types, and https://github.com/github/codeql/blob/44213f0144fdd54bb679ca48d68b28dcf820f7a8/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll#L365 - * for source types. - */ - final string getKind() { result = this } -} - -/** A class for sink types that can be predicted by a classifier. */ -abstract class SinkType extends EndpointType { - bindingset[this] - SinkType() { any() } -} - -/** A sink relevant to the SQL injection query */ -class SqlInjectionSinkType extends SinkType { - SqlInjectionSinkType() { this = "sql-injection" } -} - -/** A sink relevant to the tainted path injection query. */ -class PathInjectionSinkType extends SinkType { - PathInjectionSinkType() { this = "path-injection" } -} - -/** A sink relevant to the SSRF query. */ -class RequestForgerySinkType extends SinkType { - RequestForgerySinkType() { this = "request-forgery" } -} - -/** A sink relevant to the command injection query. */ -class CommandInjectionSinkType extends SinkType { - CommandInjectionSinkType() { this = "command-injection" } -} - -/** A sink relevant to file storage. */ -class FileContentStoreSinkType extends SinkType { - FileContentStoreSinkType() { this = "file-content-store" } -} - -/** A sink relevant to HTML injection. */ -class HtmlInjectionSinkType extends SinkType { - HtmlInjectionSinkType() { this = "html-injection" } -} - -/** A sink relevant to LDAP injection. */ -class LdapInjectionSinkType extends SinkType { - LdapInjectionSinkType() { this = "ldap-injection" } -} - -/** A sink relevant to URL redirection. */ -class UrlRedirectionSinkType extends SinkType { - UrlRedirectionSinkType() { this = "url-redirection" } -} - -/** A class for source types that can be predicted by a classifier. */ -abstract class SourceType extends EndpointType { - bindingset[this] - SourceType() { any() } -} - -/** A source of remote data. */ -class RemoteSourceType extends SourceType { - RemoteSourceType() { this = "remote" } -} diff --git a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll b/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll deleted file mode 100644 index 7f385a41d1ea..000000000000 --- a/java/ql/automodel/src/AutomodelFrameworkModeCharacteristics.qll +++ /dev/null @@ -1,507 +0,0 @@ -/** - * For internal use only. - */ - -private import java -private import semmle.code.Location as Location -private import semmle.code.java.dataflow.DataFlow -private import semmle.code.java.dataflow.TaintTracking -private import semmle.code.java.dataflow.ExternalFlow as ExternalFlow -private import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl -private import semmle.code.java.security.ExternalAPIs as ExternalAPIs -private import semmle.code.java.Expr as Expr -private import semmle.code.java.security.QueryInjection -private import semmle.code.java.security.RequestForgery -private import semmle.code.java.dataflow.internal.ModelExclusions as ModelExclusions -private import AutomodelJavaUtil as AutomodelJavaUtil -import AutomodelSharedCharacteristics as SharedCharacteristics -import AutomodelEndpointTypes as AutomodelEndpointTypes - -newtype JavaRelatedLocationType = - MethodDoc() or - ClassDoc() - -newtype TFrameworkModeEndpoint = - TExplicitParameter(Parameter p) { - AutomodelJavaUtil::isFromSource(p) and - not AutomodelJavaUtil::isUnexploitableType(p.getType()) - } or - TQualifier(Callable c) { AutomodelJavaUtil::isFromSource(c) and not c instanceof Constructor } or - TReturnValue(Callable c) { - AutomodelJavaUtil::isFromSource(c) and - c instanceof Constructor - or - AutomodelJavaUtil::isFromSource(c) and - c instanceof Method and - not AutomodelJavaUtil::isUnexploitableType(c.getReturnType()) - } or - TOverridableParameter(Method m, Parameter p) { - AutomodelJavaUtil::isFromSource(p) and - not AutomodelJavaUtil::isUnexploitableType(p.getType()) and - p.getCallable() = m and - m instanceof ModelExclusions::ModelApi and - AutomodelJavaUtil::isOverridable(m) - } or - TOverridableQualifier(Method m) { - AutomodelJavaUtil::isFromSource(m) and - m instanceof ModelExclusions::ModelApi and - AutomodelJavaUtil::isOverridable(m) - } - -/** - * A framework mode endpoint. - */ -abstract class FrameworkModeEndpoint extends TFrameworkModeEndpoint { - /** - * Gets the input (if any) for this endpoint, eg.: `Argument[0]`. - * - * For endpoints that are source candidates, this will be `none()`. - */ - abstract string getMaDInput(); - - /** - * Gets the output (if any) for this endpoint, eg.: `ReturnValue`. - * - * For endpoints that are sink candidates, this will be `none()`. - */ - abstract string getMaDOutput(); - - /** - * Returns the name of the parameter of the endpoint. - */ - abstract string getParamName(); - - /** - * Returns the callable that contains the endpoint. - */ - abstract Callable getCallable(); - - abstract Top asTop(); - - abstract string getExtensibleType(); - - string toString() { result = this.asTop().toString() } - - Location getLocation() { result = this.asTop().getLocation() } -} - -class ExplicitParameterEndpoint extends FrameworkModeEndpoint, TExplicitParameter { - Parameter param; - - ExplicitParameterEndpoint() { this = TExplicitParameter(param) and param.fromSource() } - - override string getMaDInput() { result = "Argument[" + param.getPosition() + "]" } - - override string getMaDOutput() { none() } - - override string getParamName() { result = param.getName() } - - override Callable getCallable() { result = param.getCallable() } - - override Top asTop() { result = param } - - override string getExtensibleType() { result = "sinkModel" } -} - -class QualifierEndpoint extends FrameworkModeEndpoint, TQualifier { - Callable callable; - - QualifierEndpoint() { - this = TQualifier(callable) and not callable.isStatic() and callable.fromSource() - } - - override string getMaDInput() { result = "Argument[this]" } - - override string getMaDOutput() { none() } - - override string getParamName() { result = "this" } - - override Callable getCallable() { result = callable } - - override Top asTop() { result = callable } - - override string getExtensibleType() { result = "sinkModel" } -} - -class ReturnValue extends FrameworkModeEndpoint, TReturnValue { - Callable callable; - - ReturnValue() { this = TReturnValue(callable) and callable.fromSource() } - - override string getMaDInput() { none() } - - override string getMaDOutput() { result = "ReturnValue" } - - override string getParamName() { none() } - - override Callable getCallable() { result = callable } - - override Top asTop() { result = callable } - - override string getExtensibleType() { result = "sourceModel" } -} - -class OverridableParameter extends FrameworkModeEndpoint, TOverridableParameter { - Method method; - Parameter param; - - OverridableParameter() { this = TOverridableParameter(method, param) } - - override string getMaDInput() { none() } - - override string getMaDOutput() { result = "Parameter[" + param.getPosition() + "]" } - - override string getParamName() { result = param.getName() } - - override Callable getCallable() { result = method } - - override Top asTop() { result = param } - - override string getExtensibleType() { result = "sourceModel" } -} - -class OverridableQualifier extends FrameworkModeEndpoint, TOverridableQualifier { - Method m; - - OverridableQualifier() { this = TOverridableQualifier(m) } - - override string getMaDInput() { none() } - - override string getMaDOutput() { result = "Parameter[this]" } - - override string getParamName() { result = "this" } - - override Callable getCallable() { result = m } - - override Top asTop() { result = m } - - override string getExtensibleType() { result = "sourceModel" } -} - -/** - * A candidates implementation for framework mode. - * - * Some important notes: - * - This mode is using parameters as endpoints. - * - Sink- and neutral-information is being used from MaD models. - * - When available, we use method- and class-java-docs as related locations. - */ -module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig { - // for documentation of the implementations here, see the QLDoc in the CandidateSig signature module. - class Endpoint = FrameworkModeEndpoint; - - class EndpointType = AutomodelEndpointTypes::EndpointType; - - class SinkType = AutomodelEndpointTypes::SinkType; - - class SourceType = AutomodelEndpointTypes::SourceType; - - class RelatedLocation = Location::Top; - - class RelatedLocationType = JavaRelatedLocationType; - - // Sanitizers are currently not modeled in MaD. TODO: check if this has large negative impact. - predicate isSanitizer(Endpoint e, EndpointType t) { none() } - - RelatedLocation asLocation(Endpoint e) { result = e.asTop() } - - predicate isKnownKind = AutomodelJavaUtil::isKnownKind/2; - - predicate isSink(Endpoint e, string kind, string provenance) { - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string input - | - sinkSpec(e, package, type, subtypes, name, signature, ext, input) and - ExternalFlow::sinkModel(package, type, subtypes, name, [signature, ""], ext, input, kind, - provenance, _) - ) - } - - predicate isSource(Endpoint e, string kind, string provenance) { - exists( - string package, string type, boolean subtypes, string name, string signature, string ext, - string output - | - sourceSpec(e, package, type, subtypes, name, signature, ext, output) and - ExternalFlow::sourceModel(package, type, subtypes, name, [signature, ""], ext, output, kind, - provenance, _) - ) - } - - predicate isNeutral(Endpoint e) { - exists(string package, string type, string name, string signature, string endpointType | - sinkSpec(e, package, type, _, name, signature, _, _) and - endpointType = "sink" - or - sourceSpec(e, package, type, _, name, signature, _, _) and - endpointType = "source" - | - ExternalFlow::neutralModel(package, type, name, [signature, ""], endpointType, _) - ) - } - - /** - * Holds if the endpoint concerns a callable with the given package, type, name and signature. - * - * If `subtypes` is `false`, only the exact callable is considered. If `true`, the callable and - * all its overrides are considered. - */ - additional predicate endpointCallable( - Endpoint e, string package, string type, boolean subtypes, string name, string signature - ) { - exists(Callable c | - c = e.getCallable() and subtypes in [true, false] - or - e.getCallable().(Method).getSourceDeclaration().overrides+(c) and subtypes = true - | - c.hasQualifiedName(package, type, name) and - signature = ExternalFlow::paramsString(c) - ) - } - - additional predicate sinkSpec( - Endpoint e, string package, string type, boolean subtypes, string name, string signature, - string ext, string input - ) { - endpointCallable(e, package, type, subtypes, name, signature) and - ext = "" and - input = e.getMaDInput() - } - - additional predicate sourceSpec( - Endpoint e, string package, string type, boolean subtypes, string name, string signature, - string ext, string output - ) { - endpointCallable(e, package, type, subtypes, name, signature) and - ext = "" and - output = e.getMaDOutput() - } - - /** - * Gets the related location for the given endpoint. - * - * Related locations can be JavaDoc comments of the class or the method. - */ - RelatedLocation getRelatedLocation(Endpoint e, RelatedLocationType type) { - type = MethodDoc() and - result = e.getCallable().(Documentable).getJavadoc() - or - type = ClassDoc() and - result = e.getCallable().getDeclaringType().(Documentable).getJavadoc() - } -} - -module CharacteristicsImpl = SharedCharacteristics::SharedCharacteristics; - -class EndpointCharacteristic = CharacteristicsImpl::EndpointCharacteristic; - -class Endpoint = FrameworkCandidatesImpl::Endpoint; - -/* - * Predicates that are used to surface prompt examples and candidates for classification with an ML model. - */ - -/** - * A MetadataExtractor that extracts metadata for framework mode. - */ -class FrameworkModeMetadataExtractor extends string { - FrameworkModeMetadataExtractor() { this = "FrameworkModeMetadataExtractor" } - - predicate hasMetadata( - Endpoint e, string package, string type, string subtypes, string name, string signature, - string input, string output, string parameterName, string alreadyAiModeled, - string extensibleType - ) { - exists(Callable callable | e.getCallable() = callable | - (if exists(e.getMaDInput()) then input = e.getMaDInput() else input = "") and - (if exists(e.getMaDOutput()) then output = e.getMaDOutput() else output = "") and - package = callable.getDeclaringType().getPackage().getName() and - // we're using the erased types because the MaD convention is to not specify type parameters. - // Whether something is or isn't a sink doesn't usually depend on the type parameters. - type = callable.getDeclaringType().getErasure().(RefType).getNestedName() and - subtypes = AutomodelJavaUtil::considerSubtypes(callable).toString() and - name = callable.getName() and - signature = ExternalFlow::paramsString(callable) and - (if exists(e.getParamName()) then parameterName = e.getParamName() else parameterName = "") and - e.getExtensibleType() = extensibleType - ) and - ( - not CharacteristicsImpl::isModeled(e, _, extensibleType, _) and alreadyAiModeled = "" - or - CharacteristicsImpl::isModeled(e, _, extensibleType, alreadyAiModeled) - ) - } -} - -/** - * Holds if the given `endpoint` should be considered a candidate for the `extensibleType`. - * - * The other parameters record various other properties of interest. - */ -predicate isCandidate( - Endpoint endpoint, string package, string type, string subtypes, string name, string signature, - string input, string output, string parameterName, string extensibleType, string alreadyAiModeled -) { - CharacteristicsImpl::isCandidate(endpoint, _) and - not exists(CharacteristicsImpl::UninterestingToModelCharacteristic u | - u.appliesToEndpoint(endpoint) - ) and - any(FrameworkModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, parameterName, - alreadyAiModeled, extensibleType) and - // If a node is already modeled in MaD, we don't include it as a candidate. Otherwise, we might include it as a - // candidate for query A, but the model will label it as a sink for one of the sink types of query B, for which it's - // already a known sink. This would result in overlap between our detected sinks and the pre-existing modeling. We - // assume that, if a sink has already been modeled in a MaD model, then it doesn't belong to any additional sink - // types, and we don't need to reexamine it. - alreadyAiModeled.matches(["", "%ai-%"]) and - AutomodelJavaUtil::includeAutomodelCandidate(package, type, name, signature) -} - -/** - * Holds if the given `endpoint` is a negative example for the `extensibleType` - * because of the `characteristic`. - * - * The other parameters record various other properties of interest. - */ -predicate isNegativeExample( - Endpoint endpoint, EndpointCharacteristic characteristic, float confidence, string package, - string type, string subtypes, string name, string signature, string input, string output, - string parameterName, string extensibleType -) { - characteristic.appliesToEndpoint(endpoint) and - // the node is known not to be an endpoint of any appropriate type - forall(AutomodelEndpointTypes::EndpointType tp | - tp = CharacteristicsImpl::getAPotentialType(endpoint) - | - characteristic.hasImplications(tp, false, _) - ) and - // the lowest confidence across all endpoint types should be at least highConfidence - confidence = - min(float c | - characteristic.hasImplications(CharacteristicsImpl::getAPotentialType(endpoint), false, c) - ) and - confidence >= SharedCharacteristics::highConfidence() and - any(FrameworkModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, parameterName, - _, extensibleType) and - // It's valid for a node to be both a potential source/sanitizer and a sink. We don't want to include such nodes - // as negative examples in the prompt, because they're ambiguous and might confuse the model, so we explicitly exclude them here. - not exists(EndpointCharacteristic characteristic2, float confidence2 | - characteristic2 != characteristic - | - characteristic2.appliesToEndpoint(endpoint) and - confidence2 >= SharedCharacteristics::maximalConfidence() and - characteristic2 - .hasImplications(CharacteristicsImpl::getAPotentialType(endpoint), true, confidence2) - ) -} - -/** - * Holds if the given `endpoint` is a positive example for the `endpointType`. - * - * The other parameters record various other properties of interest. - */ -predicate isPositiveExample( - Endpoint endpoint, string endpointType, string package, string type, string subtypes, string name, - string signature, string input, string output, string parameterName, string extensibleType -) { - any(FrameworkModeMetadataExtractor meta) - .hasMetadata(endpoint, package, type, subtypes, name, signature, input, output, parameterName, - _, extensibleType) and - CharacteristicsImpl::isKnownAs(endpoint, endpointType, _) -} - -/* - * EndpointCharacteristic classes that are specific to Automodel for Java. - */ - -/** - * A negative characteristic that indicates that parameters of an is-style boolean method should not be considered sinks, - * and its return value should not be considered a source. - * - * A sink is highly unlikely to be exploitable if its callable's name starts with `is` and the callable has a boolean return - * type (e.g. `isDirectory`). These kinds of calls normally do only checks, and appear before the proper call that does - * the dangerous/interesting thing, so we want the latter to be modeled as the sink. - * - * TODO: this might filter too much, it's possible that methods with more than one parameter contain interesting sinks - */ -private class UnexploitableIsCharacteristic extends CharacteristicsImpl::NeitherSourceNorSinkCharacteristic -{ - UnexploitableIsCharacteristic() { this = "argument of is-style boolean method" } - - override predicate appliesToEndpoint(Endpoint e) { - e.getCallable().getName().matches("is%") and - e.getCallable().getReturnType() instanceof BooleanType and - ( - e.getExtensibleType() = "sinkModel" and - not FrameworkCandidatesImpl::isSink(e, _, _) - or - e.getExtensibleType() = "sourceModel" and - not FrameworkCandidatesImpl::isSource(e, _, _) and - e.getMaDOutput() = "ReturnValue" - ) - } -} - -/** - * A negative characteristic that indicates that parameters of an existence-checking boolean method should not be - * considered sinks, and its return value should not be considered a source. - * - * A sink is highly unlikely to be exploitable if its callable's name is `exists` or `notExists` and the callable has a - * boolean return type. These kinds of calls normally do only checks, and appear before the proper call that does the - * dangerous/interesting thing, so we want the latter to be modeled as the sink. - */ -private class UnexploitableExistsCharacteristic extends CharacteristicsImpl::NeitherSourceNorSinkCharacteristic -{ - UnexploitableExistsCharacteristic() { this = "argument of existence-checking boolean method" } - - override predicate appliesToEndpoint(Endpoint e) { - exists(Callable callable | - callable = e.getCallable() and - callable.getName().toLowerCase() = ["exists", "notexists"] and - callable.getReturnType() instanceof BooleanType - | - e.getExtensibleType() = "sinkModel" and - not FrameworkCandidatesImpl::isSink(e, _, _) - or - e.getExtensibleType() = "sourceModel" and - not FrameworkCandidatesImpl::isSource(e, _, _) and - e.getMaDOutput() = "ReturnValue" - ) - } -} - -/** - * A negative characteristic that indicates that parameters of an exception method or constructor should not be considered sinks, - * and its return value should not be considered a source. - */ -private class ExceptionCharacteristic extends CharacteristicsImpl::NeitherSourceNorSinkCharacteristic -{ - ExceptionCharacteristic() { this = "argument/result of exception-related method" } - - override predicate appliesToEndpoint(Endpoint e) { - e.getCallable().getDeclaringType().getASupertype*() instanceof TypeThrowable and - ( - e.getExtensibleType() = "sinkModel" and - not FrameworkCandidatesImpl::isSink(e, _, _) - or - e.getExtensibleType() = "sourceModel" and - not FrameworkCandidatesImpl::isSource(e, _, _) and - e.getMaDOutput() = "ReturnValue" - ) - } -} - -/** - * A characteristic that limits candidates to parameters of methods that are recognized as `ModelApi`, iow., APIs that - * are considered worth modeling. - */ -private class NotAModelApi extends CharacteristicsImpl::UninterestingToModelCharacteristic { - NotAModelApi() { this = "not a model API" } - - override predicate appliesToEndpoint(Endpoint e) { - not e.getCallable() instanceof ModelExclusions::ModelApi - } -} diff --git a/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql b/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql deleted file mode 100644 index 83683b4e78f5..000000000000 --- a/java/ql/automodel/src/AutomodelFrameworkModeExtractCandidates.ql +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Surfaces the endpoints that are not already known to be sinks, and are therefore used as candidates for - * classification with an ML model. - * - * Note: This query does not actually classify the endpoints using the model. - * - * @name Automodel candidates (framework mode) - * @description A query to extract automodel candidates in framework mode. - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-framework-candidates - * @tags internal extract automodel framework-mode candidates - */ - -private import AutomodelFrameworkModeCharacteristics -private import AutomodelJavaUtil - -from - Endpoint endpoint, DollarAtString package, DollarAtString type, DollarAtString subtypes, - DollarAtString name, DollarAtString signature, DollarAtString input, DollarAtString output, - DollarAtString parameterName, DollarAtString alreadyAiModeled, DollarAtString extensibleType -where - isCandidate(endpoint, package, type, subtypes, name, signature, input, output, parameterName, - extensibleType, alreadyAiModeled) -select endpoint, - "Related locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // - signature, "signature", // - input, "input", // - output, "output", // - parameterName, "parameterName", // - alreadyAiModeled, "alreadyAiModeled", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelFrameworkModeExtractNegativeExamples.ql b/java/ql/automodel/src/AutomodelFrameworkModeExtractNegativeExamples.ql deleted file mode 100644 index 05e5951b0610..000000000000 --- a/java/ql/automodel/src/AutomodelFrameworkModeExtractNegativeExamples.ql +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Surfaces endpoints that are non-sinks with high confidence, for use as negative examples in the prompt. - * - * @name Negative examples (framework mode) - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-framework-negative-examples - * @tags internal extract automodel framework-mode negative examples - */ - -private import AutomodelFrameworkModeCharacteristics -private import AutomodelEndpointTypes -private import AutomodelJavaUtil - -from - Endpoint endpoint, EndpointCharacteristic characteristic, float confidence, - DollarAtString package, DollarAtString type, DollarAtString subtypes, DollarAtString name, - DollarAtString signature, DollarAtString input, DollarAtString output, - DollarAtString parameterName, DollarAtString extensibleType -where - isNegativeExample(endpoint, characteristic, confidence, package, type, subtypes, name, signature, - input, output, parameterName, extensibleType) -select endpoint, - characteristic + "\nrelated locations: $@, $@." + - "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // - signature, "signature", // - input, "input", // - output, "output", // - parameterName, "parameterName", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql b/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql deleted file mode 100644 index 7cb023949ed9..000000000000 --- a/java/ql/automodel/src/AutomodelFrameworkModeExtractPositiveExamples.ql +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Surfaces endpoints that are sinks with high confidence, for use as positive examples in the prompt. - * - * @name Positive examples (framework mode) - * @kind problem - * @problem.severity recommendation - * @id java/ml/extract-automodel-framework-positive-examples - * @tags internal extract automodel framework-mode positive examples - */ - -private import AutomodelFrameworkModeCharacteristics -private import AutomodelEndpointTypes -private import AutomodelJavaUtil - -from - Endpoint endpoint, EndpointType endpointType, DollarAtString package, DollarAtString type, - DollarAtString subtypes, DollarAtString name, DollarAtString signature, DollarAtString input, - DollarAtString output, DollarAtString parameterName, DollarAtString extensibleType -where - isPositiveExample(endpoint, endpointType, package, type, subtypes, name, signature, input, output, - parameterName, extensibleType) -select endpoint, - endpointType + "\nrelated locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@, $@, $@, $@.", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", // - CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", // - package, "package", // - type, "type", // - subtypes, "subtypes", // - name, "name", // - signature, "signature", // - input, "input", // - output, "output", // - parameterName, "parameterName", // - extensibleType, "extensibleType" diff --git a/java/ql/automodel/src/AutomodelJavaUtil.qll b/java/ql/automodel/src/AutomodelJavaUtil.qll deleted file mode 100644 index 368fb172483b..000000000000 --- a/java/ql/automodel/src/AutomodelJavaUtil.qll +++ /dev/null @@ -1,111 +0,0 @@ -private import java -private import AutomodelEndpointTypes as AutomodelEndpointTypes - -/** - * A helper class to represent a string value that can be returned by a query using $@ notation. - * - * It extends `string`, but adds a mock `hasLocationInfo` method that returns the string itself as the file name. - * - * Use this, when you want to return a string value from a query using $@ notation - the string value - * will be included in the sarif file. - * - * - * Background information on `hasLocationInfo`: - * https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/#providing-location-information - */ -class DollarAtString extends string { - bindingset[this] - DollarAtString() { any() } - - bindingset[this] - predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { - path = this and sl = 1 and sc = 1 and el = 1 and ec = 1 - } -} - -/** - * Holds for all combinations of MaD kinds (`kind`) and their human readable - * descriptions. - */ -predicate isKnownKind(string kind, AutomodelEndpointTypes::EndpointType type) { - kind = type.getKind() -} - -/** - * By convention, the subtypes property of the MaD declaration should only be - * true when there _can_ exist any subtypes with a different implementation. - * - * It would technically be ok to always use the value 'true', but this would - * break convention. - */ -pragma[nomagic] -boolean considerSubtypes(Callable callable) { - if - callable.isStatic() or - callable.getDeclaringType().isStatic() or - callable.isFinal() or - callable.getDeclaringType().isFinal() - then result = false - else result = true -} - -/** - * Holds if the given package, type, name and signature is a candidate for automodeling. - * - * This predicate is extensible, so that different endpoints can be selected at runtime. - */ -extensible predicate automodelCandidateFilter( - string package, string type, string name, string signature -); - -/** - * Holds if the given package, type, name and signature is a candidate for automodeling. - * - * This relies on an extensible predicate, and if that is not supplied then - * all endpoints are considered candidates. - */ -bindingset[package, type, name, signature] -predicate includeAutomodelCandidate(string package, string type, string name, string signature) { - not automodelCandidateFilter(_, _, _, _) or - automodelCandidateFilter(package, type, name, signature) -} - -/** - * Holds if the given program element corresponds to a piece of source code, - * that is, it is not compiler-generated. - * - * Note: This is a stricter check than `Element::fromSource`, which simply - * checks whether the element is in a source file as opposed to a JAR file. - * There can be compiler-generated elements in source files (especially for - * Kotlin), which we also want to exclude. - */ -predicate isFromSource(Element e) { - // from a source file (not a JAR) - e.fromSource() and - // not explicitly marked as compiler-generated - not e.isCompilerGenerated() and - // does not have a dummy location - not e.hasLocationInfo(_, 0, 0, 0, 0) -} - -/** - * Holds if taint cannot flow through the given type (because it is a numeric - * type or some other type with a fixed set of values). - */ -predicate isUnexploitableType(Type tp) { - tp instanceof PrimitiveType or - tp instanceof BoxedType or - tp instanceof NumberType or - tp instanceof VoidType -} - -/** - * Holds if the given method can be overridden, that is, it is not final, - * static, or private. - */ -predicate isOverridable(Method m) { - not m.getDeclaringType().isFinal() and - not m.isFinal() and - not m.isStatic() and - not m.isPrivate() -} diff --git a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll b/java/ql/automodel/src/AutomodelSharedCharacteristics.qll deleted file mode 100644 index 273c5d30dec9..000000000000 --- a/java/ql/automodel/src/AutomodelSharedCharacteristics.qll +++ /dev/null @@ -1,412 +0,0 @@ -float maximalConfidence() { result = 1.0 } - -float highConfidence() { result = 0.9 } - -float mediumConfidence() { result = 0.6 } - -/** - * A specification of how to instantiate the shared characteristics for a given candidate class. - * - * The `CandidateSig` implementation specifies a type to use for Endpoints (eg., `ParameterNode`), as well as a type - * to label endpoint classes (the `EndpointType`). One of the endpoint classes needs to be a 'negative' class, meaning - * "not any of the other known endpoint types". - */ -signature module CandidateSig { - /** - * An endpoint is a potential candidate for modeling. This will typically be bound to the language's - * DataFlow node class, or a subtype thereof. - */ - class Endpoint { - /** - * Gets the kind of this endpoint, either "sourceModel" or "sinkModel". - */ - string getExtensibleType(); - - /** - * Gets a string representation of this endpoint. - */ - string toString(); - } - - /** - * A related location for an endpoint. This will typically be bound to the supertype of all AST nodes (eg., `Top`). - */ - class RelatedLocation; - - /** - * A label for a related location. - * - * Eg., method-doc, class-doc, etc. - */ - class RelatedLocationType; - - /** - * An endpoint type considered by this specification. - */ - class EndpointType extends string; - - /** - * A sink endpoint type considered by this specification. - */ - class SinkType extends EndpointType; - - /** - * A source endpoint type considered by this specification. - */ - class SourceType extends EndpointType; - - /** - * Gets the endpoint as a location. - * - * This is a utility function to convert an endpoint to its corresponding location. - */ - RelatedLocation asLocation(Endpoint e); - - /** - * Defines what MaD kinds are known, and what endpoint type they correspond to. - */ - predicate isKnownKind(string kind, EndpointType type); - - /** - * Holds if `e` is a flow sanitizer, and has type `t`. - */ - predicate isSanitizer(Endpoint e, EndpointType t); - - /** - * Holds if `e` is a sink with the label `kind`, and provenance `provenance`. - */ - predicate isSink(Endpoint e, string kind, string provenance); - - /** - * Holds if `e` is a source with the label `kind`, and provenance `provenance`. - */ - predicate isSource(Endpoint e, string kind, string provenance); - - /** - * Holds if `e` is not a source or sink of any kind. - */ - predicate isNeutral(Endpoint e); - - /** - * Gets a related location. - * - * A related location is a source code location that may hold extra information about an endpoint that can be useful - * to the machine learning model. - * - * For example, a related location for a method call may be the documentation comment of a method. - */ - RelatedLocation getRelatedLocation(Endpoint e, RelatedLocationType name); -} - -/** - * A set of shared characteristics for a given candidate class. - * - * This module is language-agnostic, although the `CandidateSig` module will be language-specific. - * - * The language specific implementation can also further extend the behavior of this module by adding additional - * implementations of endpoint characteristics exported by this module. - */ -module SharedCharacteristics { - predicate isSink = Candidate::isSink/3; - - predicate isNeutral = Candidate::isNeutral/1; - - predicate isModeled(Candidate::Endpoint e, string kind, string extensibleKind, string provenance) { - Candidate::isSink(e, kind, provenance) and extensibleKind = "sinkModel" - or - Candidate::isSource(e, kind, provenance) and extensibleKind = "sourceModel" - } - - /** - * Holds if `endpoint` is modeled as `endpointType`. - */ - predicate isKnownAs( - Candidate::Endpoint endpoint, Candidate::EndpointType endpointType, - EndpointCharacteristic characteristic - ) { - // If the list of characteristics includes positive indicators with maximal confidence for this class, then it's a - // known sink for the class. - characteristic.appliesToEndpoint(endpoint) and - characteristic.hasImplications(endpointType, true, maximalConfidence()) - } - - /** - * Gets a potential type of this endpoint to make sure that sources are - * associated with source types and sinks with sink types. - */ - Candidate::EndpointType getAPotentialType(Candidate::Endpoint endpoint) { - endpoint.getExtensibleType() = "sourceModel" and - result instanceof Candidate::SourceType - or - endpoint.getExtensibleType() = "sinkModel" and - result instanceof Candidate::SinkType - } - - /** - * Holds if the given `endpoint` should be considered as a candidate for type `endpointType`, - * and classified by the ML model. - * - * A candidate is an endpoint that cannot be excluded from `endpointType` based on its characteristics. - */ - predicate isCandidate(Candidate::Endpoint endpoint, Candidate::EndpointType endpointType) { - endpointType = getAPotentialType(endpoint) and - not exists(getAnExcludingCharacteristic(endpoint, endpointType)) - } - - /** - * Gets the related location of `e` with name `name`, if it exists. - * Otherwise, gets the candidate itself. - */ - Candidate::RelatedLocation getRelatedLocationOrCandidate( - Candidate::Endpoint e, Candidate::RelatedLocationType type - ) { - if exists(Candidate::getRelatedLocation(e, type)) - then result = Candidate::getRelatedLocation(e, type) - else result = Candidate::asLocation(e) - } - - /** - * Gets a characteristics that disbar `endpoint` from being a candidate for `endpointType` - * with at least medium confidence. - */ - EndpointCharacteristic getAnExcludingCharacteristic( - Candidate::Endpoint endpoint, Candidate::EndpointType endpointType - ) { - result.appliesToEndpoint(endpoint) and - exists(float confidence | - confidence >= mediumConfidence() and - result.hasImplications(endpointType, false, confidence) - ) - } - - /** - * A set of characteristics that a particular endpoint might have. This set of characteristics is used to make decisions - * about whether to include the endpoint in the training set and with what kind, as well as whether to score the - * endpoint at inference time. - */ - abstract class EndpointCharacteristic extends string { - /** - * Holds for the string that is the name of the characteristic. This should describe some property of an endpoint - * that is meaningful for determining whether it's a sink, and if so, of which sink type. - */ - bindingset[this] - EndpointCharacteristic() { any() } - - /** - * Holds for endpoints that have this characteristic. - */ - abstract predicate appliesToEndpoint(Candidate::Endpoint n); - - /** - * This predicate describes what the characteristic tells us about an endpoint. - * - * Params: - * endpointType: The sink/source type. - * isPositiveIndicator: If true, this characteristic indicates that this endpoint _is_ a member of the class; if - * false, it indicates that it _isn't_ a member of the class. - * confidence: A float in [0, 1], which tells us how strong an indicator this characteristic is for the endpoint - * belonging / not belonging to the given class. A confidence near zero means this characteristic is a very weak - * indicator of whether or not the endpoint belongs to the class. A confidence of 1 means that all endpoints with - * this characteristic definitively do/don't belong to the class. - */ - abstract predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ); - - /** Indicators with confidence at or above this threshold are considered to be high-confidence indicators. */ - final float getHighConfidenceThreshold() { result = 0.8 } - } - - /** - * A high-confidence characteristic that indicates that an endpoint is a sink of a specified type. These endpoints can - * be used as positive samples for training or for a few-shot prompt. - */ - abstract class SinkCharacteristic extends EndpointCharacteristic { - bindingset[this] - SinkCharacteristic() { any() } - - abstract Candidate::EndpointType getSinkType(); - - final override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType = this.getSinkType() and - isPositiveIndicator = true and - confidence = maximalConfidence() - } - } - - /** - * A high-confidence characteristic that indicates that an endpoint is a source of a specified type. These endpoints can - * be used as positive samples for training or for a few-shot prompt. - */ - abstract class SourceCharacteristic extends EndpointCharacteristic { - bindingset[this] - SourceCharacteristic() { any() } - - abstract Candidate::EndpointType getSourceType(); - - final override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType = this.getSourceType() and - isPositiveIndicator = true and - confidence = maximalConfidence() - } - } - - /** - * A high-confidence characteristic that indicates that an endpoint is not a sink of any type. These endpoints can be - * used as negative samples for training or for a few-shot prompt. - */ - abstract class NotASinkCharacteristic extends EndpointCharacteristic { - bindingset[this] - NotASinkCharacteristic() { any() } - - override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType instanceof Candidate::SinkType and - isPositiveIndicator = false and - confidence = highConfidence() - } - } - - /** - * A high-confidence characteristic that indicates that an endpoint is not a source of any type. These endpoints can be - * used as negative samples for training or for a few-shot prompt. - */ - abstract class NotASourceCharacteristic extends EndpointCharacteristic { - bindingset[this] - NotASourceCharacteristic() { any() } - - override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType instanceof Candidate::SourceType and - isPositiveIndicator = false and - confidence = highConfidence() - } - } - - /** - * A high-confidence characteristic that indicates that an endpoint is neither a source nor a sink of any type. - */ - abstract class NeitherSourceNorSinkCharacteristic extends NotASinkCharacteristic, - NotASourceCharacteristic - { - bindingset[this] - NeitherSourceNorSinkCharacteristic() { any() } - - final override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - NotASinkCharacteristic.super.hasImplications(endpointType, isPositiveIndicator, confidence) or - NotASourceCharacteristic.super.hasImplications(endpointType, isPositiveIndicator, confidence) - } - } - - /** - * A medium-confidence characteristic that indicates that an endpoint is unlikely to be a sink of any type. These - * endpoints can be excluded from scoring at inference time, both to save time and to avoid false positives. They should - * not, however, be used as negative samples for training or for a few-shot prompt, because they may include a small - * number of sinks. - */ - abstract class LikelyNotASinkCharacteristic extends EndpointCharacteristic { - bindingset[this] - LikelyNotASinkCharacteristic() { any() } - - override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType instanceof Candidate::SinkType and - isPositiveIndicator = false and - confidence = mediumConfidence() - } - } - - /** - * A characteristic that indicates not necessarily that an endpoint is not a sink, but rather that it is not a sink - * that's interesting to model in the standard Java libraries. These filters should be removed when extracting sink - * candidates within a user's codebase for customized modeling. - * - * These endpoints should not be used as negative samples for training or for a few-shot prompt, because they are not - * necessarily non-sinks. - */ - abstract class UninterestingToModelCharacteristic extends EndpointCharacteristic { - bindingset[this] - UninterestingToModelCharacteristic() { any() } - - override predicate hasImplications( - Candidate::EndpointType endpointType, boolean isPositiveIndicator, float confidence - ) { - endpointType instanceof Candidate::SinkType and - isPositiveIndicator = false and - confidence = mediumConfidence() - } - } - - /** - * Contains default implementations that are derived solely from the `CandidateSig` implementation. - */ - private module DefaultCharacteristicImplementations { - /** - * Endpoints identified as sinks by the `CandidateSig` implementation are sinks with maximal confidence. - */ - private class KnownSinkCharacteristic extends SinkCharacteristic { - string madKind; - Candidate::EndpointType endpointType; - string provenance; - - KnownSinkCharacteristic() { - Candidate::isKnownKind(madKind, endpointType) and - // bind "this" to a unique string differing from that of the SinkType classes - this = madKind + "_" + provenance + "_characteristic" and - Candidate::isSink(_, madKind, provenance) - } - - override predicate appliesToEndpoint(Candidate::Endpoint e) { - Candidate::isSink(e, madKind, provenance) - } - - override Candidate::EndpointType getSinkType() { result = endpointType } - } - - private class KnownSourceCharacteristic extends SourceCharacteristic { - string madKind; - Candidate::EndpointType endpointType; - string provenance; - - KnownSourceCharacteristic() { - Candidate::isKnownKind(madKind, endpointType) and - // bind "this" to a unique string differing from that of the SinkType classes - this = madKind + "_" + provenance + "_characteristic" and - Candidate::isSource(_, madKind, provenance) - } - - override predicate appliesToEndpoint(Candidate::Endpoint e) { - Candidate::isSource(e, madKind, provenance) - } - - override Candidate::EndpointType getSourceType() { result = endpointType } - } - - /** - * A negative characteristic that indicates that an endpoint was manually modeled as a neutral model. - */ - private class NeutralModelCharacteristic extends NeitherSourceNorSinkCharacteristic { - NeutralModelCharacteristic() { this = "known non-sink" } - - override predicate appliesToEndpoint(Candidate::Endpoint e) { Candidate::isNeutral(e) } - } - - /** - * A negative characteristic that indicates that an endpoint is a sanitizer, and thus not a source. - */ - private class IsSanitizerCharacteristic extends NotASourceCharacteristic { - IsSanitizerCharacteristic() { this = "known sanitizer" } - - override predicate appliesToEndpoint(Candidate::Endpoint e) { Candidate::isSanitizer(e, _) } - } - } -} diff --git a/java/ql/automodel/src/AutomodelSinkModelMrvaQueries.ql b/java/ql/automodel/src/AutomodelSinkModelMrvaQueries.ql deleted file mode 100644 index ed61ccfbbfdc..000000000000 --- a/java/ql/automodel/src/AutomodelSinkModelMrvaQueries.ql +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file contains query predicates for use when gathering metrics at scale using Multi Repo - * Variant Analysis. - */ - -private import java -private import AutomodelAlertSinkUtil - -/** - * Holds if `alertCount` is the number of alerts for the query with ID `queryId` for which the - * sinks correspond to the given `ai-generated` sink model. - */ -query predicate sinkModelCountPerQuery( - string queryId, int alertCount, string package, string type, boolean subtypes, string name, - string signature, string input, string ext, string kind, string provenance -) { - exists(SinkModel s | - sinkModelTallyPerQuery(queryId, alertCount, s) and - s.getProvenance() = "ai-generated" and - s.getPackage() = package and - s.getType() = type and - s.getSubtypes() = subtypes and - s.getName() = name and - s.getSignature() = signature and - s.getInput() = input and - s.getExt() = ext and - s.getKind() = kind and - s.getProvenance() = provenance - ) -} - -/** - * Holds if `instanceCount` is the number of instances corresponding to the given `ai-generated` - * sink model (as identified by the `package`, `name`, `input`, etc.). - */ -query predicate instanceCount( - int instanceCount, string package, string type, boolean subtypes, string name, string signature, - string input, string ext, string kind, string provenance -) { - exists(SinkModel s | - instanceCount = s.getInstanceCount() and - instanceCount > 0 and - s.getProvenance() = "ai-generated" and - s.getPackage() = package and - s.getType() = type and - s.getSubtypes() = subtypes and - s.getName() = name and - s.getSignature() = signature and - s.getInput() = input and - s.getExt() = ext and - s.getKind() = kind and - s.getProvenance() = provenance - ) -} - -// MRVA requires a select clause, so we repurpose it to tell us which query predicates had results. -from string hadResults -where - sinkModelCountPerQuery(_, _, _, _, _, _, _, _, _, _, _) and hadResults = "sinkModelCountPerQuery" - or - instanceCount(_, _, _, _, _, _, _, _, _, _) and hadResults = "instanceCount" -select hadResults diff --git a/java/ql/automodel/src/change-notes/2024-11-19-drop-automodel.md b/java/ql/automodel/src/change-notes/2024-11-19-drop-automodel.md new file mode 100644 index 000000000000..2b554d6de204 --- /dev/null +++ b/java/ql/automodel/src/change-notes/2024-11-19-drop-automodel.md @@ -0,0 +1,4 @@ +--- +category: breaking +--- +* Dropped the Java Automodel queries. diff --git a/java/ql/automodel/src/codeql-pack.release.yml b/java/ql/automodel/src/codeql-pack.release.yml deleted file mode 100644 index 56a2fb388725..000000000000 --- a/java/ql/automodel/src/codeql-pack.release.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -lastReleaseVersion: 1.0.11 diff --git a/java/ql/automodel/src/qlpack.yml b/java/ql/automodel/src/qlpack.yml deleted file mode 100644 index 4acf2219db30..000000000000 --- a/java/ql/automodel/src/qlpack.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: codeql/java-automodel-queries -version: 1.0.12-dev -groups: - - java - - automodel -dependencies: - codeql/java-all: ${workspace} -dataExtensions: - - AutomodelCandidateFilter.yml -warnOnImplicitThis: true \ No newline at end of file diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.expected b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.expected deleted file mode 100644 index 8ec8033d086e..000000000000 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.expected +++ /dev/null @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.ql b/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.ql deleted file mode 100644 index b7e1efc45325..000000000000 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/AutomodelApplicationModeExtractionTests.ql +++ /dev/null @@ -1,35 +0,0 @@ -import java -import AutomodelApplicationModeCharacteristics as Characteristics -import AutomodelExtractionTests - -module TestHelper implements TestHelperSig { - Location getEndpointLocation(Characteristics::Endpoint endpoint) { - result = endpoint.asTop().getLocation() - } - - predicate isCandidate( - Characteristics::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType - ) { - Characteristics::isCandidate(endpoint, _, _, _, name, signature, input, output, _, - extensibleType, _) - } - - predicate isPositiveExample( - Characteristics::Endpoint endpoint, string endpointType, string name, string signature, - string input, string output, string extensibleType - ) { - Characteristics::isPositiveExample(endpoint, endpointType, _, _, _, name, signature, input, - output, _, extensibleType) - } - - predicate isNegativeExample( - Characteristics::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType - ) { - Characteristics::isNegativeExample(endpoint, _, _, _, _, _, name, signature, input, output, _, - extensibleType) - } -} - -import MakeTest> diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java deleted file mode 100644 index b0f3482a7322..000000000000 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/PluginImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -import hudson.Plugin; - -public class PluginImpl extends Plugin { - @Override - public void configure(String name, String value) { // $ sourceModelCandidate=configure(String,String):Parameter[0] sourceModelCandidate=configure(String,String):Parameter[1] - // ... - } -} diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java deleted file mode 100644 index 9691cf86c150..000000000000 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/Test.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.github.codeql.test; - -import java.io.InputStream; -import java.io.PrintWriter; -import java.nio.file.CopyOption; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Supplier; -import java.io.File; -import java.io.FileFilter; -import java.nio.file.FileVisitOption; -import java.net.URLConnection; -import java.util.concurrent.FutureTask; - -class Test { - public static void main(String[] args) throws Exception { - AtomicReference reference = new AtomicReference<>(); // uninteresting (parameterless constructor) - reference.set( // $ sinkModelCandidate=set(Object):Argument[this] - args[0] // $ negativeSinkExample=set(Object):Argument[0] // modeled as a flow step - ); // not a source candidate (return type is void) - } - - public static void callSupplier(Supplier supplier) { - supplier.get(); // not a source candidate (lambda flow) - } - - public static void copyFiles(Path source, Path target, CopyOption option) throws Exception { - Files.copy( - source, // $ positiveSinkExample=copy(Path,Path,CopyOption[]):Argument[0](path-injection) - target, // $ positiveSinkExample=copy(Path,Path,CopyOption[]):Argument[1](path-injection) - option // no candidate (not modeled, but source and target are modeled) - ); // $ sourceModelCandidate=copy(Path,Path,CopyOption[]):ReturnValue - } - - public static InputStream getInputStream(Path openPath) throws Exception { - return Files.newInputStream( - openPath // $ sinkModelCandidate=newInputStream(Path,OpenOption[]):Argument[0] positiveSinkExample=newInputStream(Path,OpenOption[]):Argument[0](path-injection) // sink candidate because "only" ai-modeled, and useful as a candidate in regression testing - ); // $ sourceModelCandidate=newInputStream(Path,OpenOption[]):ReturnValue - } - - public static InputStream getInputStream(String openPath, String otherPath) throws Exception { - return Test.getInputStream( // the call is not a source candidate (argument to local call) - Paths.get( - openPath, // $ negativeSinkExample=get(String,String[]):Argument[0] // modeled as a flow step - otherPath - ) // $ sourceModelCandidate=get(String,String[]):ReturnValue negativeSinkExample=get(String,String[]):Argument[1] - ); - } - - public static int compareFiles(File f1, File f2) { - return f1.compareTo( // $ negativeSinkExample=compareTo(File):Argument[this] - f2 // $ negativeSinkExample=compareTo(File):Argument[0] // modeled as not a sink - ); // not a source candidate (return type is int) - } - - public static void FilesWalkExample(Path p, FileVisitOption o) throws Exception { - Files.walk( - p, // $ negativeSinkExample=walk(Path,FileVisitOption[]):Argument[0] // modeled as a flow step - o, // the implicit varargs array is a candidate, annotated on the last line of the call - o // not a candidate (only the first arg corresponding to a varargs array - // is extracted) - ); // $ sourceModelCandidate=walk(Path,FileVisitOption[]):ReturnValue sinkModelCandidate=walk(Path,FileVisitOption[]):Argument[1] - } - - public static void WebSocketExample(URLConnection c) throws Exception { - c.getInputStream(); // $ sinkModelCandidate=getInputStream():Argument[this] positiveSourceExample=getInputStream():ReturnValue(remote) // not a source candidate (manual modeling) - c.connect(); // $ sinkModelCandidate=connect():Argument[this] // not a source candidate (return type is void) - } - - public static void fileFilterExample(File f, FileFilter ff) { - f.listFiles( // $ sinkModelCandidate=listFiles(FileFilter):Argument[this] - ff - ); // $ sourceModelCandidate=listFiles(FileFilter):ReturnValue - } -} - -class OverrideTest extends Exception { - public void printStackTrace(PrintWriter writer) { // $ sourceModelCandidate=printStackTrace(PrintWriter):Parameter[0] - return; - } - -} - -class TaskUtils { - public FutureTask getTask() { - FutureTask ft = new FutureTask(() -> { - // ^-- no sink candidate for the `this` qualifier of a constructor - return 42; - }); - return ft; - } -} - -class MoreTests { - public static void FilesListExample(Path p) throws Exception { - Files.list( - Files.createDirectories( - p // $ positiveSinkExample=createDirectories(Path,FileAttribute[]):Argument[0](path-injection) - ) // $ sourceModelCandidate=createDirectories(Path,FileAttribute[]):ReturnValue negativeSinkExample=list(Path):Argument[0] // modeled as a flow step - ); // $ sourceModelCandidate=list(Path):ReturnValue - - Files.delete( - p // $ sinkModelCandidate=delete(Path):Argument[0] positiveSinkExample=delete(Path):Argument[0](path-injection) - ); // not a source candidate (return type is void) - - Files.deleteIfExists( - p // $ sinkModelCandidate=deleteIfExists(Path):Argument[0] positiveSinkExample=deleteIfExists(Path):Argument[0](path-injection) - ); // not a source candidate (return type is boolean) - } -} \ No newline at end of file diff --git a/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java b/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java deleted file mode 100644 index 3ad79abb8df1..000000000000 --- a/java/ql/automodel/test/AutomodelApplicationModeExtraction/hudson/Plugin.java +++ /dev/null @@ -1,7 +0,0 @@ -package hudson; - -/** Plugin doc */ -public class Plugin { - /** Configure method doc */ - public void configure(String name, String value) {} -} diff --git a/java/ql/automodel/test/AutomodelExtractionTests.qll b/java/ql/automodel/test/AutomodelExtractionTests.qll deleted file mode 100644 index fbc407c67f05..000000000000 --- a/java/ql/automodel/test/AutomodelExtractionTests.qll +++ /dev/null @@ -1,77 +0,0 @@ -import java -import TestUtilities.InlineExpectationsTest -import AutomodelSharedCharacteristics - -signature module TestHelperSig { - Location getEndpointLocation(Candidate::Endpoint e); - - predicate isCandidate( - Candidate::Endpoint e, string name, string signature, string input, string output, - string extensibleType - ); - - predicate isPositiveExample( - Candidate::Endpoint e, string endpointType, string name, string signature, string input, - string output, string extensibleType - ); - - predicate isNegativeExample( - Candidate::Endpoint e, string name, string signature, string input, string output, - string extensibleType - ); -} - -module Extraction TestHelper> implements TestSig { - string getARelevantTag() { - result in [ - "sourceModelCandidate", "sinkModelCandidate", // a candidate source/sink - "positiveSourceExample", "positiveSinkExample", // a known source/sink - "negativeSourceExample", "negativeSinkExample" // a known non-source/non-sink - ] - } - - /** - * If `extensibleType` is `sourceModel` then the result is `ifSource`, if it - * is `sinkModel` then the result is `ifSink`. - */ - bindingset[extensibleType, ifSource, ifSink] - private string ifSource(string extensibleType, string ifSource, string ifSink) { - extensibleType = "sourceModel" and result = ifSource - or - extensibleType = "sinkModel" and result = ifSink - } - - additional predicate selectEndpoint( - Candidate::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType, string tag, string suffix - ) { - TestHelper::isCandidate(endpoint, name, signature, input, output, extensibleType) and - tag = ifSource(extensibleType, "sourceModelCandidate", "sinkModelCandidate") and - suffix = "" - or - TestHelper::isNegativeExample(endpoint, name, signature, input, output, extensibleType) and - tag = "negative" + ifSource(extensibleType, "Source", "Sink") + "Example" and - suffix = "" - or - exists(string endpointType | - TestHelper::isPositiveExample(endpoint, endpointType, name, signature, input, output, - extensibleType) and - tag = "positive" + ifSource(extensibleType, "Source", "Sink") + "Example" and - suffix = "(" + endpointType + ")" - ) - } - - predicate hasActualResult(Location location, string element, string tag, string value) { - exists( - Candidate::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType, string suffix - | - selectEndpoint(endpoint, name, signature, input, output, extensibleType, tag, suffix) - | - TestHelper::getEndpointLocation(endpoint) = location and - endpoint.toString() = element and - // for source models only the output is relevant, and vice versa for sink models - value = name + signature + ":" + ifSource(extensibleType, output, input) + suffix - ) - } -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.expected b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.expected deleted file mode 100644 index 8ec8033d086e..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.expected +++ /dev/null @@ -1,2 +0,0 @@ -testFailures -failures diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.ql b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.ql deleted file mode 100644 index 0d5e86118705..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/AutomodelFrameworkModeExtractionTests.ql +++ /dev/null @@ -1,35 +0,0 @@ -import java -import AutomodelFrameworkModeCharacteristics as Characteristics -import AutomodelExtractionTests - -module TestHelper implements TestHelperSig { - Location getEndpointLocation(Characteristics::Endpoint endpoint) { - result = endpoint.asTop().getLocation() - } - - predicate isCandidate( - Characteristics::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType - ) { - Characteristics::isCandidate(endpoint, _, _, _, name, signature, input, output, _, - extensibleType, _) - } - - predicate isPositiveExample( - Characteristics::Endpoint endpoint, string endpointType, string name, string signature, - string input, string output, string extensibleType - ) { - Characteristics::isPositiveExample(endpoint, endpointType, _, _, _, name, signature, input, - output, _, extensibleType) - } - - predicate isNegativeExample( - Characteristics::Endpoint endpoint, string name, string signature, string input, string output, - string extensibleType - ) { - Characteristics::isNegativeExample(endpoint, _, _, _, _, _, name, signature, input, output, _, - extensibleType) - } -} - -import MakeTest> diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/MyWriter.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/MyWriter.java deleted file mode 100644 index 62bd773cc2e2..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/MyWriter.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.codeql.test; - -public class MyWriter extends java.io.Writer { - @Override - public void write(char[] cbuf, int off, int len) { // $ sinkModelCandidate=write(char[],int,int):Argument[this] positiveSinkExample=write(char[],int,int):Argument[0](file-content-store) sourceModelCandidate=write(char[],int,int):Parameter[this] sourceModelCandidate=write(char[],int,int):Parameter[0] - } - - @Override - public void close() { // $ sinkModelCandidate=close():Argument[this] sourceModelCandidate=close():Parameter[this] - } - - @Override - public void flush() { // $ sinkModelCandidate=flush():Argument[this] sourceModelCandidate=flush():Parameter[this] - } -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/NonPublicClass.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/NonPublicClass.java deleted file mode 100644 index b106d3da5940..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/NonPublicClass.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.codeql.test; - -/** - * No candidates in this class, as it's not public! - */ -class NonPublicClass { - public void noCandidates(String here) { - System.out.println(here); - } -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java deleted file mode 100644 index 79fabff0664b..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicClass.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.codeql.test; - -public class PublicClass { - public void stuff(String arg) { // $ sinkModelCandidate=stuff(String):Argument[this] sourceModelCandidate=stuff(String):Parameter[this] sinkModelCandidate=stuff(String):Argument[0] sourceModelCandidate=stuff(String):Parameter[0] // source candidates because it is an overrideable method - System.out.println(arg); - } - - public static void staticStuff(String arg) { // $ sinkModelCandidate=staticStuff(String):Argument[0] // `arg` is not a source candidate (not overrideabe); `this` is not a candidate (static method) - System.out.println(arg); - } - - protected void nonPublicStuff(String arg) { // $ sinkModelCandidate=nonPublicStuff(String):Argument[this] sourceModelCandidate=nonPublicStuff(String):Parameter[this] sinkModelCandidate=nonPublicStuff(String):Argument[0] sourceModelCandidate=nonPublicStuff(String):Parameter[0] - System.out.println(arg); - } - - void packagePrivateStuff(String arg) { // no candidates because the method is not public - System.out.println(arg); - } - - public PublicClass(Object input) { // $ sourceModelCandidate=PublicClass(Object):ReturnValue sinkModelCandidate=PublicClass(Object):Argument[0] // `this` is not a candidate because it is a constructor - } - - // `input` and `input` are source candidates, but not sink candidates (is-style method) - public Boolean isIgnored(Object input) { // $ negativeSinkExample=isIgnored(Object):Argument[this] sourceModelCandidate=isIgnored(Object):Parameter[this] negativeSinkExample=isIgnored(Object):Argument[0] sourceModelCandidate=isIgnored(Object):Parameter[0] - return false; - } -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicInterface.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicInterface.java deleted file mode 100644 index d4f80b3c6988..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/com/github/codeql/test/PublicInterface.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.codeql.test; - -public interface PublicInterface { - public int stuff(String arg); // $ sinkModelCandidate=stuff(String):Argument[this] sourceModelCandidate=stuff(String):Parameter[this] sinkModelCandidate=stuff(String):Argument[0] sourceModelCandidate=stuff(String):Parameter[0] // result is _not_ a source candidate source (primitive return type) - - public static void staticStuff(String arg) { // $ sinkModelCandidate=staticStuff(String):Argument[0] // not a source candidate (static method) - System.out.println(arg); - } -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/io/File.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/io/File.java deleted file mode 100644 index 8bfe83e23397..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/io/File.java +++ /dev/null @@ -1,13 +0,0 @@ -package java.io; - -public class File { - public int compareTo( // $ negativeSinkExample=compareTo(File):Argument[this] sourceModelCandidate=compareTo(File):Parameter[this] // modeled as neutral for sinks - File pathname // $ negativeSinkExample=compareTo(File):Argument[0] sourceModelCandidate=compareTo(File):Parameter[0] // modeled as neutral for sinks - ) { - return 0; - } - - public boolean setLastModified(long time) { // $ sinkModelCandidate=setLastModified(long):Argument[this] sourceModelCandidate=setLastModified(long):Parameter[this] // time is not a candidate (primitive type) - return false; - } // return value is not a source candidate because it's a primitive -} diff --git a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/nio/file/Files.java b/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/nio/file/Files.java deleted file mode 100644 index a833ba5f6e20..000000000000 --- a/java/ql/automodel/test/AutomodelFrameworkModeExtraction/java/nio/file/Files.java +++ /dev/null @@ -1,31 +0,0 @@ -package java.nio.file; - -import java.io.InputStream; -import java.io.FileInputStream; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.OpenOption; - -public class Files { - public static void copy( // method result is not a candidate source (void) - Path source, // $ positiveSinkExample=copy(Path,OutputStream):Argument[0](path-injection) // manual model exists - OutputStream out // $ sinkModelCandidate=copy(Path,OutputStream):Argument[1] - /* NB: may be worthwhile to implement the - same behavior as in application mode where out would not be a - candidate because there already is a model for another parameter of - the same method and we assume that methods are always modeled - completely. - */ - ) throws IOException { - // ... - } - - public static InputStream newInputStream( // $ sourceModelCandidate=newInputStream(Path,OpenOption[]):ReturnValue - Path openPath, // $ positiveSinkExample=newInputStream(Path,OpenOption[]):Argument[0](path-injection) sinkModelCandidate=newInputStream(Path,OpenOption[]):Argument[0] // known sink, but still a candidate (ai-modeled, and useful as a candidate in regression testing) - OpenOption... options // $ sinkModelCandidate=newInputStream(Path,OpenOption[]):Argument[1] - ) throws IOException { - return new FileInputStream(openPath.toFile()); - } -} diff --git a/java/ql/automodel/test/change-notes/2024-05-23-Version1.md b/java/ql/automodel/test/change-notes/2024-05-23-Version1.md deleted file mode 100644 index 5840e51017be..000000000000 --- a/java/ql/automodel/test/change-notes/2024-05-23-Version1.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* CodeQL package management is now generally available, and all GitHub-produced CodeQL packages have had their version numbers increased to 1.0.0. diff --git a/java/ql/automodel/test/qlpack.yml b/java/ql/automodel/test/qlpack.yml deleted file mode 100644 index 46138d9435c0..000000000000 --- a/java/ql/automodel/test/qlpack.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: codeql/java-automodel-tests -version: 1.0.0-dev -groups: - - java - - automodel - - test -dependencies: - codeql/java-all: ${workspace} - codeql/java-automodel-queries: ${workspace} - codeql/java-tests: ${workspace} -extractor: java -tests: . -warnOnImplicitThis: true \ No newline at end of file diff --git a/java/ql/lib/semmle/code/java/security/Encryption.qll b/java/ql/lib/semmle/code/java/security/Encryption.qll index 6fc7f6b7d16a..1b28f5cbba61 100644 --- a/java/ql/lib/semmle/code/java/security/Encryption.qll +++ b/java/ql/lib/semmle/code/java/security/Encryption.qll @@ -223,10 +223,7 @@ string getAnInsecureHashAlgorithmName() { } private string rankedInsecureAlgorithm(int i) { - // In this case we know these are being used for encryption, so we want to match - // weak hash algorithms too. - result = - rank[i](string s | s = getAnInsecureAlgorithmName() or s = getAnInsecureHashAlgorithmName()) + result = rank[i](string s | s = getAnInsecureAlgorithmName()) } private string insecureAlgorithmString(int i) { diff --git a/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll b/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll index 1533b61dd5e4..060a30f87e6a 100644 --- a/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll +++ b/java/ql/lib/semmle/code/java/security/MaybeBrokenCryptoAlgorithmQuery.qll @@ -30,7 +30,11 @@ class InsecureAlgoLiteral extends InsecureAlgorithm, ShortStringLiteral { s.length() > 1 and not s.regexpMatch(getSecureAlgorithmRegex()) and // Exclude results covered by another query. - not s.regexpMatch(getInsecureAlgorithmRegex()) + not s.regexpMatch(getInsecureAlgorithmRegex()) and + // Exclude results covered by `InsecureAlgoProperty`. + // This removes duplicates when a string literal is a default value for the property, + // such as "MD5" in the following: `props.getProperty("hashAlg2", "MD5")`. + not exists(InsecureAlgoProperty insecAlgoProp | this = insecAlgoProp.getAnArgument()) ) } diff --git a/java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md b/java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md new file mode 100644 index 000000000000..b4ac88bcdc6a --- /dev/null +++ b/java/ql/src/change-notes/2024-10-29-weak-crypto-hash.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `java/weak-cryptographic-algorithm` query has been updated to no longer report uses of hash functions such as `MD5` and `SHA1` even if they are known to be weak. These hash algorithms are used very often in non-sensitive contexts, making the query too imprecise in practice. The `java/potentially-weak-cryptographic-algorithm` query has been updated to report these uses instead. diff --git a/java/ql/test/query-tests/security/CWE-327/semmle/tests/BrokenCryptoAlgorithm.expected b/java/ql/test/query-tests/security/CWE-327/semmle/tests/BrokenCryptoAlgorithm.expected index 612e1c730544..94719b477391 100644 --- a/java/ql/test/query-tests/security/CWE-327/semmle/tests/BrokenCryptoAlgorithm.expected +++ b/java/ql/test/query-tests/security/CWE-327/semmle/tests/BrokenCryptoAlgorithm.expected @@ -1,14 +1,8 @@ #select | Test.java:19:20:19:50 | getInstance(...) | Test.java:19:45:19:49 | "DES" | Test.java:19:45:19:49 | "DES" | Cryptographic algorithm $@ is weak and should not be used. | Test.java:19:45:19:49 | "DES" | DES | | Test.java:42:14:42:38 | getInstance(...) | Test.java:42:33:42:37 | "RC2" | Test.java:42:33:42:37 | "RC2" | Cryptographic algorithm $@ is weak and should not be used. | Test.java:42:33:42:37 | "RC2" | RC2 | -| WeakHashing.java:21:30:21:92 | getInstance(...) | WeakHashing.java:21:86:21:90 | "MD5" : String | WeakHashing.java:21:56:21:91 | getProperty(...) | Cryptographic algorithm $@ is weak and should not be used. | WeakHashing.java:21:86:21:90 | "MD5" | MD5 | edges -| WeakHashing.java:21:86:21:90 | "MD5" : String | WeakHashing.java:21:56:21:91 | getProperty(...) | provenance | MaD:1 | -models -| 1 | Summary: java.util; Properties; true; getProperty; (String,String); ; Argument[1]; ReturnValue; value; manual | nodes | Test.java:19:45:19:49 | "DES" | semmle.label | "DES" | | Test.java:42:33:42:37 | "RC2" | semmle.label | "RC2" | -| WeakHashing.java:21:56:21:91 | getProperty(...) | semmle.label | getProperty(...) | -| WeakHashing.java:21:86:21:90 | "MD5" : String | semmle.label | "MD5" : String | subpaths diff --git a/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.expected b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.expected new file mode 100644 index 000000000000..366de37b8677 --- /dev/null +++ b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.expected @@ -0,0 +1,4 @@ +argumentToEnsureNotTaintedNotMarkedAsSpurious +untaintedArgumentToEnsureTaintedNotMarkedAsMissing +testFailures +failures diff --git a/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.py b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.py new file mode 100644 index 000000000000..7719021890f8 --- /dev/null +++ b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.py @@ -0,0 +1,118 @@ +import threading +import time + +# Test 1 +# TP - Flow is tracked through a global variable +foo1 = None + +def bar1(): + time.sleep(1) + ensure_tainted(foo1) # $tainted + +# The intent of these tests is to test how dataflow is handled through shared state accessed by different threads; +# but the presense or absense of the actual call to start a thread does not affect the results (there is no special modelling for Thread) +# threading.Thread(target=bar).start() + +foo1 = TAINTED_STRING + +# Test 2 +# FN - Flow is *not* tracked through an access path on a global variable +foo2 = [] + +def bar2(): + time.sleep(1) + ensure_tainted(foo2[0]) # $MISSING:tainted + +threading.Thread(target=bar2).start() + +foo2.append(TAINTED_STRING) + +# Test 3 +# FN - Flow is not found even when there is a direct call +foo3 = [] + +def bar3(): + time.sleep(1) + ensure_tainted(foo2[0]) # $MISSING:tainted + +foo3.append(TAINTED_STRING) +bar3() + +# Tast 4 +# TP - Sanity check: Flow is found through a ListElement directly without a call +foo4 = [] +foo4.append(TAINTED_STRING) +ensure_tainted(foo4[0]) # $tainted + +# Test 5 +# FN - Flow is *not* tracked through a shared captured but non-global variable +def test5(): + foo5 = None + + def bar5(): + time.sleep(1) + ensure_tainted(foo5) # $MISSING:tainted + + threading.Thread(target=bar5).start() # Only the presense of this thread call makes this an FN rather than a TN + + foo5 = TAINTED_STRING + + # Test 6 + # TP - Flow is tracked through a shared captured but non-global variable with a direct call +def test6(): + foo6 = [] + + def bar6(): + time.sleep(1) + ensure_tainted(foo6[0]) # $tainted + + foo6.append(TAINTED_STRING) + bar6() + + +# Test 7 +# FN - Flow is *not* found through an access path on a global variable that's also used as a parameter +# We'd like to cover this case in order to be able to cover this CVE: https://github.com/github/codeql-python-CVE-coverage/issues/3176 + +foo7 = [] + +def bar7(): + time.sleep(1) + ensure_tainted(foo7[0]) # $MISSING: tainted + +def baz7(loc_foo): + loc_foo.append(TAINTED_STRING) + +threading.Thread(target=bar7).start() + +baz7(foo7) + +# Test 8 +# FN - Flow is also *not* found in the above case through a direct call + +foo8 = [] + +def bar8(): + time.sleep(1) + ensure_tainted(foo8[0]) # $MISSING: tainted + +def baz8(loc_foo): + loc_foo.append(TAINTED_STRING) + +baz8(foo8) +bar8() + +# Test 9 +# TP - Flow is found in the above case when the variable is captured rather than global + +def test9(): + foo9 = [] + def bar9(): + time.sleep(1) + ensure_tainted(foo9[0]) # $tainted + + def baz9(loc_foo): + loc_foo.append(TAINTED_STRING) + + baz9(foo9) + bar9() \ No newline at end of file diff --git a/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.ql b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.ql new file mode 100644 index 000000000000..dd01b5d3e341 --- /dev/null +++ b/python/ql/test/library-tests/dataflow/global-or-captured-vars/test.ql @@ -0,0 +1,3 @@ +import python +import experimental.meta.InlineTaintTest +import MakeInlineTaintTest diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 7335c95f7b8c..0f781aae8dab 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs cdfb9890318d847e6db320abd8b9e9939524ecc47bcdc8491b9c8253bd3178c2 cdfb9890318d847e6db320abd8b9e9939524ecc47bcdc8491b9c8253bd3178c2 +top.rs 7a5bbe75eae6069f4f255db13787a3575e706742af1f57122c02d46895de9a1b 7a5bbe75eae6069f4f255db13787a3575e706742af1f57122c02d46895de9a1b diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 13a0adecbca4..eb1f16f8cc66 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -3568,97 +3568,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct BlockExpr { - pub id: trap::TrapId, - pub attrs: Vec>, - pub is_async: bool, - pub is_const: bool, - pub is_gen: bool, - pub is_move: bool, - pub is_try: bool, - pub is_unsafe: bool, - pub label: Option>, - pub stmt_list: Option>, -} - -impl trap::TrapEntry for BlockExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("block_exprs", vec![id.into()]); - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("block_expr_attrs", vec![id.into(), i.into(), v.into()]); - } - if self.is_async { - out.add_tuple("block_expr_is_async", vec![id.into()]); - } - if self.is_const { - out.add_tuple("block_expr_is_const", vec![id.into()]); - } - if self.is_gen { - out.add_tuple("block_expr_is_gen", vec![id.into()]); - } - if self.is_move { - out.add_tuple("block_expr_is_move", vec![id.into()]); - } - if self.is_try { - out.add_tuple("block_expr_is_try", vec![id.into()]); - } - if self.is_unsafe { - out.add_tuple("block_expr_is_unsafe", vec![id.into()]); - } - if let Some(v) = self.label { - out.add_tuple("block_expr_labels", vec![id.into(), v.into()]); - } - if let Some(v) = self.stmt_list { - out.add_tuple("block_expr_stmt_lists", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for BlockExpr { - fn class_name() -> &'static str { "BlockExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct BoxPat { pub id: trap::TrapId, @@ -4582,81 +4491,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct ForExpr { - pub id: trap::TrapId, - pub attrs: Vec>, - pub iterable: Option>, - pub label: Option>, - pub loop_body: Option>, - pub pat: Option>, -} - -impl trap::TrapEntry for ForExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("for_exprs", vec![id.into()]); - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("for_expr_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.iterable { - out.add_tuple("for_expr_iterables", vec![id.into(), v.into()]); - } - if let Some(v) = self.label { - out.add_tuple("for_expr_labels", vec![id.into(), v.into()]); - } - if let Some(v) = self.loop_body { - out.add_tuple("for_expr_loop_bodies", vec![id.into(), v.into()]); - } - if let Some(v) = self.pat { - out.add_tuple("for_expr_pats", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for ForExpr { - fn class_name() -> &'static str { "ForExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct ForType { pub id: trap::TrapId, @@ -5168,6 +5002,51 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct LabelableExpr { + _unused: () +} + +impl trap::TrapClass for LabelableExpr { + fn class_name() -> &'static str { "LabelableExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LabelableExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LabelableExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LabelableExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LabelableExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct LetExpr { pub id: trap::TrapId, @@ -5559,66 +5438,58 @@ impl From> for trap::Label { } #[derive(Debug)] -pub struct LoopExpr { - pub id: trap::TrapId, - pub attrs: Vec>, - pub label: Option>, - pub loop_body: Option>, +pub struct MacroExpr { + pub id: trap::TrapId, + pub macro_call: Option>, } -impl trap::TrapEntry for LoopExpr { +impl trap::TrapEntry for MacroExpr { fn extract_id(&mut self) -> trap::TrapId { std::mem::replace(&mut self.id, trap::TrapId::Star) } fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("loop_exprs", vec![id.into()]); - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("loop_expr_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.label { - out.add_tuple("loop_expr_labels", vec![id.into(), v.into()]); - } - if let Some(v) = self.loop_body { - out.add_tuple("loop_expr_loop_bodies", vec![id.into(), v.into()]); + out.add_tuple("macro_exprs", vec![id.into()]); + if let Some(v) = self.macro_call { + out.add_tuple("macro_expr_macro_calls", vec![id.into(), v.into()]); } } } -impl trap::TrapClass for LoopExpr { - fn class_name() -> &'static str { "LoopExpr" } +impl trap::TrapClass for MacroExpr { + fn class_name() -> &'static str { "MacroExpr" } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of AstNode +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of AstNode unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Element +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Element unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Expr +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Expr unsafe { Self::from_untyped(value.as_untyped()) } } } -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Locatable +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Locatable unsafe { Self::from_untyped(value.as_untyped()) } @@ -5626,85 +5497,26 @@ impl From> for trap::Label { } #[derive(Debug)] -pub struct MacroExpr { - pub id: trap::TrapId, +pub struct MacroPat { + pub id: trap::TrapId, pub macro_call: Option>, } -impl trap::TrapEntry for MacroExpr { +impl trap::TrapEntry for MacroPat { fn extract_id(&mut self) -> trap::TrapId { std::mem::replace(&mut self.id, trap::TrapId::Star) } fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("macro_exprs", vec![id.into()]); + out.add_tuple("macro_pats", vec![id.into()]); if let Some(v) = self.macro_call { - out.add_tuple("macro_expr_macro_calls", vec![id.into(), v.into()]); + out.add_tuple("macro_pat_macro_calls", vec![id.into(), v.into()]); } } } -impl trap::TrapClass for MacroExpr { - fn class_name() -> &'static str { "MacroExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme MacroExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -#[derive(Debug)] -pub struct MacroPat { - pub id: trap::TrapId, - pub macro_call: Option>, -} - -impl trap::TrapEntry for MacroPat { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("macro_pats", vec![id.into()]); - if let Some(v) = self.macro_call { - out.add_tuple("macro_pat_macro_calls", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for MacroPat { - fn class_name() -> &'static str { "MacroPat" } +impl trap::TrapClass for MacroPat { + fn class_name() -> &'static str { "MacroPat" } } impl From> for trap::Label { @@ -7914,77 +7726,6 @@ impl From> for trap::Label { } } -#[derive(Debug)] -pub struct WhileExpr { - pub id: trap::TrapId, - pub attrs: Vec>, - pub condition: Option>, - pub label: Option>, - pub loop_body: Option>, -} - -impl trap::TrapEntry for WhileExpr { - fn extract_id(&mut self) -> trap::TrapId { - std::mem::replace(&mut self.id, trap::TrapId::Star) - } - - fn emit(self, id: trap::Label, out: &mut trap::Writer) { - out.add_tuple("while_exprs", vec![id.into()]); - for (i, v) in self.attrs.into_iter().enumerate() { - out.add_tuple("while_expr_attrs", vec![id.into(), i.into(), v.into()]); - } - if let Some(v) = self.condition { - out.add_tuple("while_expr_conditions", vec![id.into(), v.into()]); - } - if let Some(v) = self.label { - out.add_tuple("while_expr_labels", vec![id.into(), v.into()]); - } - if let Some(v) = self.loop_body { - out.add_tuple("while_expr_loop_bodies", vec![id.into(), v.into()]); - } - } -} - -impl trap::TrapClass for WhileExpr { - fn class_name() -> &'static str { "WhileExpr" } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of AstNode - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Element - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Expr - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - -impl From> for trap::Label { - fn from(value: trap::Label) -> Self { - // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Locatable - unsafe { - Self::from_untyped(value.as_untyped()) - } - } -} - #[derive(Debug)] pub struct WildcardPat { pub id: trap::TrapId, @@ -8166,6 +7907,106 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct BlockExpr { + pub id: trap::TrapId, + pub label: Option>, + pub attrs: Vec>, + pub is_async: bool, + pub is_const: bool, + pub is_gen: bool, + pub is_move: bool, + pub is_try: bool, + pub is_unsafe: bool, + pub stmt_list: Option>, +} + +impl trap::TrapEntry for BlockExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("block_exprs", vec![id.into()]); + if let Some(v) = self.label { + out.add_tuple("labelable_expr_labels", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("block_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + if self.is_async { + out.add_tuple("block_expr_is_async", vec![id.into()]); + } + if self.is_const { + out.add_tuple("block_expr_is_const", vec![id.into()]); + } + if self.is_gen { + out.add_tuple("block_expr_is_gen", vec![id.into()]); + } + if self.is_move { + out.add_tuple("block_expr_is_move", vec![id.into()]); + } + if self.is_try { + out.add_tuple("block_expr_is_try", vec![id.into()]); + } + if self.is_unsafe { + out.add_tuple("block_expr_is_unsafe", vec![id.into()]); + } + if let Some(v) = self.stmt_list { + out.add_tuple("block_expr_stmt_lists", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for BlockExpr { + fn class_name() -> &'static str { "BlockExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of LabelableExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme BlockExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct CallExpr { pub id: trap::TrapId, @@ -8842,6 +8683,60 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct LoopingExpr { + _unused: () +} + +impl trap::TrapClass for LoopingExpr { + fn class_name() -> &'static str { "LoopingExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopingExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopingExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopingExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopingExpr is a subclass of LabelableExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopingExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + #[derive(Debug)] pub struct MacroCall { pub id: trap::TrapId, @@ -10005,3 +9900,270 @@ impl From> for trap::Label { } } } + +#[derive(Debug)] +pub struct ForExpr { + pub id: trap::TrapId, + pub label: Option>, + pub loop_body: Option>, + pub attrs: Vec>, + pub iterable: Option>, + pub pat: Option>, +} + +impl trap::TrapEntry for ForExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("for_exprs", vec![id.into()]); + if let Some(v) = self.label { + out.add_tuple("labelable_expr_labels", vec![id.into(), v.into()]); + } + if let Some(v) = self.loop_body { + out.add_tuple("looping_expr_loop_bodies", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("for_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + if let Some(v) = self.iterable { + out.add_tuple("for_expr_iterables", vec![id.into(), v.into()]); + } + if let Some(v) = self.pat { + out.add_tuple("for_expr_pats", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for ForExpr { + fn class_name() -> &'static str { "ForExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of LabelableExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme ForExpr is a subclass of LoopingExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct LoopExpr { + pub id: trap::TrapId, + pub label: Option>, + pub loop_body: Option>, + pub attrs: Vec>, +} + +impl trap::TrapEntry for LoopExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("loop_exprs", vec![id.into()]); + if let Some(v) = self.label { + out.add_tuple("labelable_expr_labels", vec![id.into(), v.into()]); + } + if let Some(v) = self.loop_body { + out.add_tuple("looping_expr_loop_bodies", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("loop_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + } +} + +impl trap::TrapClass for LoopExpr { + fn class_name() -> &'static str { "LoopExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of LabelableExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme LoopExpr is a subclass of LoopingExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +#[derive(Debug)] +pub struct WhileExpr { + pub id: trap::TrapId, + pub label: Option>, + pub loop_body: Option>, + pub attrs: Vec>, + pub condition: Option>, +} + +impl trap::TrapEntry for WhileExpr { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, out: &mut trap::Writer) { + out.add_tuple("while_exprs", vec![id.into()]); + if let Some(v) = self.label { + out.add_tuple("labelable_expr_labels", vec![id.into(), v.into()]); + } + if let Some(v) = self.loop_body { + out.add_tuple("looping_expr_loop_bodies", vec![id.into(), v.into()]); + } + for (i, v) in self.attrs.into_iter().enumerate() { + out.add_tuple("while_expr_attrs", vec![id.into(), i.into(), v.into()]); + } + if let Some(v) = self.condition { + out.add_tuple("while_expr_conditions", vec![id.into(), v.into()]); + } + } +} + +impl trap::TrapClass for WhileExpr { + fn class_name() -> &'static str { "WhileExpr" } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of AstNode + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Element + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Expr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of LabelableExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of Locatable + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} + +impl From> for trap::Label { + fn from(value: trap::Label) -> Self { + // SAFETY: this is safe because in the dbscheme WhileExpr is a subclass of LoopingExpr + unsafe { + Self::from_untyped(value.as_untyped()) + } + } +} diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index e3fe15f3e5bf..6c3cf6ea6a07 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -1,4 +1,4 @@ -lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll e7bcae1016e1853d46d9c91dc5f9b81e81d207fdf91fdaa6eadb3bf185879674 541d386db1f0b662d0cbe1aface1bc6e4b1bc484d1230b95523f35ca63c08875 +lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 4005dd5213c45c8f96e12f08d8a6a7532692d68a3cd9e3a0fd55d7f982a92f23 ec753357ac4fc76706acc0cf1d9208e63a0688e480ece52e4314d7dc2a743de5 lib/codeql/rust/elements/Abi.qll 4c973d28b6d628f5959d1f1cc793704572fd0acaae9a97dfce82ff9d73f73476 250f68350180af080f904cd34cb2af481c5c688dc93edf7365fd0ae99855e893 lib/codeql/rust/elements/ArgList.qll 661f5100f5d3ef8351452d9058b663a2a5c720eea8cf11bedd628969741486a2 28e424aac01a90fb58cd6f9f83c7e4cf379eea39e636bc0ba07efc818be71c71 lib/codeql/rust/elements/ArrayExpr.qll a3e6e122632f4011644ec31b37f88b32fe3f2b7e388e7e878a6883309937049f 12ccb5873d95c433da5606fd371d182ef2f71b78d0c53c2d6dec10fa45852bdc @@ -12,7 +12,7 @@ lib/codeql/rust/elements/Attr.qll 53887a49513b95e38344b57d824a7474331467561f1edf lib/codeql/rust/elements/AwaitExpr.qll d8b37c01f7d27f0ec40d92a533a8f09a06af7ece1ae832b4ea8f2450c1762511 92cdb7ff0efddf26bed2b7b2729fddd197e26c1a11c8fec0c747aab642710c21 lib/codeql/rust/elements/BecomeExpr.qll 7a3cfc4894feb6be1cde664f675b18936434e68ccea52e55314c33d01491e34f 49666eca509b30d44bb02702bda67239c76bf8d9f231022c9cf6ecca123f8616 lib/codeql/rust/elements/BinaryExpr.qll 394522da3bc3a716fc7bc40c3560143ca840f5d210cfcba2a752c3026dd0f725 fbbd6fb79bf16a7d9820613654c584cd7ff3e7a29988f3920b6cfbe746acfd8d -lib/codeql/rust/elements/BlockExpr.qll b952fd44b89de248931d4089834d2c9406f6f2fc1a3f5c2365156be4e55157cf daccc07ab11ac696679b9fadc99f40b1bf579c90bf6c7cca6e82eaa313932ede +lib/codeql/rust/elements/BlockExpr.qll b5cf57119b15f27d0bc258dfa375b0ef2730c157870ff543f0dc7a8cfe514182 f6a01999606b010c81ef9c6ff1385e6640632b6f5ce067ffeb0ef0af0a0aeb92 lib/codeql/rust/elements/BoxPat.qll 1b2c3fff171aa6aa238c9460b122f26c79e04577cea67fa856de99842ba873d4 0caf8d23ed6e0997a6b8751def27641582151fba6e24fccf798712a4690b42f1 lib/codeql/rust/elements/BreakExpr.qll 7ca3807a20e9a9a988d1fd7abebf240325ed422fcb45c719ba46272f031f94db dffb7379d3f3ba220acfbd05eb7bb6cfd9cfda211e9c8b1f5240ca5fa61be3fc lib/codeql/rust/elements/CallExpr.qll f336500ca7a611b164d48b90e80edb0c0d3816792b0ececce659ac1ff1ffeb3e f99a9c55466418ef53860c44d9f2d6161af4b492178ddd9e5870dff742b70ae5 @@ -39,12 +39,12 @@ lib/codeql/rust/elements/ExternItemList.qll bc96f188970e8dc0cd1e77dea3e49b715edf lib/codeql/rust/elements/FieldExpr.qll 8102cd659f9059cf6af2a22033cfcd2aae9c35204b86f7d219a05f1f8de54b3b f818169dddf5102095ae1410583615f80031376a08b5307d0c464e79953c3975 lib/codeql/rust/elements/FieldList.qll bd243adc4696c60f636055a1c2da28039fe2028476c9247eb6a68003b849b757 ab63cdf410afd1e515f873b49f46bb5c2bf27e6c78fd206ccbdba064c4c0a4b2 lib/codeql/rust/elements/FnPtrType.qll c4a90dc660cf620972dc23b95494f5caf9f050eabd4bdb52fdc061f8797ba9a1 f8defc91582fa503607664668f9e2e6c2cd8b320c7c449610f21e52e332a129f -lib/codeql/rust/elements/ForExpr.qll 312804d53dd9236a2f2a15c9d6ec348b46e139a54eb5893e7e12487725df7444 fa5e20099b1179033bc209bad3548e3d1d4019c7fe0e455cec8ca1a9d48692ab +lib/codeql/rust/elements/ForExpr.qll 0cc8bfe10b8baf62a1ff65c8463cfb17ab64b41c30c9e1edb962a227df2036d9 b1be73294e6da0f49fd32177ad0b05fecf26081d5ce424f288be99a4bd59cc84 lib/codeql/rust/elements/ForType.qll 0036bed8749358c356d78c4a0eef40d73e2796284293cde5604ae70ddd6d0470 4edcaf8f7c67d42ebe3ebb1be6a7643758717d4fe88f5f648b6a1c5ff4ee4de7 -lib/codeql/rust/elements/Format.qll 506172d176f4b965f428585c032464f4abe07a0e47c574f8e011d8641ec45370 653e81bf233b8729649064de64f4a7a8533f8864ac6d2ea913f347088c924c60 +lib/codeql/rust/elements/Format.qll 51222fa2d2e85d496ab093d74d3bc606ede3ce48f926106e059dc8478e657203 b4da6be38413c86f2e9d82004624abab16e23ef238197a5c85246009cce276d5 lib/codeql/rust/elements/FormatArgsArg.qll 5bc9b4cd1bac7131165836e93838c45452a08ea6011741cbddace3cbf9c69440 f825140e98dc9800d5c045402186793c7b21511448e2f6bf6402d1e06305219c -lib/codeql/rust/elements/FormatArgsExpr.qll f2ffad5a1105b29a8437c8ed6cf918cfcf4d65ac164bbf1be0585c3b673ca749 3ba20dc312a0a994bb43b37b2db72cbd4e06061b97918fa0e84ce355070ffbeb -lib/codeql/rust/elements/FormatArgument.qll bdd93e1da78637f19beee6f953d3a45512100e925d90cb5ad08a097f412009b8 2a0ae7eb885615e380f925c0d130a1b795bf3c395486550a1f1c9c82848f8d77 +lib/codeql/rust/elements/FormatArgsExpr.qll 8127cbe4082f7acc3d8a05298c2c9bea302519b8a6cd2d158a83c516d18fc487 88cf9b3bedd69a1150968f9a465c904bbb6805da0e0b90cfd1fc0dab1f6d9319 +lib/codeql/rust/elements/FormatArgument.qll f6fe17ee1481c353dd42edae8b5fa79aeb99dff25b4842ec9a6f267b1837d1e3 5aed19c2daf2383b89ad7fd527375641cff26ddee7afddb89bc0d18d520f4034 lib/codeql/rust/elements/FormatTemplateVariableAccess.qll ff3218a1dda30c232d0ecd9d1c60bbb9f3973456ef0bee1d1a12ad14b1e082b5 e4316291c939800d8b34d477d92be9404a30d52b7eee37302aef3d3205cf4ae0 lib/codeql/rust/elements/Function.qll 2c76c2c7036891996b1f0ebde16c414edf37ebb44ff9c3483088dc6218733e07 d84d017d98aa240bf3bee6502a030aa8cfb7ed95425ffa9853e73b41485e1f4a lib/codeql/rust/elements/GenericArg.qll 5f11ce0e3c5f08de84db61f56ba1b984652455ba6b95a8b8a5b5a235913d4072 756b6a73d66fde45bdcc65ce2362a5b1391af2927e6d54b6550b3ecd5fd11e75 @@ -60,6 +60,7 @@ lib/codeql/rust/elements/InferType.qll c71184ae6aa181be94e299882503350e057493e17 lib/codeql/rust/elements/Item.qll 5c9148ff0eaeb4404c2d8156e7df0ef5753fd44ead972da05a49659ddaa25480 78446f788617e40525d4d4b489848e75f2143a90e18d40974c3bff7b1e7c825c lib/codeql/rust/elements/ItemList.qll c33e46a9ee45ccb194a0fe5b30a6ad3bcecb0f51486c94e0191a943710a17a7d 5a69c4e7712b4529681c4406d23dc1b6b9e5b3c03552688c55addab271912ed5 lib/codeql/rust/elements/Label.qll a31d41db351af7f99a55b26cdbbc7f13b4e96b660a74e2f1cc90c17ee8df8d73 689f87cb056c8a2aefe1a0bfc2486a32feb44eb3175803c61961a6aeee53d66e +lib/codeql/rust/elements/LabelableExpr.qll 598be487cd051b004ab95cbbc3029100069dc9955851c492029d80f230e56f0d 92c49b3cfdaba07982f950e18a8d62dae4e96f5d9ae0d7d2f4292628361f0ddc lib/codeql/rust/elements/LetElse.qll 85d16cb9cb2162493a9bacfe4b9e6a3b325d9466175b6d1a8e649bdf2191b864 c268d0878e9f82e8ede930b3825745c39ab8cd4db818eb9be6dc5ca49bee7579 lib/codeql/rust/elements/LetExpr.qll 435f233890799a9f52972a023e381bc6fe2e0b3df1e696dc98b21682a3c1d88e b34da72dd222a381e098f160551ec614ebb98eb46af35c6e1d337e173d8ec4b9 lib/codeql/rust/elements/LetStmt.qll e589d750ff87c25e28e15dab61e1a3555a45ced42158b05c991c6f5873abd86a 383484181b825cd7bc20e014fc4d5888f66e1f257502e1893f3d55aed2cdef3d @@ -69,7 +70,8 @@ lib/codeql/rust/elements/LifetimeParam.qll db9f2c7bb32d49808993b400875e79560ac54 lib/codeql/rust/elements/LiteralExpr.qll 40b67404b7c2b81e5afabc53a2a93e0a503f687bb31a2b4bfa4e07b2d764eb8d 67ab1be2286e769fba7a50ca16748e3c141760ccaefaebae99faa71f523a43d5 lib/codeql/rust/elements/LiteralPat.qll daffb5f380a47543669c8cc92628b0e0de478c3ac82685802c63e8d75a206bed adfe9796598cf6ca4a9170c89ffd871e117f1cea6dd7dd80ecbbb947327a1a5d lib/codeql/rust/elements/Locatable.qll 2855efa4a469b54e0ca85daa89309a8b991cded6f3f10db361010831ba1e11d3 00c3406d14603f90abea11bf074eaf2c0b623a30e29cf6afc3a247cb58b92f0f -lib/codeql/rust/elements/LoopExpr.qll 58ade0bc4a01a1cc361363682fde3ea56f4c5fbb4b28f5723ceff52ebaf897d7 fa299162c742bcf3b2211dc20821b312e3c133350c288a050eb26e6f8b5a5c78 +lib/codeql/rust/elements/LoopExpr.qll ee171177650fa23eef102a9580765f4b6073a1cc41bab1ec31ad4f84ffe6c2c9 bfcf0cca4dc944270d9748a202829a38c64dfae167c0d3a4202788ceb9daf5f6 +lib/codeql/rust/elements/LoopingExpr.qll 7ad7d4bbfd05adc0bb9b4ca90ff3377b8298121ca5360ffb45d5a7a1e20fe37a 964168b2045ee9bad827bba53f10a64d649b3513f2d1e3c17a1b1f11d0fc7f3a lib/codeql/rust/elements/MacroCall.qll a39a11d387355f59af3007dcbab3282e2b9e3289c1f8f4c6b96154ddb802f8c3 88d4575e462af2aa780219ba1338a790547fdfc1d267c4b84f1b929f4bc08d05 lib/codeql/rust/elements/MacroDef.qll acb39275a1a3257084314a46ad4d8477946130f57e401c70c5949ad6aafc5c5f 6a8a8db12a3ec345fede51ca36e8c6acbdce58c5144388bb94f0706416fa152a lib/codeql/rust/elements/MacroExpr.qll ea9fed13f610bab1a2c4541c994510e0cb806530b60beef0d0c36b23e3b620f0 ad11a6bbd3a229ad97a16049cc6b0f3c8740f9f75ea61bbf4eebb072db9b12d2 @@ -97,12 +99,12 @@ lib/codeql/rust/elements/ParenExpr.qll b635f0e5d300cd9cf3651cfcefd58316c21727295 lib/codeql/rust/elements/ParenPat.qll 40d033de6c85ad042223e0da80479adebab35494396ab652da85d3497e435c5a 8f2febe5d5cefcb076d201ae9607d403b9cfe8169d2f4b71d13868e0af43dc25 lib/codeql/rust/elements/ParenType.qll e1f5695b143c97b98ccdb460a5cf872461cfc13b83a4f005f26c288dc0afae10 1164f8efae7f255925411bddb33939fab0bf1c07955a16fef173b3f4675d09ae lib/codeql/rust/elements/Pat.qll 56211c5cb4709e7c12a2bfd2da5e413a451672d99e23a8386c08ad0b999fd45c b1b1893a13a75c4f0390f7e2a14ee98a46f067cfdc991a8d43adc82497d20aff -lib/codeql/rust/elements/Path.qll a0078e6d57dfd5a3b7fb2be4587f55f8e9c65ee042815a8a5b8dbd5273b4076a 0e2d4f8cbd54bd60aa4929b5fd50fe214346b6c0451f73e45143445d15420108 +lib/codeql/rust/elements/Path.qll 94869df09b929c4a60bae42b7e3a66c007f41078c08b7d9c6defb705b953ce8e eb317f75b89978d41fd3b166c7e3d871da4c04b3e17afbbcd0a5d73881e0d1d9 lib/codeql/rust/elements/PathExpr.qll 906df1d80c662b79f1b0b0428c39754b7f8dbcb2234919dd45dd8206a099dd36 1d6015afab6378c926c5838c9a5772cfcfeedf474e2eeca3e46085300ff8d4e1 lib/codeql/rust/elements/PathExprBase.qll bb41092ec690ae926e3233c215dcaf1fd8e161b8a6955151949f492e02dba13a b2257072f8062d31c29c63ee1311b07e0d2eb37075f582cfc76bb542ef773198 lib/codeql/rust/elements/PathPat.qll 6897e69bcb24b56d39ede796cf5767988dcd5741e02333fa8495dd7c814f771a 2a011fb92f17e4b4ff713e6d29f591054dfede22a9aaa006e67fca2c23ab76bf -lib/codeql/rust/elements/PathSegment.qll 536a8fe172db367e5f1dc678a014e2350eadfc379242d2b5451725e826ab1448 1a3a237f56c1d9ccdce6832ec6417fed25cd3e29ba836363cc6085e2125de4c5 -lib/codeql/rust/elements/PathType.qll a7bd3b05dc2c0e96c91c5485db508a1f5bb8fe3a01486be6815ae9dabb163add b11e996b6c0cc21a3d8d1ddc23c37e4d54a78e84a9278b3ceca1e94cb7321532 +lib/codeql/rust/elements/PathSegment.qll 9560551cf8b65e84705e7f302e12b48330e048613129e87c0f65a7eb297a6cc3 3aa75a5fd81f8ea32bd2b4bf0c51c386de57cbe9ab035fe3ec68ad7fcf51b375 +lib/codeql/rust/elements/PathType.qll 257ede178bb74ebdb8e266ebaa95082e7fb7cc8d921ef476f4df268ee8a1366c c48f6e04a8945a11f965e71819f68c00abc53a055042882b61716feda3ca63ae lib/codeql/rust/elements/PrefixExpr.qll 107e7bd111b637fd6d76026062d54c2780760b965f172ef119c50dd0714a377d 46954a9404e561c51682395729daac3bda5442113f29839d043e9605d63f7f6d lib/codeql/rust/elements/PtrType.qll b137f47a53e41b3b30c7d80dbdd6724bf15f99530ca40cc264a04af5f07aa878 b2ffdf739bfb7564d942fe54409834a59511c0b305b6d5b2219a8ee0ef594332 lib/codeql/rust/elements/RangeExpr.qll 43785bea08a6a537010db1138e68ae92eed7e481744188dfb3bad119425ff740 5e81cfbdf4617372a73d662a248a0b380c1f40988a5daefb7f00057cae10d3d4 @@ -161,7 +163,7 @@ lib/codeql/rust/elements/VariantList.qll 07adfe5750b2d5b50c8629f36feba24edd84f75 lib/codeql/rust/elements/Visibility.qll d2cf0727efaf8df6b3808cb4a6b2e26d18e42db766d92e97ad3ef046d91cb9e5 8947a1e2d48b532c6455ddf143fa5b1dff28c40da1f1c6a72769fc9db7ecbaf6 lib/codeql/rust/elements/WhereClause.qll da51212766700e40713fff968078a0172a4f73eebc5425d8e0d60b03c2fe59fa 0ec036aea729b8f4af0eb8118911dce715e2eb4640ae7b5e40a007a48da03899 lib/codeql/rust/elements/WherePred.qll 4815cd8f2a536c895e1f6831bef2ee6b9ea42c4fea12df1f164de1c965795bc1 3b46806767d81218d2e21656afe39c957c364ff7067c9af3ae8bacbf7f93858b -lib/codeql/rust/elements/WhileExpr.qll 9c12c26f953163c70020669327bd8c931493ef7fb4b75e6711202c0bab1d2697 2e2c96425bcd4414c65d9069a71a5123a3a10dd1449cafc121ac08f91ea49728 +lib/codeql/rust/elements/WhileExpr.qll 9e0c23057bf3fa3e050d5f6de0650f554ce576861783ea7d1e4c7d35db129ad3 b294c4f6e4dea922a4274779287edcb484409b2654a553298626ded9d1e8c5a4 lib/codeql/rust/elements/WildcardPat.qll 4f941afc5f9f8d319719312399a8f787c75a0dbb709ec7cf488f019339635aab a9140a86da752f9126e586ddb9424b23b3fb4841a5420bac48108c38bb218930 lib/codeql/rust/elements/YeetExpr.qll 4172bf70de31cab17639da6eed4a12a7afcefd7aa9182216c3811c822d3d6b17 88223aab1bef696f508e0605615d6b83e1eaef755314e6a651ae977edd3757c3 lib/codeql/rust/elements/YieldExpr.qll de2dc096a077f6c57bba9d1c2b2dcdbecce501333753b866d77c3ffbe06aa516 1f3e8949689c09ed356ff4777394fe39f2ed2b1e6c381fd391790da4f5d5c76a @@ -170,7 +172,6 @@ lib/codeql/rust/elements/internal/AbiImpl.qll 01439712ecadc9dc8da6f74d2e19cee13c lib/codeql/rust/elements/internal/ArgListConstructor.qll a73685c8792ae23a2d628e7357658efb3f6e34006ff6e9661863ef116ec0b015 0bee572a046e8dfc031b1216d729843991519d94ae66280f5e795d20aea07a22 lib/codeql/rust/elements/internal/ArgListImpl.qll 19664651c06b46530f0ae5745ccb3233afc97b9152e053761d641de6e9c62d38 40af167e571f5c255f264b3be7cc7f5ff42ec109661ca03dcee94e92f8facfc6 lib/codeql/rust/elements/internal/ArrayExprConstructor.qll f4ac4efefe5fe4fe1e666f35b1ee92d2243d977b3f3308151c89f61582203c09 4167ae58ec869f7dbd8467093c4a53afd7c1efcf1cc865efa62b4eb484bd7ff8 -lib/codeql/rust/elements/internal/ArrayExprImpl.qll 205db9816ec56409db1a0c3987e3a64b8e88b9942055d4bcf84a5fd5943efded 094c954c2861fa7dea69247c9c16ddc6c8699dcd3201a993c72229450bed1490 lib/codeql/rust/elements/internal/ArrayTypeConstructor.qll 9e92e6c40df992b4d71ae0e80392e81499604c7586a671b89d31d2d98060380e 76a1915a88f50ffa60bf129237bae2d66cf26d2a9018aca8ccb343929e847531 lib/codeql/rust/elements/internal/ArrayTypeImpl.qll e22d4f4eb21ba1ea44dd53e0c80aa60ec3a42818c1fc2d512c92dc496a6e2cb3 1b4a7347dbb9310ace1e9e3d08c3ba53c1dc441539cebcb4a78f64a58097bc0a lib/codeql/rust/elements/internal/AsmExprConstructor.qll 36c68023b58beec30af9f05d9d902a4c49faa0206b5528d6aad494a91da07941 4d91b7d30def03e634b92c0d7b99b47c3aadd75f4499f425b80355bc775ea5b6 @@ -183,25 +184,19 @@ lib/codeql/rust/elements/internal/AssocTypeArgImpl.qll 429f12a1a53c81634fc35331b lib/codeql/rust/elements/internal/AttrConstructor.qll de1dd30692635810277430291ba3889a456344dbd25938d9f8289ab22506d5cd 57b62b2b07dee4a9daeed241e0b4514ba36fd5ec0abb089869a4d5b2c79d6e72 lib/codeql/rust/elements/internal/AttrImpl.qll 486d307f74a48e6475fe014b07d5e0e13bbdf493ea80823e77e39747edf470d7 0847aa78d0e075aedbe46c10935969046bde4a7ab842da9d184739eb99a777c2 lib/codeql/rust/elements/internal/AwaitExprConstructor.qll 44ff1653e73d5b9f6885c0a200b45175bb8f2ceb8942c0816520976c74f1fc77 11e6f4a1e1462a59e2652925c8bd6663e0346c311c0b60ebe80daa3b55b268b0 -lib/codeql/rust/elements/internal/AwaitExprImpl.qll 97eb9abc0f30ead9385f31c87b461e6f1bbfbeaac17810838bb94543bfca181f 66357ffc8c106aae565524d7110e9f50f2b3f573b1508c1d1b02db02af4cc52e lib/codeql/rust/elements/internal/BecomeExprConstructor.qll ba073aaa256cb8827a0307c3128d50f62b11aac0b1f324e48c95f30351a9b942 3a787ded505c3158fa4f4923f66e8ecdcb7b5f86f27f64c5412dc32dca031f18 -lib/codeql/rust/elements/internal/BecomeExprImpl.qll 8522410257ca9ff09e5314c3a39fba02f6ba18e1d4349b91f8823586317f3e47 073a877a6d72c5b762aac64cdd843fd2872aaefb9e264fb90eac8c25753a6e07 lib/codeql/rust/elements/internal/BinaryExprConstructor.qll 7f9b17757f78b9fb7c46e21d2040a77fa50083bef4911c8464991c3d1ad91d87 a59390cd8e896c0bfbdc9ba0674e06d980ffcefa710fbc9886be52ed427e9717 lib/codeql/rust/elements/internal/BlockExprConstructor.qll 438337c807645e98a01440f3f4610d68b0567ba15c8f51dc43bf5a30c9af3696 48ce7a546910c884619762349b8ada9836284f8008298fdb0070a38f7ddf25a0 lib/codeql/rust/elements/internal/BlockExprImpl.qll 36ac09e4a6eeeec22919b62b1d004bdb5bb2527e67932c308aec383a770768d6 3b4b2a2014f6fe075c63a2d633b297566b548ef2e4343cadf067a9edbcadc876 lib/codeql/rust/elements/internal/BoxPatConstructor.qll 153f110ba25fd6c889092bfd16f73bb610fa60d6e0c8965d5f44d2446fcd48a2 9324cf0d8aa29945551bf8ab64801d598f57aab8cd4e19bcd4e9ef8a4a4e06eb -lib/codeql/rust/elements/internal/BoxPatImpl.qll d62a3cc1d5bab6bd258f702ec731ec57f0e5ef2672ab9de4b6f3b558078629eb 26b4fabb676adbbdb0d7f81449e493ee49380ea04d131f779714ac2434bb323a lib/codeql/rust/elements/internal/BreakExprConstructor.qll 356be043c28e0b34fdf925a119c945632ee883c6f5ebb9a27003c6a8d250afd9 bb77e66b04bb9489340e7506931559b94285c6904b6f9d2f83b214cba4f3cfd5 lib/codeql/rust/elements/internal/CallExprBaseImpl.qll d2749cc1a9d7ee8bf7f34b6c3e0238a576a68e439a8c10a503c164ff45ffcbeb ffc7b0a8841945fe6736b0e1aed7d9ed69185db03dee2b16da121325b39397c7 lib/codeql/rust/elements/internal/CallExprConstructor.qll 742b38e862e2cf82fd1ecc4d4fc5b4782a9c7c07f031452b2bae7aa59d5aa13a cad6e0a8be21d91b20ac2ec16cab9c30eae810b452c0f1992ed87d5c7f4144dc -lib/codeql/rust/elements/internal/CallExprImpl.qll 7e48610680ba6f2876a1a005ab0743496dd2364b9c44aca441bd33e11317e2d7 bb12c3c28156b40796fe3ba112760f87bb5abb323aab3c5b7bb3e0facaef8d35 lib/codeql/rust/elements/internal/CallableImpl.qll 917a7d298583e15246428f32fba4cde6fc57a1790262731be27a96baddd8cf5e c5c0848024e0fe3fbb775e7750cf1a2c2dfa454a5aef0df55fec3d0a6fe99190 lib/codeql/rust/elements/internal/CastExprConstructor.qll f3d6e10c4731f38a384675aeab3fba47d17b9e15648293787092bb3247ed808d d738a7751dbadb70aa1dcffcf8af7fa61d4cf8029798369a7e8620013afff4ed -lib/codeql/rust/elements/internal/CastExprImpl.qll 3c57b75f01efc70013ba3f05bd79fe2747fe1d1de47b84ff73b06ad38b4f1093 da813adc3390d23ec0643e37226a58e8afdb78e889380ad265d7531a344b841c lib/codeql/rust/elements/internal/ClosureBinderConstructor.qll 6e376ab9d40308e95bcdaf1cc892472c92099d477720192cd382d2c4e0d9c8a1 60a0efe50203ad5bb97bdfc06d602182edcc48ac9670f2d27a9675bd9fd8e19f lib/codeql/rust/elements/internal/ClosureBinderImpl.qll 58c6b17d34d678802ce3484f556482f3f6e3c3ff9a4be0e845bc2077818ab6fb 467261e12cba46f324364f5366bdb0034bf3c922b08307d39441ea5181e3f5f8 lib/codeql/rust/elements/internal/ClosureExprConstructor.qll a348229d2b25c7ebd43b58461830b7915e92d31ae83436ec831e0c4873f6218a 70a1d2ac33db3ac4da5826b0e8628f2f29a8f9cdfd8e4fd0e488d90ce0031a38 -lib/codeql/rust/elements/internal/ClosureExprImpl.qll 5ae3d211273b3effc3bff9f06bcef480f8264084e0509e69b8ff29bc29f47b05 ff562bc8d15ecb76ada3111c7c74dd990a0e80f41a32477f5f2f7db9e8f71102 lib/codeql/rust/elements/internal/CommentConstructor.qll 0b4a6a976d667bf7595500dfb91b9cfc87460a501837ba5382d9a8d8321d7736 7d02d8c94a319dc48e7978d5270e33fc5c308d443768ff96b618236d250123f1 lib/codeql/rust/elements/internal/ConstArgConstructor.qll f63021dc1ca2276786da3a981d06c18d7a360b5e75c08bca5d1afece4f7c4a83 487a870cbf5ed6554d671a8e159edd9261d853eba2d28ce2bd459759f47f11f2 lib/codeql/rust/elements/internal/ConstArgImpl.qll 234fe6533c208a1731cdb423aa3a28909bd7e042dbc28bbedfd4f62e42b6f21e c576a49006f7a10483041fc07f2f0d089710ac61840be61a2e71140db709f9c6 @@ -215,7 +210,6 @@ lib/codeql/rust/elements/internal/ContinueExprConstructor.qll cd93f1b35ccdb031d7 lib/codeql/rust/elements/internal/DynTraitTypeConstructor.qll 2bfd81fdf116b76f4a62b47bed5f0a730c04ce79747ecd1d3b683b8de22ff4aa 375c57350c432351396b92f28fded1e95a8002e3a1b31f3b66039f9b3d9bdea9 lib/codeql/rust/elements/internal/DynTraitTypeImpl.qll 8ccf27db0b898f518874ae094e5c97206384ad2fd3f82f81a5ecaad953278f71 e28ab56b8814a804e23afa790ca0f9a2665195b0b316d6cc52936e76ce5c0011 lib/codeql/rust/elements/internal/EnumConstructor.qll eca1a13937faacb1db50e4cf69d175f992f2204a5aaed9144bb6f3cb63814ac5 1bafba78b2729fdb052a25a1ba3f4f70871564aa4df632b4a1d467858a437924 -lib/codeql/rust/elements/internal/EnumImpl.qll c4dfa97b0c656957390417ab09c81b29b67fbff1b7b14976d65625ebea6b2c11 940303d4d4cec130f1981d309f8eaea6803c14a41174bbe9a87dd12ce4975945 lib/codeql/rust/elements/internal/ExprImpl.qll ab20ee174e2e786f34af6e5dedf3ec071bb89fc266b3e91df6377f72aa38d3f2 f68192700f449bf1c229cfbaabd5353c7c559941c915d5a0c88752cf9844194b lib/codeql/rust/elements/internal/ExprStmtConstructor.qll dd6bb06a7d48c12f630aafd611621cc50ce0f3e7d9abba5484a695f90879264b dc8b6ec8acc314e041ae71868803630c5d4cab488c72c1ea929bb756e1847c52 lib/codeql/rust/elements/internal/ExprStmtImpl.qll 420221c64245b490dab85f4e50d6b408cf488349869eb87312c166e185ad8145 2c2a4c71eea8c1ad8823e8e22780fadebb38ae502b3a7b9b062923a188fef692 @@ -227,12 +221,10 @@ lib/codeql/rust/elements/internal/ExternItemImpl.qll 577c8ac387c47746e3b45f94337 lib/codeql/rust/elements/internal/ExternItemListConstructor.qll 9e4f6a036707c848c0553119272fd2b11c1740dd9910a626a9a0cf68a55b249b efde86b18bd419154fb5b6d28790a14ea989b317d84b5c1ddbdfb29c6924fd86 lib/codeql/rust/elements/internal/ExternItemListImpl.qll e89d0cf938f6e137ba1ce7907a923b1ab2be7be2fdd642c3b7a722f11b9199f8 85906d3ce89e5abc301cc96ea5104d53e90af3f5f22f8d54ec437687096e39d8 lib/codeql/rust/elements/internal/FieldExprConstructor.qll b3be2c4ccaf2c8a1283f3d5349d7f4f49f87b35e310ef33491023c5ab6f3abc5 645d0d4073b032f6b7284fc36a10a6ec85596fb95c68f30c09504f2c5a6f789f -lib/codeql/rust/elements/internal/FieldExprImpl.qll bae3828bdee6fa3b36219e831cecc2a09fd3c40c4a945f8a19fb5d8765c6f302 be4b89e39013a380bc172ac46e496f14ebdebb1d93e1b7ffb3bab98e08db3f6f lib/codeql/rust/elements/internal/FieldListImpl.qll 02a09d1d146030c68cead4614f4eef75854f19e55ed1eda60b34c4858a8d4a88 9b9f5e77546434c771d2f785119577ec46569a18473daa4169fb84a097369493 lib/codeql/rust/elements/internal/FnPtrTypeConstructor.qll 494c53ee599039c02145f91394d8dfe7635b32d03f9fcde5efcc99ced437fec8 992462b1b6b9e64b6201f3c6c232ca524f126efcb562c9f0c176677bb559f33c lib/codeql/rust/elements/internal/FnPtrTypeImpl.qll 5d70f71e08341dfa851fc53a47cf362786b57f44244a636e2fbbad3d1c41371e 51d6a1b1132204129bb8ee9d2b72c6d13ce4b3ec8b185d3732d2e64d3f80e807 lib/codeql/rust/elements/internal/ForExprConstructor.qll d79b88dac19256300b758ba0f37ce3f07e9f848d6ae0c1fdb87bd348e760aa3e 62123b11858293429aa609ea77d2f45cb8c8eebae80a1d81da6f3ad7d1dbc19b -lib/codeql/rust/elements/internal/ForExprImpl.qll 88fc37b7030d3bfca6071f275c4eac6760ad7dea9a01135cee2079170efeb9d5 cd7216c460f8382498dfb0d61d65d83a9aa608b6a9b6657ccd552b82b55ffc5a lib/codeql/rust/elements/internal/ForTypeConstructor.qll 32c40b78aded314b5f51af904bfbd5ae4f1f0ea65854dd6249983cc26b8601bc 729069d58fac648a4b212b0068fb6bca348443b502c38978f171a7539b24333f lib/codeql/rust/elements/internal/ForTypeImpl.qll b515639844778d0fbe51e6161a2ec19201b0ba15156a91cdfecc93523081fd61 ab0c09ee415e55db6abcc07493a5d880c5ae0974f0cb760194e40b68a961676b lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll 8bd9b4e035ef8adeb3ac510dd68043934c0140facb933be1f240096d01cdfa11 74e9d3bbd8882ae59a7e88935d468e0a90a6529a4e2af6a3d83e93944470f0ee @@ -241,45 +233,33 @@ lib/codeql/rust/elements/internal/FormatArgsExprConstructor.qll ce29ff5a839b885b lib/codeql/rust/elements/internal/FunctionConstructor.qll b50aea579938d03745dfbd8b5fa8498f7f83b967369f63d6875510e09ab7f5d2 19cca32aeaecaf9debc27329e8c39ecec69464bb1d89d7b09908a1d73a8d92a2 lib/codeql/rust/elements/internal/GenericArgImpl.qll 6b1b804c357425c223f926e560a688e81506f5a35b95485cecf704e88cc009ee cc1ccf6a23dadc397e82664f3911d4b385d4c8ca80b1ee16d5275d9c936148dd lib/codeql/rust/elements/internal/GenericArgListConstructor.qll 46859bb3eb09d77987a18642d65ba2e13471a4dc9c0a83a192fddc82e37c335c 2c7d54c876269a88d3461b05745e73b06532b1616cae9b614ac94b28735d8fc4 -lib/codeql/rust/elements/internal/GenericArgListImpl.qll 1a39ba7080147abccaaba451852c9c124fb6177f2ebd64e38ee74014444a34e1 80df3150c961936037ac02b46ef5f775c3f82e66490afbca00a016cb9eee798a lib/codeql/rust/elements/internal/GenericParamImpl.qll f435f80d7f275803c1311d362467f4a367deb5a2c0245b17a9e12468a2c3ce2f 8e8fcc29f510efa03ce194ad3a1e2ae3fbd7f8e04ab5a4a2d1db03e95f388446 lib/codeql/rust/elements/internal/GenericParamListConstructor.qll 7221146d1724e0add3a8e70e0e46670142589eb7143425e1871ac4358a8c8bdb 2fbb7576444d6b2da6164245e2660d592d276ae2c1ca9f2bda5656b1c5c0a73a lib/codeql/rust/elements/internal/GenericParamListImpl.qll 524aa0949df6d4d2cb9bee6226650f63a6f181d7644933fa265673b281074885 27b0210e5eaa2040bc8a093e35e1394befb6994b25369544738d0447ef269a9c lib/codeql/rust/elements/internal/IdentPatConstructor.qll 09792f5a070996b65f095dc6b1b9e0fb096a56648eed26c0643c59f82377cab0 0bb1a9fcdc62b5197aef3dd6e0ea4d679dde10d5be54b57b5209727ba66e078b lib/codeql/rust/elements/internal/IfExprConstructor.qll 03088b54c8fa623f93a5b5a7eb896f680e8b0e9025488157a02c48aaebc6ad56 906f916c3690d0721a31dd31b302dcdcec4233bb507683007d82cf10793a648f -lib/codeql/rust/elements/internal/IfExprImpl.qll 96dc5be0a650a74f96e0c2214eb58f1af5278ad1695ad790b660fdecb6738c14 06a292fcc459297ef3a0ef5c75c887f993ccd6350eb3fb0d2493e5b7c7199b6b lib/codeql/rust/elements/internal/ImplConstructor.qll 24edccca59f70d812d1458b412a45310ddc096d095332f6e3258903c54c1bb44 7eb673b3ab33a0873ee5ce189105425066b376821cce0fc9eb8ace22995f0bc7 -lib/codeql/rust/elements/internal/ImplImpl.qll 33a57be871fe3ab08467a65f2e2e9fb7df9f096c98e9f86d8a755eaf6da6e446 f01d0e9bfccf3926ae9720d3d660ba97e1c094f318bfb252449b2d387176f6a9 lib/codeql/rust/elements/internal/ImplTraitTypeConstructor.qll b47501280b026a4e9c21ace21d9ae59f4d126a3a1e03a6088ca38cd676cc4f6d 3b0b325ab0139b290a81355559227050ba3096a58f9ff01c4c0f5c5fb5beb6ee lib/codeql/rust/elements/internal/ImplTraitTypeImpl.qll 9826a676525c98c30019f62f3c5943b4f62f278ed738dcc023d15f82f36a9d32 da369a61b95685c29fce3c07082d2a58ab633d526d094fa9eaefa82f564609f6 lib/codeql/rust/elements/internal/IndexExprConstructor.qll 99bdc3d793c4dbd993860da60abe2b7c604345d645e86916462bc55a6939a5d1 3fe9d7da725956903707806aadbecac8d5b3874e8bed63c9bab54fff630e75dd -lib/codeql/rust/elements/internal/IndexExprImpl.qll 7914bace26dadf2c1752b65afad2ed226165507e20f3dba7949696103f3d586e 708a9f7eff1cbfcf93841ee009dc01354f4ea3d2e1e00608924e670070410e20 lib/codeql/rust/elements/internal/InferTypeConstructor.qll fb8f2aec6cd1e681cd84a7bd574459e19b9b2a152009290e2eac550f012a06b7 e2b1694f00a4e6a82b13d08d7bb95c98a73792370c1155263d696e60d39b2c3b -lib/codeql/rust/elements/internal/InferTypeImpl.qll 9d0bf471a7e0c2671aae52cebadc763ed13e6a62451bf22da3061d7781d8f0bf 4e9e218862e48700523d882eb64d24135289216653cf92195f74eb8a35f50d7c lib/codeql/rust/elements/internal/ItemImpl.qll 3eaa97dcbdb8870acaebc1e11a37a5cfdfa200751461e54d3a52ca48b90ba9bd 41fbd1110b0e24f4d5a3deee0a51c02d206178111a361a1e94501ca1ab70d7f7 lib/codeql/rust/elements/internal/ItemListConstructor.qll 08af3bd12536941c3dd4a43c81cc861be24325e242e2593c087a3ce632674291 2fa166159c409d2aaffa73a30babb40829a6de580bd40894d909ee6152801082 lib/codeql/rust/elements/internal/ItemListImpl.qll fb27417bb3ee17a739ae966dd7c6f382bc2a1de3e7efdfe1586d76a257c0b573 dee7ded650df8ef46b2ac9d472718536fd76dffee86bc208b5a6144060221886 lib/codeql/rust/elements/internal/LabelConstructor.qll 1f814c94251e664bfa1b1a606aef995382e40e78d4f953350ec951ee0bc8bd34 3157fb8c7c6bd365a739f217ad73ba1e0b65ccd59b922e5ab034e3449915b36c -lib/codeql/rust/elements/internal/LabelImpl.qll e1934c3f01e6c9a2517001285bc8e36166757a50ff63be09f9000171c04130f7 4f93e722af890b5241bf55674b29ac5cb134cfefb47eba983503dbd4212abb20 lib/codeql/rust/elements/internal/LetElseConstructor.qll b2b5d68e5701379a0870aa6278078e09f06aa18ddd14045fc6ae62e90827ece7 7359e70bea8a78bcaf6e6ecc8cc37c5135ae31415b74645594456cc8daa82118 -lib/codeql/rust/elements/internal/LetElseImpl.qll 1c801275993b809e80a847736f080a9b650710ef8862797504495d62904a3a71 b79d4760d8e333893e984e45f21eb463dce7f2a49ebd0708321c8653aa8c20cb lib/codeql/rust/elements/internal/LetExprConstructor.qll 66f27cbdafb2b72b31d99645ec5ed72f4b762a7d6f5d292d7639dd8b86272972 7da048f4d7f677919c41d5c87ead301eacc12ece634d30b30a8ae1fab580ff30 -lib/codeql/rust/elements/internal/LetExprImpl.qll d9e2f8a2f4c7cf3b80178012b5f38b029064a52e705301b99c7477ec1d9fe479 1a059d383a5988b32ade329d2ac809f3a830eb9c54020e3271861aa9ef136ab8 lib/codeql/rust/elements/internal/LetStmtConstructor.qll 7ee0d67bebd6d3b9c7560137c165675d17b231318c084952ba4a2226d61e501f 84199ba755bb6c00579eee245b2bca41da478ca813b202b05abaa1246dcf13d8 -lib/codeql/rust/elements/internal/LetStmtImpl.qll 2f3f387a78d1751652bd22dc0ea6cb39f0e186847b6f0dafd74d0f89e2db495a 2ab5a17f588e385f614c8a104a17a91859389227635bd239694a799643727ffc lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll 270f7de475814d42e242e5bfe45d7365a675e62c10257110286e6a16ce026454 643d644b60bfe9943507a77011e5360231ac520fbc2f48e4064b80454b96c19b lib/codeql/rust/elements/internal/LifetimeArgImpl.qll 2d31b328c07b8922e2c448137d577af429150245170d26fe4a9220cba1a26bfe 18c5f5747ff4be87820c78cadd899d57e1d52c5cd6ae3f4e56ee2f5d3164bd41 lib/codeql/rust/elements/internal/LifetimeConstructor.qll 2babe40165547ac53f69296bb966201e8634d6d46bc413a174f52575e874d8cd ef419ae0e1b334d8b03cdb96bc1696787b8e76de5d1a08716e2ff5bd7d6dc60d -lib/codeql/rust/elements/internal/LifetimeImpl.qll 14ec1a4fa0c84fa9e75ea0babebae9c666909239806ed21325c32e47e11c8806 891168f29d4e06a927ec01ef8fd21ff6e0a0a3deadcf1481c99c74bf2ef20536 lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll 530c59a701d814ebc5e12dc35e3bfb84ed6ee9b5be7a0956ea7ada65f75ff100 ff6507e5d82690e0eec675956813afabbbcfb89626b2dbfffe3da34baeff278c lib/codeql/rust/elements/internal/LifetimeParamImpl.qll 8909288801bff8d3e87096dff4b45f434a4c064a9d69d8943a0b30970e011ef9 6d8f80eca24112b5eb659fe5d5fca4fd91c3df20ecab1085dfee9176091237b8 lib/codeql/rust/elements/internal/LiteralExprConstructor.qll 8ea3569bd50704ce7d57be790d2dfd38f4c40cb0b12e0dd60d6830e8145a686f 88d07ad3298003f314f74bd8e3d64a3094de32080ad42a7e6741c416c3856095 lib/codeql/rust/elements/internal/LiteralPatConstructor.qll b660cb428a0cba0b713fc7b07d5d2921de4a2f65a805535fb6387684c40620de 2dbc9fbc56e9de53d24265d6b13738ef5b9ced33cc3c4c1c270e04dc2fc1330f -lib/codeql/rust/elements/internal/LiteralPatImpl.qll af74456649e3949bf27e91f2127389e5c9f2ee99241958afeaa5b55276170994 b8b744b1d0c1b85ec86c535a35fc75d6289636a0e1988500debf236faf24a2cd lib/codeql/rust/elements/internal/LoopExprConstructor.qll 45f3f8f7441fcab6adc58831421679ee07bac68ac0417f3cbc90c97426cc805b f7ab3361b4a11e898126378ea277d76949466946762cd6cb5e9e9b4bb9860420 -lib/codeql/rust/elements/internal/LoopExprImpl.qll 068b98978296b22ae59bf9e941e7e2683f4fee0f6c1affbda1fa42c93f015114 e40e384aeff61099d102a681e5dca1aabc6dd6694731f8570d6358e0197368b0 +lib/codeql/rust/elements/internal/LoopingExprImpl.qll 17885c1bcf7b5a3f9c7bbad3d4d55e24372af0dedd5e7fc0efcfc0a8b2cdad70 104dc45ca399b9f6e8227ad561679f728d60170398a52b31fc90cb2a2dd3c33c lib/codeql/rust/elements/internal/MacroCallConstructor.qll 707fee4fba1fd632cd00128f493e8919eaaea552ad653af4c1b7a138e362907d b49e7e36bf9306199f2326af042740ff858871b5c79f6aeddf3d5037044dbf1f -lib/codeql/rust/elements/internal/MacroCallImpl.qll 7732221a0d8677f32695be3e6263f6e5f8857225cf98cc31eb91592e175df260 7c4e15e092abbf3a6070141669f2614909eb0accaaee0da6f70495de6087337b lib/codeql/rust/elements/internal/MacroDefConstructor.qll 382a3bdf46905d112ee491620cc94f87d584d72f49e01eb1483f749e4709c055 eb61b90d8d8d655c2b00ff576ae20c8da9709eeef754212bc64d8e1558ad05ce lib/codeql/rust/elements/internal/MacroDefImpl.qll f26e787ffd43e8cb079db01eba04412dbf32c338938acf1bc09a2f094bbdfdfe 044f43bc94fe4b6df22afae32e9f039d1d0d9e85ad9f24b6388be71211c37ce5 lib/codeql/rust/elements/internal/MacroExprConstructor.qll b12edb21ea189a1b28d96309c69c3d08e08837621af22edd67ff9416c097d2df d35bc98e7b7b5451930214c0d93dce33a2c7b5b74f36bf99f113f53db1f19c14 @@ -295,7 +275,6 @@ lib/codeql/rust/elements/internal/MacroStmtsImpl.qll 27faff9da93ad7f22a6236c73eb lib/codeql/rust/elements/internal/MacroTypeConstructor.qll 0a23573a6f69b38f3d7470050b16197601d67bdd5a4b1a43a155b0b99ccdf6b5 19b623962e8e1f73e55e3ed9712d2a3fe84b9510b99062173902feb2458ec12a lib/codeql/rust/elements/internal/MacroTypeImpl.qll b8711279f09f521b05bb67568c089271b7913f863ee64dfdeec2c502de2cbdc8 51bd9d3a2fb2065bce7b193b485e225ca5c8ba2029e60cab427d43a90baf0880 lib/codeql/rust/elements/internal/MatchArmConstructor.qll b41c1d5822d54127ce376ef62c6a5fa60e11697319fc7d9c9c54fd313d784a93 96cca80e5684e5893c0e9c0dff365ef8ad9e15ff648c9969ba42d91f95abea05 -lib/codeql/rust/elements/internal/MatchArmImpl.qll 065dff16fc70b51924eb4db57be121283f4b5651105320901558bc93bfdf2641 37f4f6ecd23c5170ee5cb0041625c19a8d3245d56f6f1587a2e588eb86baecf9 lib/codeql/rust/elements/internal/MatchArmListConstructor.qll 8bc5ac978fe1158ef70d0ac06bdad9e02aadd657decb64abcc4ea03f6715a87a 4604ab0e524d0de6e19c16711b713f2090c95a8708909816a2b046f1bd83fe24 lib/codeql/rust/elements/internal/MatchArmListImpl.qll 896c6f1650e7ceb60d0b3d90e2b95fe7f8dc529203ddfec58edb063fa9b2871f a668fed1eb68806abfb021913786168d124de47b25da470e7b57f56bf8556891 lib/codeql/rust/elements/internal/MatchExprConstructor.qll 0355ca543a0f9ad56697bc2e1e2511fa3f233bc1f6344d9e1c2369106901c696 78622807a1c4bff61b751c715639510146c7a713e0c4f63246e9a2cf302f4875 @@ -307,46 +286,35 @@ lib/codeql/rust/elements/internal/MethodCallExprConstructor.qll a1b3c4587f0ae60d lib/codeql/rust/elements/internal/MissingConstructor.qll aab0b7f2846f14a5914661a18c7c9eae71b9bde2162a3c5e5e8a8ecafa20e854 8f30b00b5b7918a7500786cc749b61695158b5b3cc8e9f2277b6b6bf0f7850a0 lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23ab150b32fef7b47ffcc5489bfcd942ac3e 9f3212d45d77e5888e435e7babd55c1e6b42c3c16f5b1f71170ac41f93ee8d0b lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e -lib/codeql/rust/elements/internal/ModuleImpl.qll bbff32cadbad54bdb613df8c1ac6da8cd2a80d0576361b843f1529e6c63b1938 7342473026561b8e4923625a083ba52c31d3b6797f9061accd1a712598244410 lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9 lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2 lib/codeql/rust/elements/internal/NeverTypeConstructor.qll 6a86bff9d885eddf39a159698710def40d693ccfd0888aefd090a283cb59ae95 9c51d6569f267dde5597067a8470d19d7714304399de4f730e7b85ca21feee20 -lib/codeql/rust/elements/internal/NeverTypeImpl.qll 8c7464cb76f9d081dab318d743817d87ecd69672f382d27323ade94c82e8e0f6 55351661214854bbf7faed6c7d17d598459d4e88eaba130a9b3a9f43f6665c37 lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0 lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c lib/codeql/rust/elements/internal/OrPatConstructor.qll 4ef583e07298487c0c4c6d7c76ffcc04b1e5fe58aba0c1da3e2c8446a9e0c92b 980a6bd176ae5e5b11c134569910c5468ba91f480982d846e222d031a6a05f1a lib/codeql/rust/elements/internal/ParamConstructor.qll b98a2d8969f289fdcc8c0fb11cbd19a3b0c71be038c4a74f5988295a2bae52f0 77d81b31064167945b79b19d9697b57ca24462c3a7cc19e462c4693ce87db532 -lib/codeql/rust/elements/internal/ParamImpl.qll 8a5101559f5d636b60ab80237057944b537823ce054d760c3dbd58b2acf05a46 e7a08cefeb6a290a975899045b7b19a9624f5a2b0946cba0866b1854cc0c0fb0 lib/codeql/rust/elements/internal/ParamListConstructor.qll 3123142ab3cab46fb53d7f3eff6ba2d3ff7a45b78839a53dc1979a9c6a54920e 165f3d777ea257cfcf142cc4ba9a0ebcd1902eb99842b8a6657c87087f3df6fe lib/codeql/rust/elements/internal/ParamListImpl.qll 0ed6e9affe1dc0144641502292c2ddd51958fe3d503419caf15198176e3a4174 92d053cc5fdf40a2d98acb665083b5da15403d7da205779a97a4ee66fac0add4 lib/codeql/rust/elements/internal/ParenExprConstructor.qll 104b67dc3fd53ab52e2a42ffde37f3a3a50647aa7bf35df9ba9528e9670da210 d1f5937756e87a477710c61698d141cdad0ccce8b07ecb51bab00330a1ca9835 -lib/codeql/rust/elements/internal/ParenExprImpl.qll 185e7c0f8f377f62a7ccf1c0d168caf500afd0654b82d47569bfcb97e368a26d 25a41998ce0ff3490d677676bf02fea1861d6c01db99a02fc940cc37ae580db6 lib/codeql/rust/elements/internal/ParenPatConstructor.qll 9aea3c3b677755177d85c63e20234c234f530a16db20ab699de05ca3f1b59787 29f24aed0d880629a53b30550467ade09a0a778dbf88891769c1e11b0b239f98 -lib/codeql/rust/elements/internal/ParenPatImpl.qll 39c45b3736c4d0329af7a1eec28a8470c3f244efd58a6ba62af482a0e9b4a842 d8aa9e6f8987666cd51cb65f81700d3b4584d3dc7d070836e52a9bc64e572d9e lib/codeql/rust/elements/internal/ParenTypeConstructor.qll d62e656a4a3c8ffd4eb87d49585a7a3bfb5dbe3826fbcbd11cb87b46f34c19ae febf6535965afa0f6eac4d2b08730f5a07bbb36a7434abe0a7663d7264961a3f -lib/codeql/rust/elements/internal/ParenTypeImpl.qll 6f7b4fade4ac0af69bf9766ee7d73da3da1742ba8a7c12d2a067b71c7f96d849 f065ea466111a5abca33d97b9878ef2fcc221f286fc65bec87f3a9c2fd5d57fc lib/codeql/rust/elements/internal/PatImpl.qll 37c9b1da7aa625117644e2cd74ec0b174f69a38cf66926add01786a05d5ad2ad 143685a0b4873fa0b73b204285dca956e59b32d527bfac6cc336326d244994b7 lib/codeql/rust/elements/internal/PathConstructor.qll 5c6354c28faf9f28f3efee8e19bdb82773adcf4b0c1a38788b06af25bcb6bc4a 3e2aeef7b6b9cda7f7f45a6c8119c98803aa644cf6a492cf0fce318eba40fe8f lib/codeql/rust/elements/internal/PathExprBaseImpl.qll e8b09447ee41b4123f7d94c6b366b2602d8022c9644f1088c670c7794307ab2e 96b9b328771aaf19ba18d0591e85fcc915c0f930b2479b433de3bfdd2ea25249 lib/codeql/rust/elements/internal/PathExprConstructor.qll cf6e0a338a8ed2d1042bdee4c2c49be5827e8c572d8c56e828db265d39e59ae3 36a3d1b7c5cc2cf527616be787b32071b9e2a6613a4f6b3f82e2a3b0e02a516f lib/codeql/rust/elements/internal/PathPatConstructor.qll 966c4ea22218ef71e000d7ce8dd5b570c39ad96b9239a3aa8a38292e2a9f36d2 8a1f348e9257ffc6e6bedcd70389b8e7ec2a3ed6e7b3733744ddfab284826e57 -lib/codeql/rust/elements/internal/PathPatImpl.qll 6ab5b5959cfd94e74f60422cbdbd764a5f51ff541db428938c36ba3a512d1d6b 47585157460e8384047de307b0b05deaab758d0f07fd0183d874f7bb9d8bda4b lib/codeql/rust/elements/internal/PathSegmentConstructor.qll 2d9639e42035dc7e73b7d6ddb8a977beadc6b4492dee4292b2f85b4409344441 c337fc3b9ef56366428772563e3f25f711474d16e860d3e89c1395a95d9e83e7 lib/codeql/rust/elements/internal/PathTypeConstructor.qll 8949742c7ab7fcfa3a3f6469e87355a6888931ab9ac7a6a07d2bd51e3fdf8283 fb1a402e94e9a1f33b7757338d7e95b107933339615a4fe86de33e41206dd94a -lib/codeql/rust/elements/internal/PathTypeImpl.qll 0e3b85df054d1194505796e457ee31a8dac2a2a77284c077cbf1a3bfc179294e c198d4fdf8d1d55f1cf57685a9ad2adf88cc2d6d4f84bafa1e9f039192761399 lib/codeql/rust/elements/internal/PrefixExprConstructor.qll 90c50b0df2d4b4cbf5e2b7d67a9d243a1af9bfff660b7a70d8b9c7859c28bca7 1a1b5ea1f06ed8d41a658c872e8e1915c241a7c799c691df81b9a7b55d8f2f1e lib/codeql/rust/elements/internal/PtrTypeConstructor.qll ee3c4326ea3f198d2537a914dd6eb51d0cf247310f037e13e87632fbd6cfb50a 3814218b5271f3c6c45b52082cca2a3250a2573abced43fe53e1b4145374afe3 lib/codeql/rust/elements/internal/PtrTypeImpl.qll ff4283ffab39b4a3c0e55e7d655dfdb846171cde0907bf1f893c86b35d2c1135 e54d3a6fb0b5a1484f00fd5a4631455902bab80642c3bb076e538ddcc29a85a4 lib/codeql/rust/elements/internal/RangeExprConstructor.qll a0aa90a1c38c5deea56475399016afae2a00a858b961fbbab8ddeb3bc6a08103 0ddf1bcf28aafc56d7334e6138fb268f9b36a429e4cbdd982cd8384e0644076b -lib/codeql/rust/elements/internal/RangeExprImpl.qll a6ff92a27e44c2184f5c2d8483de1d0d4a77eb7a5154ff93a8f3a9fc8b63e561 d53d44bc1c1ae426f208595002adcddb88643e1027bbee7445095ca09e433331 lib/codeql/rust/elements/internal/RangePatConstructor.qll fe4345cb41d970ab64196ca37eccb26e5b9cf85fab4253cacfd2b31de03bd070 1d09d5ec8203d76aed2dfb7e7f14c0c07d6559c8f589e11860fff8a2c682c1a6 lib/codeql/rust/elements/internal/RangePatImpl.qll ef11ab2c002896036553231741a7cf896fafa09e22e920e15661b9cbe4393cae 24ac2dcce3055a77f3a5e0b38cf13aebefd2eeaefa53674ff144a6225634ac0d lib/codeql/rust/elements/internal/RecordExprConstructor.qll 742198bd8223902b5625b4a574a9e3539a8b6cf8e48eecc57cc2de4e980fba6e 0a99e454e234e8b7b59dc11b167172a5fcd31b8a5282349956d6fd861ec735df lib/codeql/rust/elements/internal/RecordExprFieldConstructor.qll 11620bc4e2dc7b3903be764cd9510a8e002892722b502876cf3467994aa7a63c e42e50747dd9453a44705b2d6a05e7a4a8c6debed988a0335a774a547d8f7157 -lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll 8af196cbaeeb7997e933fde9ddba50ec099df51f66e03501f00157f238505fe7 29ae10546577a354b0439876ce5deb5ab13455028f02c01fe3903b11eaee35e2 lib/codeql/rust/elements/internal/RecordExprFieldListConstructor.qll 3a0d6ec872792c400d3a0a5ed1c5051b248a597a4b17ada1a078ea5d972b6721 52bae8222e7aa5bc89b73bec3fd1c3c1de0fe11bf30ccf5668454f63fbfc9b83 lib/codeql/rust/elements/internal/RecordExprFieldListImpl.qll 1210c23c0495f5d1a72409afc8c559f8da2b8c71340ff2944af9d1f684d0a856 fea96b053cad4135ab09b1c070a4c9f26507dd890a62c30772cf3e2358686640 -lib/codeql/rust/elements/internal/RecordExprImpl.qll 233b3f7ee8dbd1e5431bea5436c6b7ee38e631c041111dcf53e45c6c4c08a6cf 9537497edb739c535d75ce80122f597ad93241bff5399b1dae17a7bfff1c15cd lib/codeql/rust/elements/internal/RecordFieldConstructor.qll 9fc05f5101e48a45a028c479b35ec3d2f1a3cc33f0938667fcb813c5a4ab9526 98791dcf7f3209524f6132f9c26980e499cbcf94c1559e95c67544732245f05b lib/codeql/rust/elements/internal/RecordFieldImpl.qll 2612dae3c95c9064420a3494872213f7fd7a3e1133243f4adea8a30808a209ae 143b75bb539a1bfea16e1c764a1f549522ef9c8d6d5de3fef377bbf67ba42075 lib/codeql/rust/elements/internal/RecordFieldListConstructor.qll 9f1d916f3784092dcbff7224451c8f4f0daf6f8293a466b0a30ec9b92cd41358 8aafe377714a134287362c4b96439c1c6baa5a31c2c36a544bd5f73e9213477a @@ -356,22 +324,17 @@ lib/codeql/rust/elements/internal/RecordPatFieldConstructor.qll 6e1880ed05401b39 lib/codeql/rust/elements/internal/RecordPatFieldImpl.qll 04bc31b857c8250096d9d1bf3fad1e556a28d83bb3f3b48a3f049048d1e6785f 5853105e55650d05a4b196f17b89baf12b898df0a010e4f88289ce01d16a0379 lib/codeql/rust/elements/internal/RecordPatFieldListConstructor.qll b8f0ef9b75ffe6be6ce7e601d528f0a1b871123c63e39cead3fd13b8bd4f54b7 166f07c708ab8b3de6bfaf193bac93081b2aacad046aa86de7441085dd20a8c5 lib/codeql/rust/elements/internal/RecordPatFieldListImpl.qll 2d1dd9910480eb65c59fcef2e1576ce639be85c35d90e4bce721ce22ec742ba3 1e788a2d7d00e9f96dbf7e93d3a18d5bfb4d7749194ff8e9810e9053fa88a94b -lib/codeql/rust/elements/internal/RecordPatImpl.qll 3c7086be84e336c069f4c7b538c7ad32a7728e7fbf42e4dc7f04c4c99d393c0d 8020215f38639965398c62ddb36c3560579d63928e71e0d773b254e121a68cc3 lib/codeql/rust/elements/internal/RefExprConstructor.qll 9ad08c0f3d980a56a2af8857cb84db589941d20ab3ae5c8ece004ccaccaaf950 4cac3ace31b7ed77a72e989fce9cdbae2247f03c28a3f0c50d67385d02c7f193 -lib/codeql/rust/elements/internal/RefExprImpl.qll 56ed831a3b30ed375e7369b0a60b9b7635a1b00f058364a6b15078031a85af5f ca7e772b409514363e49d56a174ae9bd2e076755cbd09c4e7e5b732d09acdb25 lib/codeql/rust/elements/internal/RefPatConstructor.qll d8b88c2c468b08072f6f853306eb61eb88ee1e6c5cfb63958f115a64a9715bb3 0c1d6a8af6a66912698acce47e89d4e3239e67f89c228a36a141f9c685c36394 -lib/codeql/rust/elements/internal/RefPatImpl.qll 3e06e8130d412b47267497097cffc9f4b930b9e54bc90465ab5ac620fbe52048 b8ac844ec99f30605ce476f89ced4fb1159d2df0df43c631f60b3c868e0e1fd7 lib/codeql/rust/elements/internal/RefTypeConstructor.qll e1952aa69586b440f878400a52d09b2d12d5a29dbe9651360344631cb9493cd4 e4ae45e89472dfd4547d647c75e1635cf065a7d221ed60ed34554f265c0c5405 lib/codeql/rust/elements/internal/RefTypeImpl.qll f72b760a8a26be21170435da2cb2981638513617fd82742f45f38bc437d9f2c4 f32df49f0b6df85ca5fc4393ccd341ac4304b4947a282ccea48468a26837ef3d lib/codeql/rust/elements/internal/RenameConstructor.qll 65fa2e938978d154701e6cac05b56320b176ee014ef5c20a7b66f3e94fd5c4a7 dfc0ff4606b8e1c14003cc93a0811f4d62ec993b07ff3c1aa0776746577ed103 lib/codeql/rust/elements/internal/RenameImpl.qll 4f5943fbda4ec772203e651ed4b7dd1fb072219ddc0cb208c0a0951af5e72bd6 b9854cdcf02e70ee372330a4e0bfdb03012bc81af79dd12af2a567fd7fc4672b lib/codeql/rust/elements/internal/ResolvableImpl.qll 7599625454fe81c3490a122943363a2a2522a7877b78a80649e93155a418fedd 442072c3d70bdaababd7de8bc6c9382f4a50bab41d13759dcd1a5bee9ea32e49 lib/codeql/rust/elements/internal/RestPatConstructor.qll 45430925ddf08fba70ede44c7f413ddb41b3113c149b7efc276e0c2bf72507b4 25c678898d72446e7a975bb8b7f2fde51e55b59dbd42f2cca997c833b1a995f1 -lib/codeql/rust/elements/internal/RestPatImpl.qll 1b83464367e5fdc28b0b3946ae74c67c64d30b286c39268b4118337539250e51 83a03308cba4cb3344d48f0a0730b1d3e41a73f16f729d39dc2bae6d3f57f232 lib/codeql/rust/elements/internal/RetTypeConstructor.qll a96d803c6e4b40be49cfed0853a3e04ae917c47351e5c880fcab06eddf1af9cc d06a0a191cb14c270c0441ffc3d289263808170dcbe05e01847a35ac9d61dfb3 lib/codeql/rust/elements/internal/RetTypeImpl.qll 0e96f1075ccade28ce5664ab0f5c2e98984ae1d0ed708bc02e40e882672d9e2f 350725d16bcb1e8911bfdd87d9dd21be73ec66d23c2a35827c8c8525c48dc885 lib/codeql/rust/elements/internal/ReturnExprConstructor.qll 57be5afbe20aa8db6e63c1f2871914c19c186730ad7dccaa424038c6305730d5 4d3c4f2e9b38a4b54ff26a0032455cdcca3d35fec201b6c932072a9e31fbb4fe -lib/codeql/rust/elements/internal/ReturnExprImpl.qll eef4960a8c27eaa0540d048fe88893cfe9a6ac377a770cc23d72ebe05d5782f1 b7f35650d80f2f8b4893f0091fea74646341af406b6248f75c477112aca96dea lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll 8994672e504d1674e5773157d0ad8a0dc3aad3d64ef295e7722e647e78e36c11 abe7df754721f4ff7f3e3bb22d275976b2e9a1ef51436a461fe52ebd2d29cff1 lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll d47a3dcfcc2b02a6a9eaeefe9a7a4be2074ecd2019da129dda0f218bc3fbd94b 87198db7c0620ed49369da160f09287015e0cd1718784e1ba28ec3ec5a0bb4a8 lib/codeql/rust/elements/internal/SelfParamConstructor.qll a63af1d1ccde6013c09e0397f1247f5ab3efd97f3410dd1b6c15e1fb6cd96e54 0d8977653c074d5010c78144327f8b6c4da07f09d21e5cc3342082cd50107a81 @@ -395,7 +358,6 @@ lib/codeql/rust/elements/internal/TokenTreeImpl.qll c61574f2b551db24640258117e0c lib/codeql/rust/elements/internal/TraitAliasConstructor.qll d2f159cac53b9d65ec8176b8c8ccb944541cd35c64f0d1ceabb32cd975c000bf 6564981793de762af2775cc729e25054ea788648509d151cbfdbdf99fc9ed364 lib/codeql/rust/elements/internal/TraitAliasImpl.qll f338dba5388973ec0c5928d4c60664737f75a93d0c7db5fb34053bc41c107641 f2e437469e4ba1d8dd321bc670978e7eed76508e728d1e08e52ddcf52a461d3a lib/codeql/rust/elements/internal/TraitConstructor.qll 1f790e63c32f1a22ae1b039ca585b5fe6ffef6339c1e2bf8bca108febb433035 535cebd676001bfbbb724d8006fa2da94e585951b8fd54c7dc092732214615b5 -lib/codeql/rust/elements/internal/TraitImpl.qll 776a0c10c944146b89d616e3bf1311502de9e1e84f0c9d5d7de5aecfc97b87e3 3795d920e98620b30f7e2c218cfb57ae91b37956f9165325b5da6705df8beffa lib/codeql/rust/elements/internal/TryExprConstructor.qll 98e3077ebc4d76f687488b344f532b698512af215b66f0a74b5cea8ed180836c b95603c10c262911eeffdf4ccba14849e8443916b360e287963d5f2582d8e434 lib/codeql/rust/elements/internal/TryExprImpl.qll 00635685db339557cfb89fad0bfc134e53efc6d88c68cce400b72c2dd428ef9f 43559b46e45c009f985b58896b542881b81a3e6b82a6f51b784e8a712ae3da2b lib/codeql/rust/elements/internal/TupleExprConstructor.qll 71c38786723225d3d90399b8a085b2b2664c62256654db9e1288fadd56745b9d 639ad70b49ebadc027127fbdc9de14e5180169a4285908233bc38ccac6f14110 @@ -422,12 +384,10 @@ lib/codeql/rust/elements/internal/TypeParamConstructor.qll a6e57cccd6b54fa68742d lib/codeql/rust/elements/internal/TypeParamImpl.qll 9e7169e8254e2d9d13b11a17cbe04e874f72fb67a75c3585e70eddec71ba5c7f b8c862b2cd53bc211caea23261d9832613418aae51f63ef08922d300c2d1f4f2 lib/codeql/rust/elements/internal/TypeRefImpl.qll cfc08bdcc8e7e588f533c7e64c0c08d317d63cdb50f4cba4b4b3e589b37b0fea b46ee7de9b5e9894807004e1bedf39e7d25912ed79de6ac5adfb37a43aa4804b lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll 8dc27831adb49c1a47b9f8997d6065e82b4e48e41e3c35bd8d35255cea459905 6c5a5272d37f83f1c1b17475f8adb7d867e95025d201320e20a32dab1f69f7bf -lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll 4277b23a09a4ba5e53ca2cfbb20eba6a5f66039b6268da79410e0be30332fedd b9ed79468157a7e751f78aa7597165672cbc38191d5f85ecc15cfdaff388a26a lib/codeql/rust/elements/internal/UnextractedImpl.qll 5c23df7e448184d76ccab2c22757ace24663b8be2592a3fa2a44bef43159ebd3 77b0c9fe75a307adc08c422cc88423c5349756878793cf9e79c006c83b4c403b lib/codeql/rust/elements/internal/UnimplementedConstructor.qll 70b0489fdc75fed389de8203947ed9c8eabb91373a1264eb2c8018ddbb2d9baa 0f2592c1697a2f2f913014ecd73b0e3ff1ec5b038ba1c3a22e7939bf8759e664 lib/codeql/rust/elements/internal/UnimplementedImpl.qll 06771abc088e0a8fc24032c9d2633618e8e40343ef8757a68cc0a70f1617165a 5738f626f1f4f573fdf7dcd5bd57a0948d290ed89342b9160e95ef3c84044f9a lib/codeql/rust/elements/internal/UnionConstructor.qll d650551a1b3ef29c5a770bdad626269cf539ed0c675af954bc847d2c6111f3f6 aca9064ad653a126ab4f03703e96b274587c852dc5e7ff3fea0fec4d45993f10 -lib/codeql/rust/elements/internal/UnionImpl.qll f1765a7a37fb29eff98d67d166c35df4921eafc8cb61c11c7848185535f0497b 9f041f6ee82bd3cda2ddea0ee58d7a996123b1713b9d127f764eb74a9387f685 lib/codeql/rust/elements/internal/UseConstructor.qll a4f790795e18abc29a50d6fbaa0db64cba781e3259a42cbf0468c24ac66b63e7 2fa288f073ac094a838c11f091def2c790b347b6a1b79407c11b10c73d6bff57 lib/codeql/rust/elements/internal/UseImpl.qll ba779517c3c928ab6e794360b6344829e84ec6da5e1de1b03b4eaf8bdae58ce9 0f4ead9eecb584eb9827502276ffe8cb1da0d2fa4b8f660d2afc26ac4e0fba86 lib/codeql/rust/elements/internal/UseTreeConstructor.qll 3e6e834100fcc7249f8a20f8bd9debe09b705fcf5a0e655537e71ac1c6f7956b cdbc84b8f1b009be1e4a7aaba7f5237823cea62c86b38f1794aad97e3dfcf64b @@ -445,9 +405,7 @@ lib/codeql/rust/elements/internal/WhereClauseImpl.qll 59d33533e641ce3851e493de30 lib/codeql/rust/elements/internal/WherePredConstructor.qll f331c37085792a01159e8c218e9ef827e80e99b7c3d5978b6489808f05bd11f8 179cad3e4c5aaaf27755891694ef3569322fcf34c5290e6af49e5b5e3f8aa732 lib/codeql/rust/elements/internal/WherePredImpl.qll aad95f448ca051d5dcd462429fa1ca95dcec6df2e70b6f64a480bd6839307581 411a66a5d866aa8cb4911c5106849adb103a063e1b90a9ecc5d16db3022bb1f8 lib/codeql/rust/elements/internal/WhileExprConstructor.qll 01eb17d834584b3cba0098d367324d137aacfc60860752d9053ec414180897e7 e5e0999fb48a48ba9b3e09f87d8f44f43cc3d8a276059d9f67e7714a1852b8a5 -lib/codeql/rust/elements/internal/WhileExprImpl.qll 5e716498402be3a1a8ed3594e13a03938bb793ac80f2a648bc93c0d746028d8b efcee38fe5e984a690c33f8bfdc78c677c2b0cdc5902525e2196a68fdabb6823 lib/codeql/rust/elements/internal/WildcardPatConstructor.qll 5980c4e5724f88a8cb91365fc2b65a72a47183d01a37f3ff11dcd2021e612dd9 c015e94953e02dc405f8cdc1f24f7cae6b7c1134d69878e99c6858143fc7ab34 -lib/codeql/rust/elements/internal/WildcardPatImpl.qll 01e5fac111cce3bb139fc290dbdb2a80e7369a90952178228efeb025915d40b7 875e91fb1354ab8d94d5fa426b63714c70904f53d7bab15158fcbc290c62a0f1 lib/codeql/rust/elements/internal/YeetExprConstructor.qll 7763e1717d3672156587250a093dd21680ad88c8224a815b472e1c9bba18f976 70dd1fd50824902362554c8c6075468060d0abbe3b3335957be335057512a417 lib/codeql/rust/elements/internal/YeetExprImpl.qll e8924147c3ebe0c32d04c5b33edfd82ae965c32479acfd4429eeab525cf42efb b2debcfa42df901f254c58705a5009825ec153464c9ab4b323aa439e5924e59e lib/codeql/rust/elements/internal/YieldExprConstructor.qll 8cbfa6405acb151ee31ccc7c89336948a597d783e8890e5c3e53853850871712 966f685eb6b9063bc359213323d3ff760b536158ecd17608e7618a3e9adf475f @@ -465,7 +423,7 @@ lib/codeql/rust/elements/internal/generated/Attr.qll 2e7983b2c462750065ed58cc10c lib/codeql/rust/elements/internal/generated/AwaitExpr.qll 1d71af702a1f397fb231fae3e0642b3deeba0cd5a43c1d8fabdff29cac979340 e0bfa007bdecc5a09a266d449d723ae35f5a24fbdfc11e4e48aeea3ec0c5147c lib/codeql/rust/elements/internal/generated/BecomeExpr.qll 7a211b785a4a2f961242d1d73fd031d381aad809f7b600ce7f7f864518bb7242 17a0388680007871748cfdc6621f700a7c2817b9601e1bd817fb48561e7c63ad lib/codeql/rust/elements/internal/generated/BinaryExpr.qll 64e9bd9c571edd6e5f3e7662b956b1d87fa0354ce6fe95da9caf25ac16b66c68 3fca09fdbe879db2ca3293618896a462e96376a2963d15cce3d5b1baac552fcb -lib/codeql/rust/elements/internal/generated/BlockExpr.qll ccfbdc7bd268735a0424ff08dcf37d0e1fed61d5fe0520593c23f2490d400438 0facad59f6aba13ee0c069b691c99f52c04b723a2bfad4da226190c3c42dcabf +lib/codeql/rust/elements/internal/generated/BlockExpr.qll 5a5ddbe34bc478a7bd9b0d07d3b6f017c2d1f20581d859251a963314e6514d1f 9804c30b8b279038b864c52557535f854bd012bacdfe8e5840f1f777c74e52df lib/codeql/rust/elements/internal/generated/BoxPat.qll ec946a3e671ab7417e04b0207967adad004df512c570c4f0780ca5816d12d75f b0e64860855c4e85914042b1a51034899ff7cd1b2c6857188de89310a2726ea3 lib/codeql/rust/elements/internal/generated/BreakExpr.qll 0f428a8b2f4209b134c2ffc3e1c93c30bc6b0e9c9172f140cefa88c1f77d8690 957b39f38ff6befe9061f55bc0b403c2f1c366dd0cf63b874bae6f8216576d76 lib/codeql/rust/elements/internal/generated/CallExpr.qll 23ee64e3bf643cd5e6ff705181d2bb31e1aeaffecb5bdce73836172dbf15f12f 34b280139b1f8f70d78e1432392f03c971be392e8cb68d014eb325d0c101bddd @@ -492,12 +450,12 @@ lib/codeql/rust/elements/internal/generated/ExternItemList.qll 6bc97fdae6c411cab lib/codeql/rust/elements/internal/generated/FieldExpr.qll 3e506b5cb93793ec30f56bb637a600db869fcba6181b068516a671d55c362739 7bbf953696d763ad6b210f378f487ba85b875fa115b22c0c0508599a63633502 lib/codeql/rust/elements/internal/generated/FieldList.qll 43c13c6e3c9ba75a7a4cb870fc4f18752001584d48b9df0734055a6ebb789331 7c51b0b13eb02f1286d3365e53a976ba2655c4dbd8e735bc11c8b205c829e1ee lib/codeql/rust/elements/internal/generated/FnPtrType.qll 748d766dbefd19a7d644734c57885eeede66897029bbfe1b87919517f43bfde2 5a7d80acc00e56594ed85026a8ea4923104d2e98c2e42db8c5bcd32ddd164e48 -lib/codeql/rust/elements/internal/generated/ForExpr.qll 541b62b48911d4999f9ed64ab6c8b9910073ac4add0225761f319677328cf120 976c3a91c9eedfb1e2d9ea76ac501348643b3d23c723d7a777042258d416d091 +lib/codeql/rust/elements/internal/generated/ForExpr.qll d81751e9599874a1292a0aace80b2de60ab36fc43f74ec08fbdfe044fc19e5c1 34a64586f8ffbadd44d0e747f69ab550a16149b658a9c92d9593689cb9a4f6fc lib/codeql/rust/elements/internal/generated/ForType.qll 3d43d044a1189281f09c55caafb6c8020a836f49e2866077086101925a573cf2 646b59bfd1b428aaf7211f574c49f79cb4c6a79ca151aa0663b2b31480298721 -lib/codeql/rust/elements/internal/generated/Format.qll 37ad20cf2bf363b4027a8913d095292c8a4eb8ccdf2a9965f2fb7d41930f9bfe 329b89cdd75ce951269273dd18897e32ff5cfcc94f451001c64143386c1e48dd +lib/codeql/rust/elements/internal/generated/Format.qll df7ef61e6ba61fa0eb093f8e6b3e7a0329104e03f659c9507db9535b8b4ea759 ef8ddd98405fc84938ad8cd5f87d2858e01d06a6bb00566a785a984b60a79dc6 lib/codeql/rust/elements/internal/generated/FormatArgsArg.qll e07a1ae310f590003f1b88fada7dcf4847c99adb9d4c838d1c88e66e1da85c5f 0ef7342451fe2cb06e765fb4b33bb8c4a9b927f5edbc8feb5c6ba3655697f447 -lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 40d6daa7d2bafb33798a21d79774dc802cfbd7a31618ac3bd0149399ea2bf893 d1172e2151791228559004792e125fc4625f6a26ffad25f29efb0ad263bf8795 -lib/codeql/rust/elements/internal/generated/FormatArgument.qll 00646f38217a66978b8b2648cca39dddbed22ece693b26cb682f019fbfedda95 e364e085f967847a7ed21b76156a9203d64032f0f0eea357b4779885a41bf9a7 +lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll 8aed8715a27d3af3de56ded4610c6792a25216b1544eb7e57c8b0b37c14bd9c1 590a2b0063d2ecd00bbbd1ce29603c8fd69972e34e6daddf309c915ce4ec1375 +lib/codeql/rust/elements/internal/generated/FormatArgument.qll cd05153276e63e689c95d5537fbc7d892615f62e110323759ef02e23a7587407 be2a4531b498f01625effa4c631d51ee8857698b00cfb829074120a0f2696d57 lib/codeql/rust/elements/internal/generated/FormatTemplateVariableAccess.qll a6175214fad445df9234b3ee9bf5147da75baf82473fb8d384b455e3add0dac1 a928db0ff126b2e54a18f5c488232abd1bd6c5eda24591d3c3bb80c6ee71c770 lib/codeql/rust/elements/internal/generated/Function.qll f285ee0c771f897eba6db34a7e98f3cfb7db91b0df252ff4b37fc9d779de0bfb 07401e832565ff376acda219514c2e2bbe4ae5058c76a73b40ca6ca66f1626c7 lib/codeql/rust/elements/internal/generated/GenericArg.qll 464da0ba1c5ddcd1be68617167f177773d99b5ac4775ec8ea24d503e789a9099 6faa1033d59baf7c210ac4837a55781cfc054b7acbad8027faf4630dbfa6e101 @@ -513,6 +471,7 @@ lib/codeql/rust/elements/internal/generated/InferType.qll 23ee25135c59ea5578cdf7 lib/codeql/rust/elements/internal/generated/Item.qll 25e645cb41222c21065798fb6cb0488bfef007aeb9b89717f58913f9b29d5559 3146941e55db2ff7c51ec030b4414e20d66d154cf6854b1a3fa42e74a09dfb77 lib/codeql/rust/elements/internal/generated/ItemList.qll 73c8398a96d4caa47a2dc114d76c657bd3fcc59e4c63cb397ffac4a85b8cf8ab 540a13ca68d414e3727c3d53c6b1cc97687994d572bc74b3df99ecc8b7d8e791 lib/codeql/rust/elements/internal/generated/Label.qll 6630fe16e9d2de6c759ff2684f5b9950bc8566a1525c835c131ebb26f3eea63e 671143775e811fd88ec90961837a6c0ee4db96e54f42efd80c5ae2571661f108 +lib/codeql/rust/elements/internal/generated/LabelableExpr.qll 896fd165b438b60d7169e8f30fa2a94946490c4d284e1bbadfec4253b909ee6c 5c6b029ea0b22cf096df2b15fe6f9384ad3e65b50b253cae7f19a2e5ffb04a58 lib/codeql/rust/elements/internal/generated/LetElse.qll 7ca556118b5446bfc85abba8f0edd4970e029b30d414ea824a1b5f568310a76c a403540881336f9d0269cbcdb4b87107a17ab234a985247dc52a380f150a1641 lib/codeql/rust/elements/internal/generated/LetExpr.qll 9af0f89b294c8a0a751317e7074fe370339563d36c1df4911d1ea082a4df77fd 68272593d1feb88990bfbd0b8c222776f085e49694894384fc6d96e9464ba734 lib/codeql/rust/elements/internal/generated/LetStmt.qll aa1852db86ec29f857a90677f0c6b4a07f0fd965fc193d4141be95ce15862fca 40f32a37c0cc161b099fe0b4c7d713da928781d3e2c3de90db991df1d9062647 @@ -522,7 +481,8 @@ lib/codeql/rust/elements/internal/generated/LifetimeParam.qll bcbde38bfb99034e47 lib/codeql/rust/elements/internal/generated/LiteralExpr.qll f3a564d0a3ed0d915f5ab48e12246777e4972ad987cd9deaafeb94cf407b2877 2337c3d5f60361bd10f6aeca301e88255f5dffb85301cf36cbbfa1a65bfad1cd lib/codeql/rust/elements/internal/generated/LiteralPat.qll ecc2bfe559abfce1be873fbf7b61b5728897c9afc3bb3f69551d8320d273da71 42196fb6a4a0ff9b570fd0bdbc920f24744b3f46772efbb46648af7fbfe1fbda lib/codeql/rust/elements/internal/generated/Locatable.qll c897dc1bdd4dfcb6ded83a4a93332ca3d8f421bae02493ea2a0555023071775e b32d242f8c9480dc9b53c1e13a5cb8dcfce575b0373991c082c1db460a3e37b8 -lib/codeql/rust/elements/internal/generated/LoopExpr.qll 22b755dfaf238ecea722c0c94c399992014e23481ec6fdd61f803bbec012b6f9 08731630c2dc05aa1e0ada222a6057752d9ce737329c62076708828247a358be +lib/codeql/rust/elements/internal/generated/LoopExpr.qll db6bc87e795c9852426ec661fa2c2c54106805897408b43a67f5b82fb4657afd 1492866ccf8213469be85bbdbcae0142f4e2a39df305d4c0d664229ecd1ebdb9 +lib/codeql/rust/elements/internal/generated/LoopingExpr.qll 0792c38d84b8c68114da2bbdfef32ef803b696cb0fd06e10e101756d5c46976c 111fe961fad512722006323c3f2a075fddf59bd3eb5c7afc349835fcec8eb102 lib/codeql/rust/elements/internal/generated/MacroCall.qll fc8988696493992cc4fdce8c0e5610c54ee92ea52ebb05262338f8b612353f50 188a2d7a484bd402a521787371e64f6e00e928306c8d437e6b19bf890a7aa14e lib/codeql/rust/elements/internal/generated/MacroDef.qll e9b3f07ba41aa12a8e0bd6ec1437b26a6c363065ce134b6d059478e96c2273a6 87470dea99da1a6afb3a19565291f9382e851ba864b50a995ac6f29589efbd70 lib/codeql/rust/elements/internal/generated/MacroExpr.qll 03a1daa41866f51e479ac20f51f8406d04e9946b24f3875e3cf75a6b172c3d35 1ae8ca0ee96bd2be32575d87c07cc999a6ff7770151b66c0e3406f9454153786 @@ -549,20 +509,20 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll c808c9d84dd7800573832b lib/codeql/rust/elements/internal/generated/ParenExpr.qll bc0731505bfe88516205ec360582a4222d2681d11342c93e15258590ddee82f2 d4bd6e0c80cf1d63746c88d4bcb3a01d4c75732e5da09e3ebd9437ced227fb60 lib/codeql/rust/elements/internal/generated/ParenPat.qll ce24b8f8ecbf0f204af200317405724063887257460c80cf250c39b2fdf37185 e7c87d37e1a0ca7ea03840017e1aa9ddb7f927f1f3b6396c0305b46aeee33db6 lib/codeql/rust/elements/internal/generated/ParenType.qll 9cc954d73f8330dcac7b475f97748b63af5c8766dee9d2f2872c0a7e4c903537 c07534c8a9c683c4a9b11d490095647e420de0a0bfc23273eaf6f31b00244273 -lib/codeql/rust/elements/internal/generated/ParentChild.qll b4d25c43ed44715053255c3c2f8aeb8d21826adc365f24026b2123a4f25cba86 1bc4bb0380a1a8b69055ffeac203b11b2a1b94e5ad88d1b32ff659e8feb26016 +lib/codeql/rust/elements/internal/generated/ParentChild.qll 52186ab2aead10bbbaab401272afff0b8247b0050064123d0e45d972ec501dee f082318c0da678845763d6070283872b94b59425fbaa305582b5fe72da03e7e6 lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 -lib/codeql/rust/elements/internal/generated/Path.qll f2b1be2f8f44001a6533533c978c4a9a8b7d64838d6f39eef5f0c0e7890611b8 d724a00a38f42429ffa8fb3bffbb5ec69e16a32ceeeb1d1f026fc7adf87424a8 +lib/codeql/rust/elements/internal/generated/Path.qll 4c1c8e840ed57880e574142b081b11d7a7428a009f10e3aa8f4645e211f6b2e0 989668cf0f1bdee7557e2f97c01e41d2a56848227fed41477833f5fc1e1d35f6 lib/codeql/rust/elements/internal/generated/PathExpr.qll 2096e3c1db22ee488a761690adabfc9cfdea501c99f7c5d96c0019cb113fc506 54245ce0449c4e263173213df01e079d5168a758503a5dbd61b25ad35a311140 lib/codeql/rust/elements/internal/generated/PathExprBase.qll d8218e201b8557fa6d9ca2c30b764e5ad9a04a2e4fb695cc7219bbd7636a6ac2 4ef178426d7095a156f4f8c459b4d16f63abc64336cb50a6cf883a5f7ee09113 lib/codeql/rust/elements/internal/generated/PathPat.qll 98c9938d6a359fd717829b196eb09701d2c798e18c1f43fa7b2a9145afdf6c19 caba2e629cae08682baac90a76ae9a48cda2d7d6f9c23d506fa0ff3f292978a4 -lib/codeql/rust/elements/internal/generated/PathSegment.qll 4621597fd86246f788b8f9ca73f6b0f27929fc04261ce3ccf85da1183071431d aadda8bce386a3b7a9c53b98465eedcc4f724e37b8a904c1775af5b7ffb041ee -lib/codeql/rust/elements/internal/generated/PathType.qll 45de78e5374d6eb0446e2112ec72d3692c2811df9fa2ad03d0127e426940abe3 622cf70408413a565a0dac58f451035ac1339c8d0ee5b24f630680201cb0aa48 +lib/codeql/rust/elements/internal/generated/PathSegment.qll 0fa07886deb0fc4d909d7edf691238a344f2739900aafb168cbac171eb1729a8 8f4bb418d8bea5e40128a87977c57d0a9183d06d111601ad93130c8615c11465 +lib/codeql/rust/elements/internal/generated/PathType.qll df6fd322ba0d99d6cb315edce8dbf099b661b84fdfcc3ad629fdd1fd066c1986 e11c8615cd7b02034b47b58f30a7b6fcbc6d33ec53303288dfd34d9a25f5a186 lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1 lib/codeql/rust/elements/internal/generated/PtrType.qll 40099c5a4041314b66932dfd777c9e2bef90a0711fb8d7c2c2cec764c003ac4a cf8297d93557356a572223d3e8acca701837c4b1f54e8d4351ba195fb7ed27f8 lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll ea294a3ba33fd1bc632046c4fedbcb84dcb961a8e4599969d65893b19d90e590 ea294a3ba33fd1bc632046c4fedbcb84dcb961a8e4599969d65893b19d90e590 lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll efd93730de217cf50dcba5875595263a5eadf9f7e4e1272401342a094d158614 229b251b3d118932e31e78ac4dfb75f48b766f240f20d436062785606d44467b -lib/codeql/rust/elements/internal/generated/Raw.qll 5f83209cda8319c5c6c932631b60c6f2163d2d9cf7be63f63523e2206c01d004 3581039746e86365f37644e86ac2c89d67e2123aa1b039d9e0afdffc7156c96d +lib/codeql/rust/elements/internal/generated/Raw.qll b23d3574920376ca7c52858d6ad2ea6670640812422329f9c44f699075c16d89 13c1a199de3e71f012bdab0fa2b982f1c92f95536b07bbbe816e680a0e64ad71 lib/codeql/rust/elements/internal/generated/RecordExpr.qll eb6cb662e463f9260efae1a6ce874fa781172063b916ef1963f861e9942d308d 1a21cbccc8f3799ff13281e822818ebfb21d81591720a427cac3625512cb9d40 lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1 lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0 @@ -588,7 +548,7 @@ lib/codeql/rust/elements/internal/generated/Static.qll 5fbd6879858cf356d4bdaa6da lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b lib/codeql/rust/elements/internal/generated/StmtList.qll a667193e32341e17400867c6e359878c4e645ef9f5f4d97676afc0283a33a026 a320ed678ee359302e2fc1b70a9476705cd616fcfa44a499d32f0c7715627f73 lib/codeql/rust/elements/internal/generated/Struct.qll 4d57f0db12dc7ad3e31e750a24172ef1505406b4dab16386af0674bd18bf8f4b 1a73c83df926b996f629316f74c61ea775be04532ab61b56af904223354f033e -lib/codeql/rust/elements/internal/generated/Synth.qll 1ba88215c3f0640558a644534b954e4b93acb15a0f51a1e4887230f451718aa9 747eb3bec1c7245e59ea2b500604f5b4e614e4f061473d1a22fa398ee48ba080 +lib/codeql/rust/elements/internal/generated/Synth.qll 0e5767568fd119df13928adf00950586f5f9f355dae520059b2d6daa7a2bda56 219b40f6458fec2cc436dc2cf80bb1dbfb34dfdbe8576606b5e25f78d36d6210 lib/codeql/rust/elements/internal/generated/SynthConstructors.qll e929c49ea60810a2bbc19ad38110b8bbaf21db54dae90393b21a3459a54abf6f e929c49ea60810a2bbc19ad38110b8bbaf21db54dae90393b21a3459a54abf6f lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b lib/codeql/rust/elements/internal/generated/TokenTree.qll 8577c2b097c1be2f0f7daa5acfcf146f78674a424d99563e08a84dd3e6d91b46 d2f30764e84dbfc0a6a5d3d8a5f935cd432413688cb32da9c94e420fbc10665c @@ -619,11 +579,11 @@ lib/codeql/rust/elements/internal/generated/VariantList.qll 4eb923ca341033c256ca lib/codeql/rust/elements/internal/generated/Visibility.qll aba81820f30bed0fd2cd06831f7256af15ae32525b2a437896420b4cc067ea38 d6aed90b27124b812daf2ddd14b4e181277cbe638b4ccaab74e27681ac30e4ab lib/codeql/rust/elements/internal/generated/WhereClause.qll d6c8f72bbec5d71c024f0d365c1c5e474f4d24ded0d34c56c1f66b1e4a384e9d ed14311d140eee00d3b26a4972f53e20d5af1bddf88fb5618e7e2d3ae1d816f3 lib/codeql/rust/elements/internal/generated/WherePred.qll 342050e824ca6eb6116488d46cfc03efa79193b4de6049e1f5d4a9fe527b3036 ed07a81de7d63f853c93cbb7291eea3d7169953e34c2f2f98b570028dd1f8cd9 -lib/codeql/rust/elements/internal/generated/WhileExpr.qll fec8a9211b82a80601bf731db17409c5de6bf145295623bd86e28f96452fd91d 3916cf0c0e3b82b834727fc37809dd3e158f395bdf39971abe40b98e5f95a4d2 +lib/codeql/rust/elements/internal/generated/WhileExpr.qll 7edf1f23fbf953a2baabcdbf753a20dff9cf2bc645dcf935f1e68f412971a8f7 d2fa7ada1f48f6b4566c75747584068e925be925d39d6e6ebf61d21bde3b6522 lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499 lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85 -lib/codeql/rust/elements.qll 173d5ffbcc2874757033caab37559e84dbcbfed319730f8e41a4e9e10b146835 173d5ffbcc2874757033caab37559e84dbcbfed319730f8e41a4e9e10b146835 +lib/codeql/rust/elements.qll 76fe494d20d2665777bcb5c5ced016a262789a0e6aa874c1a77ce4cb134422b6 76fe494d20d2665777bcb5c5ced016a262789a0e6aa874c1a77ce4cb134422b6 test/extractor-tests/generated/Abi/Abi.ql 7f6e7dc4af86eca3ebdc79b10373988cd0871bd78b51997d3cffd969105e5fdd 2f936b6ca005c6157c755121584410c03e4a3949c23bee302fbe05ee10ce118f test/extractor-tests/generated/Abi/Abi_getAbiString.ql a496762fcec5a0887b87023bbf93e9b650f02e20113e25c44d6e4281ae8f5335 14109c7ce11ba25e3cd6e7f1b3fcb4cb00622f2a4eac91bfe43145c5f366bc52 test/extractor-tests/generated/ArgList/ArgList.ql e412927756e72165d0e7c5c9bd3fca89d08197bbf760db8fb7683c64bb2229bc 043dba8506946fbb87753e22c387987d7eded6ddb963aa067f9e60ef9024d684 @@ -659,7 +619,7 @@ test/extractor-tests/generated/BinaryExpr/BinaryExpr_getAttr.ql 26d985ac4b668d78 test/extractor-tests/generated/BinaryExpr/BinaryExpr_getLhs.ql c3f19d8a60066ad6b1810291a669473c75b659cd2f6ac3ab9ed3db2203d4145c c05c5e0226e30f923155669ffc79cfe63af1ca464e8dfc85888dda5f7049711b test/extractor-tests/generated/BinaryExpr/BinaryExpr_getOperatorName.ql 33612159be1c111e3306009d0b04579450fc962a81119b6ea4e255d3c409b401 1a0995b298f50242217cfef81dca8ac978e19e06f90a5f4caadcb6f84460fec2 test/extractor-tests/generated/BinaryExpr/BinaryExpr_getRhs.ql 3bcd36b678e87d5c29a43b69c54c80468a89aefa7e69481b48158ae794a53160 a629dc1472b3f6fd7c608ff760e83d8e1363db81dfe9a4b2968690c2ba4925ca -test/extractor-tests/generated/BlockExpr/BlockExpr.ql 0ab66b190d4e2aa784e61088c4779ef4d08cb4453677ea087c4f9aa369494bc2 1c3b5794008114d1297695d82590220929e3974e27836b2c6062d14b73379a40 +test/extractor-tests/generated/BlockExpr/BlockExpr.ql 19caa39aaa39356219dda740b7152f85e43a4f8d6295841e2c535c7e3bda7a5a bd668574ba41021e758e391d4790b871439badb2486ccf6a5aaf788ad6ae4142 test/extractor-tests/generated/BlockExpr/BlockExpr_getAttr.ql 15d4d9853d3262ce6ec629c075c60a76eb112dcafe34b71df0e09b39282223cf 792c498bc7079bb5b93034b8a87db3b275a591d78954e844821aeacffe4258ea test/extractor-tests/generated/BlockExpr/BlockExpr_getLabel.ql de3c28a2677ed71ebd95207aa43ce270765f7f556283f095f1f6296622b80cbc 414ebbb2bfbe4350f933fc3d3636b49a6bb8242e200180780caf95ab8523adb0 test/extractor-tests/generated/BlockExpr/BlockExpr_getStmtList.ql 8c391dfeb69bd92c547a2417bf231cc960a8f34845802722214294728772316a f3e847fa594e9d9cf25d09a0396a10176aad1100c1977a24756ff6287a79e69e @@ -743,7 +703,7 @@ test/extractor-tests/generated/FnPtrType/FnPtrType.ql 50b76d678582cd0b8d7cc4a765 test/extractor-tests/generated/FnPtrType/FnPtrType_getAbi.ql de1706382c2980c02dbdd295e0a2320c992afa3f19af0c2378b9980a7cd0c481 a3fa36711949d9d5ac53cc5dd39cb19b397c3f2e47c1d457df470c6e5142f9be test/extractor-tests/generated/FnPtrType/FnPtrType_getParamList.ql 9ea393acf37919e2fd1bbc16e738440e00a56552bf80baef9bfd2a9a405afb93 3b4237b22eea569cef0081eb3ea16b2d0f01f8f070f21e16390267e9cbe0cf57 test/extractor-tests/generated/FnPtrType/FnPtrType_getRetType.ql 57f662e4778e1bf4103f061bb8085def0708528f94045c9ff4a95ce802fff13d 924b924c7d766458e956afa0963e6eb1bfc083e5f9aeae64cf2d08929f79612c -test/extractor-tests/generated/ForExpr/ForExpr.ql eff335a301b9a71292bb6da0dffdf901c7a51df9960e9250f9eb980aaaa0c7ae ce7ab100c21c6fc334a4445b2ee311ae6c67992ef659ca32c94d60ac884936e3 +test/extractor-tests/generated/ForExpr/ForExpr.ql 1f8b7a9bbe7a8c077864be64dc51d91ec267c4f34f1cad80fc79902cc0af04ff ae999fb206b04ed81fa08bdd7617cbfe932c5e4109285e10108613cdebba8f7a test/extractor-tests/generated/ForExpr/ForExpr_getAttr.ql d3399b7453e10ff48efc79ec38dd9b6e06bb472b9c39f559242d003e7f63b1d9 ba37e6bf129e1c2f9094e093bbfbf41864f2cb7725a64334f9443270dafdbfdc test/extractor-tests/generated/ForExpr/ForExpr_getIterable.ql 90a6540f8a91cfe3ed1bdde1e680786ce5a00edbb797a8fe70bcc0507c438fcc 65c67ad5890aa502628ee73efd26bcbd4597a8bdfc9839233ede9e26393638f8 test/extractor-tests/generated/ForExpr/ForExpr_getLabel.ql ce90da75e040f448d524187357f3ceededba72407a84c1dc8e1498ed9788044d 0e23d43e0b3412fe90c6a5a4331f8da85eebe19e05b8c7d9710056857280797b @@ -752,13 +712,19 @@ test/extractor-tests/generated/ForExpr/ForExpr_getPat.ql 1e0205a9b3a58fd2ddba49e test/extractor-tests/generated/ForType/ForType.ql ba930d0c4fe52d57449ce4025b1c3e49c688afc5ef18ee8ac1ed7a9fd3eb8d41 08e9aa0301a942f6f9564ddeddc69606f3e2916e1b551cc56ae3b6048c56ce61 test/extractor-tests/generated/ForType/ForType_getGenericParamList.ql e25cd79737bbae92d8f417c6bbf6fb8ae660976b8005cd91d0900c7076fdd827 b1e32b7e3ca9f29a4564f83e37ae53de6baf04837a393e6dedc64a01cc7d10e8 test/extractor-tests/generated/ForType/ForType_getTy.ql e932d3412828bb83afc42e2dc1a4cbe9fcf25ec9a9617ec138722f834091a61a 298fc9df34b2cb436c8f180c4d229341ee4a73e3c451b905f017f32a6f65056c -test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.ql a521903c73f79e2616f7b8ef76790e11cbf432f8437825d52d117da232022b9e 4cb195d09ecb51e5bbd5c1c069ec1720f74fc074efc88b0f5c07cfc140167775 -test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.ql 7e1a7f902fb661660760d2a2f3f4cb6818a0c9f5b5061ede6ae80223774e4e09 8a50f64cba6f56320631206c801160201e3c98e74367bb035d689baaa9b4e411 -test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.ql 0e2f24388d516e14d195957163a2d5d97029c9e11a83ca71cf69e00ecc0bb2a8 dab2969f5ae6a15ec331c0152e7c116d1ee2c3d073b2d4da59ffbcb83404c65f -test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql 0cd439f61569ecf046e9548c458329647f331bfa034ae8b3d4f7628595881287 013a948607e1ac96100ea9a8cd3c8f357e378ac21baa015dcf4927022c2bdafb +test/extractor-tests/generated/FormatArgsExpr/Format.ql 25268dd7ad2a58b071c3a38164944c1b7389dfdda01c99ef2694a475596341b4 0a3f674d5a4f005835b9a5ba11a6e8bf58477829258f30ae7d8f76f8986f7b7f +test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql a521903c73f79e2616f7b8ef76790e11cbf432f8437825d52d117da232022b9e 4cb195d09ecb51e5bbd5c1c069ec1720f74fc074efc88b0f5c07cfc140167775 +test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.ql 7e1a7f902fb661660760d2a2f3f4cb6818a0c9f5b5061ede6ae80223774e4e09 8a50f64cba6f56320631206c801160201e3c98e74367bb035d689baaa9b4e411 +test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.ql 0e2f24388d516e14d195957163a2d5d97029c9e11a83ca71cf69e00ecc0bb2a8 dab2969f5ae6a15ec331c0152e7c116d1ee2c3d073b2d4da59ffbcb83404c65f +test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql 7b6f09b23d0dffa19b8dddf7f5cfe53068f8a8e5279e235c6d54e60616bd0822 47db74f035770ce708a00355acbfd4ae99152b7eb29cf28001985806a4efe5aa test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.ql 8f692486be1546b914b17abdff4a989dfbaa889bfa1fc44597f4357806c1a1dd da9fd237e31e9c8dd0ef0c3c968157815b87d3e8dcdfd74674c988ce2ab6d270 test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getAttr.ql 1f9bf1344f942e65c3a3591b6ae04d3f5a2a1a65459bce0d976698de7d8a5958 02acb861d8ab4d32cf144c589881a888c3da5e2ade27e8c85fec3ae45219bb3b +test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.ql 02d3fad540700966488b24c62dcf200548154a2f10f578ee2995d8c4ebe32287 cccfe779b9804c2bb968a2b1f54da8a72393805c2c8b31d7160e8538f2f335f2 test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.ql c912ac37275cbe7b3b29607bed1a3190c80779436422c14a475113e1bfd91a54 ef90f67a9b952a38ce557b1afbf0b5ce8551e83ddfaad8309a0c9523e40b5ea7 +test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql 7a7ee3a3322b4af8cb3b525cfed8cc9719d136ea80aa6b3fb30c7e16394dd93f 5aa8a77d7741b02f8ceb9e5991efa4c2c43c6f1624989218990e985108dae535 +test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.ql 7bd4ec3dde2ef0463585794101e6cc426c368b0e4ab95fbb1f24f8f0a76cf471 e7b01e8b21df5b22c51643e2c909c6fc4ca96fda41b3290c907ba228abe8669b +test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql 2793ba1ff52182dab992d82d3767a000928f6b2fbfdb621349cafc183f0d2480 c3777d03214f7feb9020de3ce45af6556129e39e9b30d083de605b70ab9a0a12 +test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.ql 26d592398a17795427b5b6b51ff4a013ee15c31443e732a000baca5f2e65acca 7940a864b84b89e84d7fb186599cb8b6bcbead7141c592b8ab0c59fcd380d5fb test/extractor-tests/generated/Function/Function.ql c1c2a9b68c35f839ccd2b5e62e87d1acd94dcc2a3dc4c307c269b84b2a0806e6 1c446f19d2f81dd139aa5a1578d1b165e13bddbaeab8cfee8f0430bced3a99ab test/extractor-tests/generated/Function/Function_getAbi.ql e5c9c97de036ddd51cae5d99d41847c35c6b2eabbbd145f4467cb501edc606d8 0b81511528bd0ef9e63b19edfc3cb638d8af43eb87d018fad69d6ef8f8221454 test/extractor-tests/generated/Function/Function_getAttr.ql 44067ee11bdec8e91774ff10de0704a8c5c1b60816d587378e86bf3d82e1f660 b4bebf9441bda1f2d1e34e9261e07a7468cbabf53cf8047384f3c8b11869f04e @@ -831,7 +797,7 @@ test/extractor-tests/generated/LiteralExpr/LiteralExpr_getAttr.ql 6e76da2bb7858f test/extractor-tests/generated/LiteralExpr/LiteralExpr_getTextValue.ql 7049fec0bbbf0e048af1ff318f42f43d0f8a7354a5638dc21174c4ea725b54ce 2edc94cc0a7f58ec9808b63ddb4d20a3907c88e50bd9ffb14f0281b433f5621b test/extractor-tests/generated/LiteralPat/LiteralPat.ql 3d3db6cad0eb13f84b69efa24a9f9a32d35c62582274d2751cc3ac54dca3b538 7feb64af87546ea64c139c61ac20176a99ad40b9949b361742a424b164fe6d54 test/extractor-tests/generated/LiteralPat/LiteralPat_getLiteral.ql 2cb03a22220e99237d4f3cd94d5090757cd6e57df708d32e80bca3964507651f 4dd9a6c1e23ad9851d9aa8c42c79535f7a2c7224bbaaff286eac7fd04b39c6f0 -test/extractor-tests/generated/LoopExpr/LoopExpr.ql 636c28bff5f8c1ca0fb834f614b3215e02bdb00826fd8be26f9c4fa22c68a79a 1694c27850419d4edf366fe3f1d60fff578094adc3aeeb9691a3d6a8ec0100e1 +test/extractor-tests/generated/LoopExpr/LoopExpr.ql 37b320acefa3734331f87414de270c98ab3309fe069d428550738197e3498a8c e744c25640b5c46aab53ce5114b789e13319572b0c99d0f2bc3c177849e61541 test/extractor-tests/generated/LoopExpr/LoopExpr_getAttr.ql d557c1a34ae8762b32702d6b50e79c25bc506275c33a896b6b94bbbe73d04c49 34846c9eefa0219f4a16e28b518b2afa23f372d0aa03b08d042c5a35375e0cd6 test/extractor-tests/generated/LoopExpr/LoopExpr_getLabel.ql 0b77b9d9fb5903d37bce5a2c0d6b276e6269da56fcb37b83cd931872fb88490f c7f09c526e59dcadec13ec9719980d68b8619d630caab2c26b8368b06c1f2cc0 test/extractor-tests/generated/LoopExpr/LoopExpr_getLoopBody.ql 0267f54077640f3dfeb38524577e4a1229115eeb1c839398d0c5f460c1d65129 96ec876635b8c561f7add19e57574444f630eae3df9ab9bc33ac180e61f3a7b8 @@ -927,25 +893,25 @@ test/extractor-tests/generated/ParenPat/ParenPat_getPat.ql 96f3db0ec4e71fd870619 test/extractor-tests/generated/ParenType/ParenType.ql 81c8ad667397ce36157941abd9b879e9305a440018853af4528eb737ae4d2935 3ef3b86203b0143be2d7f7f4833f55fd6c226cb9205e3c1940b6c2a1371622f3 test/extractor-tests/generated/ParenType/ParenType_getTy.ql 41dd6605e7b348618156712b559e2f1b6aac02d6c727e8cbf8653530794ec969 30ac6611c730e76cfb75f98efcf817783a50cec0cf3b3197459d7642f74dde85 test/extractor-tests/generated/Path/Path.ql f17c1c4d23c0d5e9776cee84444f6ee7445de88afbc1f26c34b96e13ab618158 89499cb0f63b3634d6b5e2b8c4a13bd4401ce82e54af0ab46e41a34b0288eeb9 +test/extractor-tests/generated/Path/PathExpr.ql b9696cd7ad9f3874e4bc4b1b9c77f42f06ab6c61b77fb641458da63667087b9b db84a7a8dd05e30ff80733af01f08d43ff031bb4b3e3af06332a73ba7e7bbc43 +test/extractor-tests/generated/Path/PathExpr_getAttr.ql 2ccac48cd91d86670c1d2742de20344135d424e6f0e3dafcc059555046f92d92 9b7b5f5f9e3674fad9b3a5bcd3cabc0dff32a95640da0fce6f4d0eb931f1757d +test/extractor-tests/generated/Path/PathExpr_getPath.ql e7894071313a74166bdd31d7cd974037fcd5a7f0e92d5eec42833266196eb858 46a06e8a1207e7a0fa175cd4b61068e5fd6c43b5575b88986409f0ac2be64c51 +test/extractor-tests/generated/Path/PathPat.ql 823732954a5882e33a37bd0bf0cafb2cec51659a5203a4831eec2516da0e49fa 54001149718a9ca15d8c0d4be63f3fe00a9f0d44fa1309e2f605d7932355ea5d +test/extractor-tests/generated/Path/PathPat_getPath.ql 6c0c71c80a6e631ea7775ec8660b470ff6b264bab14a399606cf113b1fb190fc 8e34cbb4d064db929e94652e1901ec4f26affa71e30e556b7acdff71dd622cbb +test/extractor-tests/generated/Path/PathSegment.ql efc39cea1b4c0b2b0da6434136334430d074699f84124d6bcf94c24aa854dc64 c0a4bd60c67665c058ca22a59e535e925fdb00dec95ffc5c71697fb0ed78a329 +test/extractor-tests/generated/Path/PathSegment_getGenericArgList.ql 8f6e67b3e316309f20e21d7e7944accf66b0256b76fa50ee9a714044c6ec8cea 15f10a701fc4d3f9fd6734da90790cdbc8a1ddd57bf52695740acedcb2e6e485 +test/extractor-tests/generated/Path/PathSegment_getNameRef.ql 799d284e2f9267d6bbe67aa7035e525ef347dc74cb3e2180e7b2171b5cb49674 592130bc2358989536abf62e8a261272c851483ede4f19783f7d61ffc1803e4b +test/extractor-tests/generated/Path/PathSegment_getParamList.ql e1e7b9b5062f936c33b7e7e29b21456448242df4985c6cffb54900063cfd3e63 6568e851cb6bcb32622f89d01e3aa6e7dd21940d21572a9988584e34bdf25366 +test/extractor-tests/generated/Path/PathSegment_getPathType.ql 01942da6d0b10c1d15caec6abb8c53f1dc7f8c04a91a797f572063aa003dbc4b cb21e6cb160652527ba571265297dae86beffe191dd7dfc4d0beee45cb0cda29 +test/extractor-tests/generated/Path/PathSegment_getRetType.ql 36386a514bc925f5b17ad87afba9fef7986900c1b791732de061213c6e86743f f38bcee68c1da19e70bb1e1c4a4047c763a466f1b8ef2c4f65f8c724c0b58197 +test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.ql d1db51208a311c30af369ce2fdc3a3296e7d598b27bf4960b8b34622a9d9163b 561b1e38c6d8b301fdc016e1d012dd805fde1b42b0720c17d7b15535715047f2 +test/extractor-tests/generated/Path/PathSegment_getTy.ql a0ceaf3f37e521cc92c21cc0bae929499ef3584f86349ef34808c20963d31c75 d674e56e08a6d2a7d211503a466df2cc90c35a3951e41598febf62c8dc693655 +test/extractor-tests/generated/Path/PathType.ql cb67b05cf7e4f32cbd46ac89a15f6eafe3507cc655db0b9d54a1cf8e7fbcca40 890053e7fd8cd8a92015c09588c7c646f075901cddc3eb8d57210b02b23a5944 +test/extractor-tests/generated/Path/PathType_getPath.ql 7043c7939e4f835e4b2c7e3e207637c362d7a9dbdba0151b38c873fdaf43e7a5 ee2aad1b4fb2b00e1a5d39387848aa164a39e3cd49141f07c175b205c8451bb1 test/extractor-tests/generated/Path/Path_getPart.ql 8aa45a0b58203ef1177166efbe1c2851faf4b4c9a453c83137f0c9298badcdbf b82d490d9b3a8237487cd5da8b3b6fc4aa477977b332a5c6539b3cd4e6d5b45b test/extractor-tests/generated/Path/Path_getQualifier.ql 9af95e22cdf3a65da6a41d93136aef4523db5ce81d38f6ed4bc613f1c68784d0 3102d9241a417a92c97a53ac56a7a8683463f1adc7a593cda1382c0d25b3f261 test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.ql 7c0ff524595514630de4178028260d4832bfc4f57bfddec9f8e72a6c6dbf241c 55e617380476c183ef9259199d2cfd551b07466e94bc452c4723754d0c82691b test/extractor-tests/generated/Path/Path_getResolvedPath.ql 20c8977781dfe687d5db03290612179cf1360eb47b86ea62d25d1eef62a681e7 c35b76e7d63c05dc80867285bb913042cbe90b45d4d4306df9eac2cba5e8db70 -test/extractor-tests/generated/PathExpr/PathExpr.ql b9696cd7ad9f3874e4bc4b1b9c77f42f06ab6c61b77fb641458da63667087b9b db84a7a8dd05e30ff80733af01f08d43ff031bb4b3e3af06332a73ba7e7bbc43 -test/extractor-tests/generated/PathExpr/PathExpr_getAttr.ql 2ccac48cd91d86670c1d2742de20344135d424e6f0e3dafcc059555046f92d92 9b7b5f5f9e3674fad9b3a5bcd3cabc0dff32a95640da0fce6f4d0eb931f1757d -test/extractor-tests/generated/PathExpr/PathExpr_getPath.ql e7894071313a74166bdd31d7cd974037fcd5a7f0e92d5eec42833266196eb858 46a06e8a1207e7a0fa175cd4b61068e5fd6c43b5575b88986409f0ac2be64c51 -test/extractor-tests/generated/PathPat/PathPat.ql 823732954a5882e33a37bd0bf0cafb2cec51659a5203a4831eec2516da0e49fa 54001149718a9ca15d8c0d4be63f3fe00a9f0d44fa1309e2f605d7932355ea5d -test/extractor-tests/generated/PathPat/PathPat_getPath.ql 6c0c71c80a6e631ea7775ec8660b470ff6b264bab14a399606cf113b1fb190fc 8e34cbb4d064db929e94652e1901ec4f26affa71e30e556b7acdff71dd622cbb -test/extractor-tests/generated/PathSegment/PathSegment.ql efc39cea1b4c0b2b0da6434136334430d074699f84124d6bcf94c24aa854dc64 c0a4bd60c67665c058ca22a59e535e925fdb00dec95ffc5c71697fb0ed78a329 -test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.ql 8f6e67b3e316309f20e21d7e7944accf66b0256b76fa50ee9a714044c6ec8cea 15f10a701fc4d3f9fd6734da90790cdbc8a1ddd57bf52695740acedcb2e6e485 -test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.ql 799d284e2f9267d6bbe67aa7035e525ef347dc74cb3e2180e7b2171b5cb49674 592130bc2358989536abf62e8a261272c851483ede4f19783f7d61ffc1803e4b -test/extractor-tests/generated/PathSegment/PathSegment_getParamList.ql e1e7b9b5062f936c33b7e7e29b21456448242df4985c6cffb54900063cfd3e63 6568e851cb6bcb32622f89d01e3aa6e7dd21940d21572a9988584e34bdf25366 -test/extractor-tests/generated/PathSegment/PathSegment_getPathType.ql 01942da6d0b10c1d15caec6abb8c53f1dc7f8c04a91a797f572063aa003dbc4b cb21e6cb160652527ba571265297dae86beffe191dd7dfc4d0beee45cb0cda29 -test/extractor-tests/generated/PathSegment/PathSegment_getRetType.ql 36386a514bc925f5b17ad87afba9fef7986900c1b791732de061213c6e86743f f38bcee68c1da19e70bb1e1c4a4047c763a466f1b8ef2c4f65f8c724c0b58197 -test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.ql d1db51208a311c30af369ce2fdc3a3296e7d598b27bf4960b8b34622a9d9163b 561b1e38c6d8b301fdc016e1d012dd805fde1b42b0720c17d7b15535715047f2 -test/extractor-tests/generated/PathSegment/PathSegment_getTy.ql a0ceaf3f37e521cc92c21cc0bae929499ef3584f86349ef34808c20963d31c75 d674e56e08a6d2a7d211503a466df2cc90c35a3951e41598febf62c8dc693655 -test/extractor-tests/generated/PathType/PathType.ql cb67b05cf7e4f32cbd46ac89a15f6eafe3507cc655db0b9d54a1cf8e7fbcca40 890053e7fd8cd8a92015c09588c7c646f075901cddc3eb8d57210b02b23a5944 -test/extractor-tests/generated/PathType/PathType_getPath.ql 7043c7939e4f835e4b2c7e3e207637c362d7a9dbdba0151b38c873fdaf43e7a5 ee2aad1b4fb2b00e1a5d39387848aa164a39e3cd49141f07c175b205c8451bb1 test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql 44fb7174365c6deecdc22c720d84617c6e060c05d49c41c90433451588f8aa6f 871fab471c82fede3c36edc003f9decee5bb7844c016951d28be78d0c91487e5 test/extractor-tests/generated/PrefixExpr/PrefixExpr_getAttr.ql fdad6ad5199435ded1e4a9ea6b246e76b904cd73a36aaa4780e84eef91741c5b 75d63940046e62c1efa1151b0cac45b5ec0bab5e39aec2e11d43f6c385e37984 test/extractor-tests/generated/PrefixExpr/PrefixExpr_getExpr.ql 2d1d97f6277794871fbb032ea87ac30b1aa902a74cd874720156162057ea202e b1b9880fce07d66df7ec87f12189c37adf9f233a1d0b38a1b09808d052a95642 @@ -1145,7 +1111,7 @@ test/extractor-tests/generated/WherePred/WherePred_getGenericParamList.ql 21c3aa test/extractor-tests/generated/WherePred/WherePred_getLifetime.ql e08d9d6cccf634746f42a6ee583bbb3e7e9a9edbb63242e73b2bff4463df55d8 139543750c18f88d9c1ad2cdbcf1699d597cf2264bbb6b02a7e5792444e277ef test/extractor-tests/generated/WherePred/WherePred_getTy.ql 34cee0335bbaf8946fe15e3c32449150d07a730fcca56b4faed554fbb8689e21 883976c8c27c276c402d591ebd89d076c2c4d8da4d4f738f3c860c34d4a03b97 test/extractor-tests/generated/WherePred/WherePred_getTypeBoundList.ql c78e31ff4d1822a6b76f403e5ccb8f5529b4f784e14e618833df0378adca55fc 8bb1c9b5a1cfca0f5e8335464f7439aa098063176fbd3edbaf3407169f1899e6 -test/extractor-tests/generated/WhileExpr/WhileExpr.ql e061fac7584adf999d31ed0785041e2cc14b26a1c9901281f90c859335d8f614 fb1e597e28841e3b2d275d697aa6de7158db51b70a348d634291a75b25e4e80a +test/extractor-tests/generated/WhileExpr/WhileExpr.ql 61c49414f2ed786a68b79bd9a77093e4086457edb6c136cf8a94f2ac830c2f5b 7737f724a297d011c12143e009a63926812c63c08a1067b03e8677697ab00f83 test/extractor-tests/generated/WhileExpr/WhileExpr_getAttr.ql f8527130eb2492743c0e629c97db291abcefe3d35302c840fee327ab0d8f10fd b41bedd429e5566fd68a50140ff1f50b51e2c7c351cbc8253fbc126527073f7e test/extractor-tests/generated/WhileExpr/WhileExpr_getCondition.ql 84a021806423425b24eaeb9fb9967a6aadabe823c24e77a0dfefcb3509041597 147aa8bbe4dbf9b90be2467db8207dc96aed281e722eb6b9c998442a90911a6c test/extractor-tests/generated/WhileExpr/WhileExpr_getLabel.ql 60ef4de57d85c7df23c0518b944b3839a9b2478044326829b5bf709a8c8d7240 3916e9ff50733c58afdc09837339b72a555a043f92f1c4e09e1652866029b017 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 68b893ba9c78..6daad6a68c7b 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -62,6 +62,7 @@ /lib/codeql/rust/elements/Item.qll linguist-generated /lib/codeql/rust/elements/ItemList.qll linguist-generated /lib/codeql/rust/elements/Label.qll linguist-generated +/lib/codeql/rust/elements/LabelableExpr.qll linguist-generated /lib/codeql/rust/elements/LetElse.qll linguist-generated /lib/codeql/rust/elements/LetExpr.qll linguist-generated /lib/codeql/rust/elements/LetStmt.qll linguist-generated @@ -72,6 +73,7 @@ /lib/codeql/rust/elements/LiteralPat.qll linguist-generated /lib/codeql/rust/elements/Locatable.qll linguist-generated /lib/codeql/rust/elements/LoopExpr.qll linguist-generated +/lib/codeql/rust/elements/LoopingExpr.qll linguist-generated /lib/codeql/rust/elements/MacroCall.qll linguist-generated /lib/codeql/rust/elements/MacroDef.qll linguist-generated /lib/codeql/rust/elements/MacroExpr.qll linguist-generated @@ -172,7 +174,6 @@ /lib/codeql/rust/elements/internal/ArgListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ArrayExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ArrayTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AsmExprConstructor.qll linguist-generated @@ -185,25 +186,19 @@ /lib/codeql/rust/elements/internal/AttrConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/AttrImpl.qll linguist-generated /lib/codeql/rust/elements/internal/AwaitExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/AwaitExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/BecomeExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/BecomeExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/BinaryExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BlockExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/BlockExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/BoxPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/BoxPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/BreakExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/CallExprBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CallExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CallExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CallableImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CastExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/CastExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureBinderConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureBinderImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ClosureExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ClosureExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/CommentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstArgConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ConstArgImpl.qll linguist-generated @@ -217,7 +212,6 @@ /lib/codeql/rust/elements/internal/DynTraitTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/DynTraitTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/EnumConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/EnumImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ExprStmtConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExprStmtImpl.qll linguist-generated @@ -229,12 +223,10 @@ /lib/codeql/rust/elements/internal/ExternItemListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ExternItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FieldExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/FieldExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FieldListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FnPtrTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/FnPtrTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ForExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ForExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ForTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ForTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/FormatArgsArgConstructor.qll linguist-generated @@ -243,45 +235,33 @@ /lib/codeql/rust/elements/internal/FunctionConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/GenericArgListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/GenericArgListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/GenericParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/GenericParamListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/GenericParamListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IdentPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/IfExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/IfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ImplConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ImplImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ImplTraitTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/IndexExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/IndexExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/InferTypeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/InferTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ItemImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ItemListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LabelConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LabelImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LetElseConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LetElseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LetExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LetExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LetStmtConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LetStmtImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeArgConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LifetimeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LifetimeParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/LiteralPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LiteralPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/LoopExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/LoopExprImpl.qll linguist-generated +/lib/codeql/rust/elements/internal/LoopingExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroCallConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MacroCallImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroDefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MacroDefImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MacroExprConstructor.qll linguist-generated @@ -297,7 +277,6 @@ /lib/codeql/rust/elements/internal/MacroTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MacroTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/MatchArmImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MatchArmListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/MatchExprConstructor.qll linguist-generated @@ -309,46 +288,35 @@ /lib/codeql/rust/elements/internal/MissingConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/MissingImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ModuleConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ModuleImpl.qll linguist-generated /lib/codeql/rust/elements/internal/NameConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/NeverTypeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/NeverTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/OrPatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ParamListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ParamListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ParenExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParenExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ParenPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParenPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ParenTypeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ParenTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprBaseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/PathPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PathSegmentConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PathTypeConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/PathTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/PrefixExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/PtrTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RangeExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RangeExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RangePatConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RangePatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RecordExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RecordExprFieldConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RecordExprFieldListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RecordExprFieldListImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/RecordExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RecordFieldConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RecordFieldImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RecordFieldListConstructor.qll linguist-generated @@ -358,22 +326,17 @@ /lib/codeql/rust/elements/internal/RecordPatFieldImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RecordPatFieldListConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RecordPatFieldListImpl.qll linguist-generated -/lib/codeql/rust/elements/internal/RecordPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RefExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RefExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RefPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RefPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RefTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RefTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RenameConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RenameImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ResolvableImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RestPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/RestPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/RetTypeConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/RetTypeImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/ReturnExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnTypeSyntaxConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/ReturnTypeSyntaxImpl.qll linguist-generated /lib/codeql/rust/elements/internal/SelfParamConstructor.qll linguist-generated @@ -397,7 +360,6 @@ /lib/codeql/rust/elements/internal/TraitAliasConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TraitAliasImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TraitConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TraitImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TryExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TupleExprConstructor.qll linguist-generated @@ -424,12 +386,10 @@ /lib/codeql/rust/elements/internal/TypeParamImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeRefImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnextractedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnimplementedConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UnimplementedImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnionConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/UnionImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/UseImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UseTreeConstructor.qll linguist-generated @@ -447,9 +407,7 @@ /lib/codeql/rust/elements/internal/WherePredConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/WherePredImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WhileExprConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/WhileExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/WildcardPatConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/WildcardPatImpl.qll linguist-generated /lib/codeql/rust/elements/internal/YeetExprConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/YeetExprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/YieldExprConstructor.qll linguist-generated @@ -515,6 +473,7 @@ /lib/codeql/rust/elements/internal/generated/Item.qll linguist-generated /lib/codeql/rust/elements/internal/generated/ItemList.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Label.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/LabelableExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LetElse.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LetExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LetStmt.qll linguist-generated @@ -525,6 +484,7 @@ /lib/codeql/rust/elements/internal/generated/LiteralPat.qll linguist-generated /lib/codeql/rust/elements/internal/generated/Locatable.qll linguist-generated /lib/codeql/rust/elements/internal/generated/LoopExpr.qll linguist-generated +/lib/codeql/rust/elements/internal/generated/LoopingExpr.qll linguist-generated /lib/codeql/rust/elements/internal/generated/MacroCall.qll linguist-generated /lib/codeql/rust/elements/internal/generated/MacroDef.qll linguist-generated /lib/codeql/rust/elements/internal/generated/MacroExpr.qll linguist-generated @@ -754,13 +714,19 @@ /test/extractor-tests/generated/ForType/ForType.ql linguist-generated /test/extractor-tests/generated/ForType/ForType_getGenericParamList.ql linguist-generated /test/extractor-tests/generated/ForType/ForType_getTy.ql linguist-generated -/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.ql linguist-generated -/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.ql linguist-generated -/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/Format.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getAttr.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.ql linguist-generated /test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql linguist-generated +/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.ql linguist-generated /test/extractor-tests/generated/Function/Function.ql linguist-generated /test/extractor-tests/generated/Function/Function_getAbi.ql linguist-generated /test/extractor-tests/generated/Function/Function_getAttr.ql linguist-generated @@ -929,25 +895,25 @@ /test/extractor-tests/generated/ParenType/ParenType.ql linguist-generated /test/extractor-tests/generated/ParenType/ParenType_getTy.ql linguist-generated /test/extractor-tests/generated/Path/Path.ql linguist-generated +/test/extractor-tests/generated/Path/PathExpr.ql linguist-generated +/test/extractor-tests/generated/Path/PathExpr_getAttr.ql linguist-generated +/test/extractor-tests/generated/Path/PathExpr_getPath.ql linguist-generated +/test/extractor-tests/generated/Path/PathPat.ql linguist-generated +/test/extractor-tests/generated/Path/PathPat_getPath.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getNameRef.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getParamList.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getPathType.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getRetType.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.ql linguist-generated +/test/extractor-tests/generated/Path/PathSegment_getTy.ql linguist-generated +/test/extractor-tests/generated/Path/PathType.ql linguist-generated +/test/extractor-tests/generated/Path/PathType_getPath.ql linguist-generated /test/extractor-tests/generated/Path/Path_getPart.ql linguist-generated /test/extractor-tests/generated/Path/Path_getQualifier.ql linguist-generated /test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.ql linguist-generated /test/extractor-tests/generated/Path/Path_getResolvedPath.ql linguist-generated -/test/extractor-tests/generated/PathExpr/PathExpr.ql linguist-generated -/test/extractor-tests/generated/PathExpr/PathExpr_getAttr.ql linguist-generated -/test/extractor-tests/generated/PathExpr/PathExpr_getPath.ql linguist-generated -/test/extractor-tests/generated/PathPat/PathPat.ql linguist-generated -/test/extractor-tests/generated/PathPat/PathPat_getPath.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getParamList.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getPathType.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getRetType.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.ql linguist-generated -/test/extractor-tests/generated/PathSegment/PathSegment_getTy.ql linguist-generated -/test/extractor-tests/generated/PathType/PathType.ql linguist-generated -/test/extractor-tests/generated/PathType/PathType_getPath.ql linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr.ql linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr_getAttr.ql linguist-generated /test/extractor-tests/generated/PrefixExpr/PrefixExpr_getExpr.ql linguist-generated diff --git a/rust/ql/integration-tests/hello-project/functions.expected b/rust/ql/integration-tests/hello-project/functions.expected index fc49564084e3..2665ea7df769 100644 --- a/rust/ql/integration-tests/hello-project/functions.expected +++ b/rust/ql/integration-tests/hello-project/functions.expected @@ -1 +1 @@ -| src/main.rs:4:1:6:1 | main | +| src/main.rs:4:1:6:1 | fn main | diff --git a/rust/ql/integration-tests/hello-workspace/functions.expected b/rust/ql/integration-tests/hello-workspace/functions.expected index 0ec9937972e2..0633774edf73 100644 --- a/rust/ql/integration-tests/hello-workspace/functions.expected +++ b/rust/ql/integration-tests/hello-workspace/functions.expected @@ -1,2 +1,2 @@ -| exe/src/main.rs:5:1:7:1 | main | -| lib/src/a_module/mod.rs:1:1:3:1 | hello | +| exe/src/main.rs:5:1:7:1 | fn main | +| lib/src/a_module/mod.rs:1:1:3:1 | fn hello | diff --git a/rust/ql/integration-tests/options/cfg/functions.expected b/rust/ql/integration-tests/options/cfg/functions.expected index a2042c5e4c49..cd022ca510e0 100644 --- a/rust/ql/integration-tests/options/cfg/functions.expected +++ b/rust/ql/integration-tests/options/cfg/functions.expected @@ -1,3 +1,3 @@ -| src/lib.rs:7:1:8:19 | cfg_no_flag | -| src/lib.rs:10:1:11:18 | cfg_no_key | -| src/lib.rs:16:1:17:24 | pointer_width_64 | +| src/lib.rs:7:1:8:19 | fn cfg_no_flag | +| src/lib.rs:10:1:11:18 | fn cfg_no_key | +| src/lib.rs:16:1:17:24 | fn pointer_width_64 | diff --git a/rust/ql/integration-tests/options/cfg/functions.override.expected b/rust/ql/integration-tests/options/cfg/functions.override.expected index 4a19db56a741..34feddaf1490 100644 --- a/rust/ql/integration-tests/options/cfg/functions.override.expected +++ b/rust/ql/integration-tests/options/cfg/functions.override.expected @@ -1,4 +1,4 @@ -| src/lib.rs:1:1:2:16 | cfg_flag | -| src/lib.rs:4:1:5:15 | cfg_key | -| src/lib.rs:13:1:14:12 | test | -| src/lib.rs:19:1:20:24 | pointer_width_32 | +| src/lib.rs:1:1:2:16 | fn cfg_flag | +| src/lib.rs:4:1:5:15 | fn cfg_key | +| src/lib.rs:13:1:14:12 | fn test | +| src/lib.rs:19:1:20:24 | fn pointer_width_32 | diff --git a/rust/ql/integration-tests/options/features/functions.all.expected b/rust/ql/integration-tests/options/features/functions.all.expected index 5ce4cae2ab0d..1fa14be6da60 100644 --- a/rust/ql/integration-tests/options/features/functions.all.expected +++ b/rust/ql/integration-tests/options/features/functions.all.expected @@ -1,3 +1,3 @@ -| src/lib.rs:1:1:2:11 | foo | -| src/lib.rs:4:1:5:11 | bar | -| src/lib.rs:7:1:7:14 | always | +| src/lib.rs:1:1:2:11 | fn foo | +| src/lib.rs:4:1:5:11 | fn bar | +| src/lib.rs:7:1:7:14 | fn always | diff --git a/rust/ql/integration-tests/options/features/functions.bar.expected b/rust/ql/integration-tests/options/features/functions.bar.expected index cad441d6749b..fae918e493a3 100644 --- a/rust/ql/integration-tests/options/features/functions.bar.expected +++ b/rust/ql/integration-tests/options/features/functions.bar.expected @@ -1,2 +1,2 @@ -| src/lib.rs:4:1:5:11 | bar | -| src/lib.rs:7:1:7:14 | always | +| src/lib.rs:4:1:5:11 | fn bar | +| src/lib.rs:7:1:7:14 | fn always | diff --git a/rust/ql/integration-tests/options/features/functions.expected b/rust/ql/integration-tests/options/features/functions.expected index 523c21876884..d095a8993d8a 100644 --- a/rust/ql/integration-tests/options/features/functions.expected +++ b/rust/ql/integration-tests/options/features/functions.expected @@ -1 +1 @@ -| src/lib.rs:7:1:7:14 | always | +| src/lib.rs:7:1:7:14 | fn always | diff --git a/rust/ql/integration-tests/options/features/functions.foo.expected b/rust/ql/integration-tests/options/features/functions.foo.expected index b78754230833..3768144364f3 100644 --- a/rust/ql/integration-tests/options/features/functions.foo.expected +++ b/rust/ql/integration-tests/options/features/functions.foo.expected @@ -1,2 +1,2 @@ -| src/lib.rs:1:1:2:11 | foo | -| src/lib.rs:7:1:7:14 | always | +| src/lib.rs:1:1:2:11 | fn foo | +| src/lib.rs:7:1:7:14 | fn always | diff --git a/rust/ql/integration-tests/options/target/functions.Darwin.expected b/rust/ql/integration-tests/options/target/functions.Darwin.expected index 217974bb7c63..8b879e8ca7c7 100644 --- a/rust/ql/integration-tests/options/target/functions.Darwin.expected +++ b/rust/ql/integration-tests/options/target/functions.Darwin.expected @@ -1 +1 @@ -| src/lib.rs:7:1:8:13 | macos | +| src/lib.rs:7:1:8:13 | fn macos | diff --git a/rust/ql/integration-tests/options/target/functions.Linux.expected b/rust/ql/integration-tests/options/target/functions.Linux.expected index 57662579f1f5..2e023fb887c0 100644 --- a/rust/ql/integration-tests/options/target/functions.Linux.expected +++ b/rust/ql/integration-tests/options/target/functions.Linux.expected @@ -1 +1 @@ -| src/lib.rs:1:1:2:13 | linux | +| src/lib.rs:1:1:2:13 | fn linux | diff --git a/rust/ql/integration-tests/options/target/functions.Windows.expected b/rust/ql/integration-tests/options/target/functions.Windows.expected index 8ae2d8c86ccf..170a6e62e80e 100644 --- a/rust/ql/integration-tests/options/target/functions.Windows.expected +++ b/rust/ql/integration-tests/options/target/functions.Windows.expected @@ -1 +1 @@ -| src/lib.rs:4:1:5:15 | windows | +| src/lib.rs:4:1:5:15 | fn windows | diff --git a/rust/ql/integration-tests/qltest/dependencies/functions.expected b/rust/ql/integration-tests/qltest/dependencies/functions.expected deleted file mode 100644 index c062595f9237..000000000000 --- a/rust/ql/integration-tests/qltest/dependencies/functions.expected +++ /dev/null @@ -1 +0,0 @@ -| test.rs:4:1:7:1 | foo | diff --git a/rust/ql/integration-tests/qltest/dependencies/functions.nested.expected b/rust/ql/integration-tests/qltest/dependencies/functions.nested.expected new file mode 100644 index 000000000000..9ee4b080b97e --- /dev/null +++ b/rust/ql/integration-tests/qltest/dependencies/functions.nested.expected @@ -0,0 +1 @@ +| test.rs:4:1:7:1 | fn foo | diff --git a/rust/ql/integration-tests/qltest/lib/functions.expected b/rust/ql/integration-tests/qltest/lib/functions.expected deleted file mode 100644 index 613d53954dcc..000000000000 --- a/rust/ql/integration-tests/qltest/lib/functions.expected +++ /dev/null @@ -1 +0,0 @@ -| test.rs:1:1:1:11 | foo | diff --git a/rust/ql/integration-tests/qltest/lib/functions.nested.expected b/rust/ql/integration-tests/qltest/lib/functions.nested.expected new file mode 100644 index 000000000000..74d1d680dae3 --- /dev/null +++ b/rust/ql/integration-tests/qltest/lib/functions.nested.expected @@ -0,0 +1 @@ +| test.rs:1:1:1:11 | fn foo | diff --git a/rust/ql/integration-tests/qltest/main/functions.expected b/rust/ql/integration-tests/qltest/main/functions.expected deleted file mode 100644 index 9d3631034191..000000000000 --- a/rust/ql/integration-tests/qltest/main/functions.expected +++ /dev/null @@ -1,2 +0,0 @@ -| main.rs:1:1:1:12 | main | -| test.rs:1:1:1:11 | foo | diff --git a/rust/ql/integration-tests/qltest/main/functions.nested.expected b/rust/ql/integration-tests/qltest/main/functions.nested.expected new file mode 100644 index 000000000000..fc9c578919ce --- /dev/null +++ b/rust/ql/integration-tests/qltest/main/functions.nested.expected @@ -0,0 +1,2 @@ +| main.rs:1:1:1:12 | fn main | +| test.rs:1:1:1:11 | fn foo | diff --git a/rust/ql/integration-tests/qltest/test.py b/rust/ql/integration-tests/qltest/test_qltest.py similarity index 84% rename from rust/ql/integration-tests/qltest/test.py rename to rust/ql/integration-tests/qltest/test_qltest.py index e488dee25717..edd62bf600ef 100644 --- a/rust/ql/integration-tests/qltest/test.py +++ b/rust/ql/integration-tests/qltest/test_qltest.py @@ -11,10 +11,12 @@ def default_options(codeql): threads = 1, show_extractor_output = True, check_databases = False, + learn = True, ) @pytest.mark.parametrize("dir", ["lib", "main", "dependencies"]) -def test(codeql, rust, dir): +def test(codeql, rust, expected_files, dir): + expected_files.add(f"{dir}/functions.expected", expected=".nested.expected") codeql.test.run(dir) def test_failing_cargo_check(codeql, rust): diff --git a/rust/ql/lib/codeql/rust/AstConsistency.qll b/rust/ql/lib/codeql/rust/AstConsistency.qll index dbb7f7216d72..3902f56d20ba 100644 --- a/rust/ql/lib/codeql/rust/AstConsistency.qll +++ b/rust/ql/lib/codeql/rust/AstConsistency.qll @@ -10,8 +10,9 @@ private predicate multipleToStrings(Element e) { strictcount(e.toString()) > 1 } /** * Holds if `e` has more than one `toString()` result. */ -query predicate multipleToStrings(Element e, string s) { +query predicate multipleToStrings(Element e, string cls, string s) { multipleToStrings(e) and + cls = e.getPrimaryQlClasses() and s = strictconcat(e.toString(), ", ") } @@ -39,9 +40,11 @@ private predicate multipleParents(Element child) { strictcount(getParent(child)) /** * Holds if `child` has more than one AST parent. */ -query predicate multipleParents(Element child, Element parent) { +query predicate multipleParents(Element child, string childClass, Element parent, string parentClass) { multipleParents(child) and - parent = getParent(child) + childClass = child.getPrimaryQlClasses() and + parent = getParent(child) and + parentClass = parent.getPrimaryQlClasses() } /** diff --git a/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll index b60a6b857b2e..3ee3a3eeb611 100644 --- a/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/CfgNodes.qll @@ -13,6 +13,8 @@ class AstCfgNode = CfgImpl::AstCfgNode; class ExitCfgNode = CfgImpl::ExitNode; +class AnnotatedExitCfgNode = CfgImpl::AnnotatedExitNode; + /** * An assignment expression, for example * diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll index b42a00bf551f..b550ecf89b75 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll @@ -385,7 +385,7 @@ module MakeCfgNodes Input> { * } * ``` */ - final class BlockExprCfgNode extends CfgNodeFinal, ExprCfgNode { + final class BlockExprCfgNode extends CfgNodeFinal, LabelableExprCfgNode { private BlockExpr node; BlockExprCfgNode() { node = this.getAstNode() } @@ -438,16 +438,6 @@ module MakeCfgNodes Input> { */ predicate isUnsafe() { node.isUnsafe() } - /** - * Gets the label of this block expression, if it exists. - */ - Label getLabel() { result = node.getLabel() } - - /** - * Holds if `getLabel()` exists. - */ - predicate hasLabel() { exists(this.getLabel()) } - /** * Gets the statement list of this block expression, if it exists. */ @@ -835,8 +825,6 @@ module MakeCfgNodes Input> { or child = this.getIterable() or - child = this.getLoopBody() - or child = this.getPat() } } @@ -847,7 +835,7 @@ module MakeCfgNodes Input> { * todo!() * ``` */ - final class ForExprCfgNode extends CfgNodeFinal, ExprCfgNode { + final class ForExprCfgNode extends CfgNodeFinal, LoopingExprCfgNode { private ForExpr node; ForExprCfgNode() { node = this.getAstNode() } @@ -882,28 +870,6 @@ module MakeCfgNodes Input> { */ predicate hasIterable() { exists(this.getIterable()) } - /** - * Gets the label of this for expression, if it exists. - */ - Label getLabel() { result = node.getLabel() } - - /** - * Holds if `getLabel()` exists. - */ - predicate hasLabel() { exists(this.getLabel()) } - - /** - * Gets the loop body of this for expression, if it exists. - */ - BlockExprCfgNode getLoopBody() { - any(ChildMapping mapping).hasCfgChild(node, node.getLoopBody(), this, result) - } - - /** - * Holds if `getLoopBody()` exists. - */ - predicate hasLoopBody() { exists(this.getLoopBody()) } - /** * Gets the pat of this for expression, if it exists. */ @@ -928,7 +894,11 @@ module MakeCfgNodes Input> { /** * A FormatArgsExpr. For example: * ```rust - * todo!() + * format_args!("no args"); + * format_args!("{} foo {:?}", 1, 2); + * format_args!("{b} foo {a:?}", a=1, b=2); + * let (x, y) = (1, 42); + * format_args!("{x}, {y}"); * ``` */ final class FormatArgsExprCfgNode extends CfgNodeFinal, ExprCfgNode { @@ -980,6 +950,21 @@ module MakeCfgNodes Input> { * Holds if `getTemplate()` exists. */ predicate hasTemplate() { exists(this.getTemplate()) } + + /** + * Gets the `index`th format of this format arguments expression (0-based). + */ + Format getFormat(int index) { result = node.getFormat(index) } + + /** + * Gets any of the formats of this format arguments expression. + */ + Format getAFormat() { result = this.getFormat(_) } + + /** + * Gets the number of formats of this format arguments expression. + */ + int getNumberOfFormats() { result = count(int i | exists(this.getFormat(i))) } } final private class ParentFormatTemplateVariableAccess extends ParentAstNode, @@ -1230,6 +1215,32 @@ module MakeCfgNodes Input> { predicate hasIndex() { exists(this.getIndex()) } } + final private class ParentLabelableExpr extends ParentAstNode, LabelableExpr { + override predicate relevantChild(AstNode child) { none() } + } + + /** + * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + */ + final class LabelableExprCfgNode extends CfgNodeFinal, ExprCfgNode { + private LabelableExpr node; + + LabelableExprCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `LabelableExpr`. */ + LabelableExpr getLabelableExpr() { result = node } + + /** + * Gets the label of this labelable expression, if it exists. + */ + Label getLabel() { result = node.getLabel() } + + /** + * Holds if `getLabel()` exists. + */ + predicate hasLabel() { exists(this.getLabel()) } + } + final private class ParentLetExpr extends ParentAstNode, LetExpr { override predicate relevantChild(AstNode child) { none() @@ -1477,11 +1488,7 @@ module MakeCfgNodes Input> { } final private class ParentLoopExpr extends ParentAstNode, LoopExpr { - override predicate relevantChild(AstNode child) { - none() - or - child = this.getLoopBody() - } + override predicate relevantChild(AstNode child) { none() } } /** @@ -1508,7 +1515,7 @@ module MakeCfgNodes Input> { * }; * ``` */ - final class LoopExprCfgNode extends CfgNodeFinal, ExprCfgNode { + final class LoopExprCfgNode extends CfgNodeFinal, LoopingExprCfgNode { private LoopExpr node; LoopExprCfgNode() { node = this.getAstNode() } @@ -1530,19 +1537,29 @@ module MakeCfgNodes Input> { * Gets the number of attrs of this loop expression. */ int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + } - /** - * Gets the label of this loop expression, if it exists. - */ - Label getLabel() { result = node.getLabel() } + final private class ParentLoopingExpr extends ParentAstNode, LoopingExpr { + override predicate relevantChild(AstNode child) { + none() + or + child = this.getLoopBody() + } + } - /** - * Holds if `getLabel()` exists. - */ - predicate hasLabel() { exists(this.getLabel()) } + /** + * The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + */ + final class LoopingExprCfgNode extends CfgNodeFinal, LabelableExprCfgNode { + private LoopingExpr node; + + LoopingExprCfgNode() { node = this.getAstNode() } + + /** Gets the underlying `LoopingExpr`. */ + LoopingExpr getLoopingExpr() { result = node } /** - * Gets the loop body of this loop expression, if it exists. + * Gets the loop body of this looping expression, if it exists. */ BlockExprCfgNode getLoopBody() { any(ChildMapping mapping).hasCfgChild(node, node.getLoopBody(), this, result) @@ -2928,8 +2945,6 @@ module MakeCfgNodes Input> { none() or child = this.getCondition() - or - child = this.getLoopBody() } } @@ -2939,7 +2954,7 @@ module MakeCfgNodes Input> { * todo!() * ``` */ - final class WhileExprCfgNode extends CfgNodeFinal, ExprCfgNode { + final class WhileExprCfgNode extends CfgNodeFinal, LoopingExprCfgNode { private WhileExpr node; WhileExprCfgNode() { node = this.getAstNode() } @@ -2973,28 +2988,6 @@ module MakeCfgNodes Input> { * Holds if `getCondition()` exists. */ predicate hasCondition() { exists(this.getCondition()) } - - /** - * Gets the label of this while expression, if it exists. - */ - Label getLabel() { result = node.getLabel() } - - /** - * Holds if `getLabel()` exists. - */ - predicate hasLabel() { exists(this.getLabel()) } - - /** - * Gets the loop body of this while expression, if it exists. - */ - BlockExprCfgNode getLoopBody() { - any(ChildMapping mapping).hasCfgChild(node, node.getLoopBody(), this, result) - } - - /** - * Holds if `getLoopBody()` exists. - */ - predicate hasLoopBody() { exists(this.getLoopBody()) } } final private class ParentWildcardPat extends ParentAstNode, WildcardPat { @@ -3271,18 +3264,6 @@ module MakeCfgNodes Input> { cfgNode ) or - pred = "getLoopBody" and - parent = - any(Nodes::ForExprCfgNode cfgNode, ForExpr astNode | - astNode = cfgNode.getForExpr() and - child = getDesugared(astNode.getLoopBody()) and - i = -1 and - hasCfgNode(child) and - not child = cfgNode.getLoopBody().getAstNode() - | - cfgNode - ) - or pred = "getPat" and parent = any(Nodes::ForExprCfgNode cfgNode, ForExpr astNode | @@ -3441,8 +3422,8 @@ module MakeCfgNodes Input> { or pred = "getLoopBody" and parent = - any(Nodes::LoopExprCfgNode cfgNode, LoopExpr astNode | - astNode = cfgNode.getLoopExpr() and + any(Nodes::LoopingExprCfgNode cfgNode, LoopingExpr astNode | + astNode = cfgNode.getLoopingExpr() and child = getDesugared(astNode.getLoopBody()) and i = -1 and hasCfgNode(child) and @@ -3686,18 +3667,6 @@ module MakeCfgNodes Input> { cfgNode ) or - pred = "getLoopBody" and - parent = - any(Nodes::WhileExprCfgNode cfgNode, WhileExpr astNode | - astNode = cfgNode.getWhileExpr() and - child = getDesugared(astNode.getLoopBody()) and - i = -1 and - hasCfgNode(child) and - not child = cfgNode.getLoopBody().getAstNode() - | - cfgNode - ) - or pred = "getExpr" and parent = any(Nodes::YeetExprCfgNode cfgNode, YeetExpr astNode | diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 210f12825cf2..1ec8a42ee7e0 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -43,22 +43,59 @@ final class DataFlowCallable extends TDataFlowCallable { } final class DataFlowCall extends TDataFlowCall { + private CallExprBaseCfgNode call; + + DataFlowCall() { this = TCall(call) } + /** Gets the underlying call in the CFG, if any. */ - CallExprCfgNode asCallExprCfgNode() { this = TNormalCall(result) } + CallExprCfgNode asCallExprCfgNode() { result = call } - MethodCallExprCfgNode asMethodCallExprCfgNode() { this = TMethodCall(result) } + MethodCallExprCfgNode asMethodCallExprCfgNode() { result = call } - CallExprBaseCfgNode asExprCfgNode() { - result = this.asCallExprCfgNode() or result = this.asMethodCallExprCfgNode() - } + CallExprBaseCfgNode asCallBaseExprCfgNode() { result = call } DataFlowCallable getEnclosingCallable() { - result = TCfgScope(this.asExprCfgNode().getExpr().getEnclosingCfgScope()) + result = TCfgScope(call.getExpr().getEnclosingCfgScope()) + } + + string toString() { result = this.asCallBaseExprCfgNode().toString() } + + Location getLocation() { result = this.asCallBaseExprCfgNode().getLocation() } +} + +/** + * The position of a parameter or an argument in a function or call. + * + * As there is a 1-to-1 correspondence between parameter positions and + * arguments positions in Rust we use the same type for both. + */ +final class ParameterPosition extends TParameterPosition { + /** Gets the underlying integer position, if any. */ + int getPosition() { this = TPositionalParameterPosition(result) } + + /** Holds if this position represents the `self` position. */ + predicate isSelf() { this = TSelfParameterPosition() } + + /** Gets a textual representation of this position. */ + string toString() { + result = this.getPosition().toString() + or + result = "self" and this.isSelf() } - string toString() { result = this.asExprCfgNode().toString() } + AstNode getParameterIn(ParamList ps) { + result = ps.getParam(this.getPosition()) + or + result = ps.getSelfParam() and this.isSelf() + } +} - Location getLocation() { result = this.asExprCfgNode().getLocation() } +/** Holds if `arg` is an argument of `call` at the position `pos`. */ +private predicate isArgumentForCall(ExprCfgNode arg, CallExprBaseCfgNode call, ParameterPosition pos) { + arg = call.getArgument(pos.getPosition()) + or + // The self argument in a method call. + arg = call.(MethodCallExprCfgNode).getReceiver() and pos.isSelf() } module Node { @@ -93,11 +130,6 @@ module Node { * Gets this node's underlying SSA definition, if any. */ Ssa::Definition asDefinition() { none() } - - /** - * Gets the parameter that corresponds to this node, if any. - */ - Param asParameter() { none() } } /** A node type that is not implemented. */ @@ -111,7 +143,7 @@ module Node { override Location getLocation() { none() } } - /** A data flow node that corresponds to a CFG node for an AST node. */ + /** A data flow node that corresponds directly to a CFG node for an AST node. */ abstract class AstCfgFlowNode extends Node { AstCfgNode n; @@ -145,24 +177,37 @@ module Node { PatNode() { this = TPatNode(n) } - /** Gets the `Pat` in the AST that this node corresponds to. */ - Pat getPat() { result = n.getPat() } + /** Gets the `PatCfgNode` in the CFG that this node corresponds to. */ + PatCfgNode getPat() { result = n } } + abstract class ParameterNode extends AstCfgFlowNode { } + /** * The value of a parameter at function entry, viewed as a node in a data * flow graph. */ - final class ParameterNode extends AstCfgFlowNode, TParameterNode { + final class PositionalParameterNode extends ParameterNode, TParameterNode { override ParamCfgNode n; - ParameterNode() { this = TParameterNode(n) } + PositionalParameterNode() { this = TParameterNode(n) } /** Gets the parameter in the CFG that this node corresponds to. */ ParamCfgNode getParameter() { result = n } } - final class ArgumentNode = NaNode; + final class SelfParameterNode extends ParameterNode, TSelfParameterNode { + override SelfParamCfgNode n; + + SelfParameterNode() { this = TSelfParameterNode(n) } + + /** Gets the self parameter in the AST that this node corresponds to. */ + SelfParamCfgNode getSelfParameter() { result = n } + } + + final class ArgumentNode extends ExprNode { + ArgumentNode() { isArgumentForCall(n, _, _) } + } /** An SSA node. */ class SsaNode extends Node, TSsaNode { @@ -185,7 +230,7 @@ module Node { /** A data flow node that represents a value returned by a callable. */ final class ReturnNode extends ExprNode { - ReturnNode() { this.getCfgNode().getASuccessor() instanceof ExitCfgNode } + ReturnNode() { this.getCfgNode().getASuccessor() instanceof AnnotatedExitCfgNode } ReturnKind getKind() { any() } } @@ -197,10 +242,10 @@ module Node { } final private class ExprOutNode extends ExprNode, OutNode { - ExprOutNode() { this.asExpr() instanceof CallExprCfgNode } + ExprOutNode() { this.asExpr() instanceof CallExprBaseCfgNode } /** Gets the underlying call CFG node that includes this out node. */ - override DataFlowCall getCall() { result.asExprCfgNode() = this.getCfgNode() } + override DataFlowCall getCall() { result.asCallBaseExprCfgNode() = this.getCfgNode() } } /** @@ -214,9 +259,19 @@ module Node { * Nodes corresponding to AST elements, for example `ExprNode`, usually refer * to the value before the update. */ - final class PostUpdateNode extends Node::NaNode { + final class PostUpdateNode extends Node, TArgumentPostUpdateNode { + private ExprCfgNode n; + + PostUpdateNode() { this = TArgumentPostUpdateNode(n) } + /** Gets the node before the state update. */ - Node getPreUpdateNode() { none() } + Node getPreUpdateNode() { result = TExprNode(n) } + + final override CfgScope getCfgScope() { result = n.getScope() } + + final override Location getLocation() { result = n.getLocation() } + + final override string toString() { result = n.toString() } } final class CastNode = NaNode; @@ -226,25 +281,27 @@ final class Node = Node::Node; /** Provides logic related to SSA. */ module SsaFlow { - private module Impl = SsaImpl::DataFlowIntegration; + private module SsaFlow = SsaImpl::DataFlowIntegration; - private Node::ParameterNode toParameterNode(ParamCfgNode p) { result.getParameter() = p } + private Node::ParameterNode toParameterNode(ParamCfgNode p) { + result.(Node::PositionalParameterNode).getParameter() = p + } /** Converts a control flow node into an SSA control flow node. */ - Impl::Node asNode(Node n) { + SsaFlow::Node asNode(Node n) { n = TSsaNode(result) or - result.(Impl::ExprNode).getExpr() = n.asExpr() + result.(SsaFlow::ExprNode).getExpr() = n.asExpr() or - n = toParameterNode(result.(Impl::ParameterNode).getParameter()) + n = toParameterNode(result.(SsaFlow::ParameterNode).getParameter()) } predicate localFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) { - Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep) + SsaFlow::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep) } predicate localMustFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) { - Impl::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo)) + SsaFlow::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo)) } } @@ -276,6 +333,9 @@ module LocalFlow { nodeFrom.(Node::AstCfgFlowNode).getCfgNode() = nodeTo.(Node::SsaNode).getDefinitionExt().(Ssa::WriteDefinition).getControlFlowNode() or + nodeFrom.(Node::PositionalParameterNode).getParameter().getPat() = + nodeTo.(Node::PatNode).getPat() + or SsaFlow::localFlowStep(_, nodeFrom, nodeTo, _) or exists(AssignmentExprCfgNode a | @@ -291,6 +351,8 @@ private class ReturnKindAlias = ReturnKind; private class DataFlowCallAlias = DataFlowCall; +private class ParameterPositionAlias = ParameterPosition; + module RustDataFlow implements InputSig { /** * An element, viewed as a node in a data flow graph. Either an expression @@ -310,9 +372,15 @@ module RustDataFlow implements InputSig { final class CastNode = Node::NaNode; - predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { none() } + /** Holds if `p` is a parameter of `c` at the position `pos`. */ + predicate isParameterNode(ParameterNode p, DataFlowCallable c, ParameterPosition pos) { + p.getCfgNode().getAstNode() = pos.getParameterIn(c.asCfgScope().(Callable).getParamList()) + } - predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) { none() } + /** Holds if `n` is an argument of `c` at the position `pos`. */ + predicate isArgumentNode(ArgumentNode n, DataFlowCall call, ArgumentPosition pos) { + isArgumentForCall(n.getCfgNode(), call.asCallBaseExprCfgNode(), pos) + } DataFlowCallable nodeGetEnclosingCallable(Node node) { result = node.getEnclosingCallable() } @@ -335,10 +403,9 @@ module RustDataFlow implements InputSig { DataFlowCallable viableCallable(DataFlowCall c) { exists(Function f, string name | result.asCfgScope() = f and name = f.getName().toString() | if f.getParamList().hasSelfParam() - then name = c.asMethodCallExprCfgNode().getMethodCallExpr().getNameRef().getText() + then name = c.asMethodCallExprCfgNode().getNameRef().getText() else - name = - c.asCallExprCfgNode().getCallExpr().getExpr().(PathExpr).getPath().getPart().toString() + name = c.asCallExprCfgNode().getExpr().getExpr().(PathExpr).getPath().getPart().toString() ) } @@ -377,19 +444,15 @@ module RustDataFlow implements InputSig { ContentApprox getContentApprox(Content c) { any() } - class ParameterPosition extends string { - ParameterPosition() { this = "pos" } - } + class ParameterPosition = ParameterPositionAlias; - class ArgumentPosition extends string { - ArgumentPosition() { this = "pos" } - } + class ArgumentPosition = ParameterPosition; /** * Holds if the parameter position `ppos` matches the argument position * `apos`. */ - predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { none() } + predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos } /** * Holds if there is a simple local flow step from `node1` to `node2`. These @@ -497,13 +560,13 @@ private module Cached { newtype TNode = TExprNode(ExprCfgNode n) or TParameterNode(ParamCfgNode p) or + TSelfParameterNode(SelfParamCfgNode p) or TPatNode(PatCfgNode p) or + TArgumentPostUpdateNode(ExprCfgNode e) { isArgumentForCall(e, _, _) } or TSsaNode(SsaImpl::DataFlowIntegration::SsaNode node) cached - newtype TDataFlowCall = - TNormalCall(CallExprCfgNode c) or - TMethodCall(MethodCallExprCfgNode c) + newtype TDataFlowCall = TCall(CallExprBaseCfgNode c) cached newtype TOptionalContentSet = @@ -521,6 +584,13 @@ private module Cached { predicate localFlowStepImpl(Node::Node nodeFrom, Node::Node nodeTo) { LocalFlow::localFlowStepCommon(nodeFrom, nodeTo) } + + cached + newtype TParameterPosition = + TPositionalParameterPosition(int i) { + i in [0 .. max([any(ParamList l).getNumberOfParams(), any(ArgList l).getNumberOfArgs()]) - 1] + } or + TSelfParameterPosition() } import Cached diff --git a/rust/ql/lib/codeql/rust/elements.qll b/rust/ql/lib/codeql/rust/elements.qll index b516d8a9d185..6bb59b428824 100644 --- a/rust/ql/lib/codeql/rust/elements.qll +++ b/rust/ql/lib/codeql/rust/elements.qll @@ -64,6 +64,7 @@ import codeql.rust.elements.InferType import codeql.rust.elements.Item import codeql.rust.elements.ItemList import codeql.rust.elements.Label +import codeql.rust.elements.LabelableExpr import codeql.rust.elements.LetElse import codeql.rust.elements.LetExpr import codeql.rust.elements.LetStmt @@ -74,6 +75,7 @@ import codeql.rust.elements.LiteralExpr import codeql.rust.elements.LiteralPat import codeql.rust.elements.Locatable import codeql.rust.elements.LoopExpr +import codeql.rust.elements.LoopingExpr import codeql.rust.elements.MacroCall import codeql.rust.elements.MacroDef import codeql.rust.elements.MacroExpr diff --git a/rust/ql/lib/codeql/rust/elements/BlockExpr.qll b/rust/ql/lib/codeql/rust/elements/BlockExpr.qll index a87bbe472528..9e87d381525d 100644 --- a/rust/ql/lib/codeql/rust/elements/BlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/BlockExpr.qll @@ -5,8 +5,7 @@ private import internal.BlockExprImpl import codeql.rust.elements.Attr -import codeql.rust.elements.Expr -import codeql.rust.elements.Label +import codeql.rust.elements.LabelableExpr import codeql.rust.elements.StmtList /** diff --git a/rust/ql/lib/codeql/rust/elements/ForExpr.qll b/rust/ql/lib/codeql/rust/elements/ForExpr.qll index c4ef6f9faffc..cfb2586202ed 100644 --- a/rust/ql/lib/codeql/rust/elements/ForExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/ForExpr.qll @@ -5,9 +5,8 @@ private import internal.ForExprImpl import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr import codeql.rust.elements.Expr -import codeql.rust.elements.Label +import codeql.rust.elements.LoopingExpr import codeql.rust.elements.Pat /** diff --git a/rust/ql/lib/codeql/rust/elements/Format.qll b/rust/ql/lib/codeql/rust/elements/Format.qll index 0c8b5d1c5413..f8b705be4fdb 100644 --- a/rust/ql/lib/codeql/rust/elements/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/Format.qll @@ -5,6 +5,7 @@ private import internal.FormatImpl import codeql.rust.elements.FormatArgsExpr +import codeql.rust.elements.FormatArgument import codeql.rust.elements.Locatable /** diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgsExpr.qll b/rust/ql/lib/codeql/rust/elements/FormatArgsExpr.qll index 226b4d211aae..419a48a53351 100644 --- a/rust/ql/lib/codeql/rust/elements/FormatArgsExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/FormatArgsExpr.qll @@ -6,12 +6,17 @@ private import internal.FormatArgsExprImpl import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.Format import codeql.rust.elements.FormatArgsArg /** * A FormatArgsExpr. For example: * ```rust - * todo!() + * format_args!("no args"); + * format_args!("{} foo {:?}", 1, 2); + * format_args!("{b} foo {a:?}", a=1, b=2); + * let (x, y) = (1, 42); + * format_args!("{x}, {y}"); * ``` */ final class FormatArgsExpr = Impl::FormatArgsExpr; diff --git a/rust/ql/lib/codeql/rust/elements/FormatArgument.qll b/rust/ql/lib/codeql/rust/elements/FormatArgument.qll index 62313c523727..00e9007434bb 100644 --- a/rust/ql/lib/codeql/rust/elements/FormatArgument.qll +++ b/rust/ql/lib/codeql/rust/elements/FormatArgument.qll @@ -5,6 +5,7 @@ private import internal.FormatArgumentImpl import codeql.rust.elements.Format +import codeql.rust.elements.FormatTemplateVariableAccess import codeql.rust.elements.Locatable /** diff --git a/rust/ql/lib/codeql/rust/elements/LabelableExpr.qll b/rust/ql/lib/codeql/rust/elements/LabelableExpr.qll new file mode 100644 index 000000000000..c2a042595a19 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/LabelableExpr.qll @@ -0,0 +1,13 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `LabelableExpr`. + */ + +private import internal.LabelableExprImpl +import codeql.rust.elements.Expr +import codeql.rust.elements.Label + +/** + * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + */ +final class LabelableExpr = Impl::LabelableExpr; diff --git a/rust/ql/lib/codeql/rust/elements/LoopExpr.qll b/rust/ql/lib/codeql/rust/elements/LoopExpr.qll index 6abc449c6261..cdb6d743b50f 100644 --- a/rust/ql/lib/codeql/rust/elements/LoopExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/LoopExpr.qll @@ -5,9 +5,7 @@ private import internal.LoopExprImpl import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr -import codeql.rust.elements.Expr -import codeql.rust.elements.Label +import codeql.rust.elements.LoopingExpr /** * A loop expression. For example: diff --git a/rust/ql/lib/codeql/rust/elements/LoopingExpr.qll b/rust/ql/lib/codeql/rust/elements/LoopingExpr.qll new file mode 100644 index 000000000000..6078afdf762c --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/LoopingExpr.qll @@ -0,0 +1,13 @@ +// generated by codegen, do not edit +/** + * This module provides the public class `LoopingExpr`. + */ + +private import internal.LoopingExprImpl +import codeql.rust.elements.BlockExpr +import codeql.rust.elements.LabelableExpr + +/** + * The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + */ +final class LoopingExpr = Impl::LoopingExpr; diff --git a/rust/ql/lib/codeql/rust/elements/Path.qll b/rust/ql/lib/codeql/rust/elements/Path.qll index 530c40397c31..cb228373cf5a 100644 --- a/rust/ql/lib/codeql/rust/elements/Path.qll +++ b/rust/ql/lib/codeql/rust/elements/Path.qll @@ -10,6 +10,7 @@ import codeql.rust.elements.Resolvable /** * A path. For example: * ```rust + * use some_crate::some_module::some_item; * foo::bar; * ``` */ diff --git a/rust/ql/lib/codeql/rust/elements/PathSegment.qll b/rust/ql/lib/codeql/rust/elements/PathSegment.qll index 5566ba322b62..9edc7d6573f7 100644 --- a/rust/ql/lib/codeql/rust/elements/PathSegment.qll +++ b/rust/ql/lib/codeql/rust/elements/PathSegment.qll @@ -14,9 +14,6 @@ import codeql.rust.elements.ReturnTypeSyntax import codeql.rust.elements.TypeRef /** - * A PathSegment. For example: - * ```rust - * todo!() - * ``` + * A path segment, which is one part of a whole path. */ final class PathSegment = Impl::PathSegment; diff --git a/rust/ql/lib/codeql/rust/elements/PathType.qll b/rust/ql/lib/codeql/rust/elements/PathType.qll index e313b9d1b561..773fe910bfa3 100644 --- a/rust/ql/lib/codeql/rust/elements/PathType.qll +++ b/rust/ql/lib/codeql/rust/elements/PathType.qll @@ -8,9 +8,10 @@ import codeql.rust.elements.Path import codeql.rust.elements.TypeRef /** - * A PathType. For example: + * A type referring to a path. For example: * ```rust - * todo!() + * type X = std::collections::HashMap; + * type Y = X::Item; * ``` */ final class PathType = Impl::PathType; diff --git a/rust/ql/lib/codeql/rust/elements/WhileExpr.qll b/rust/ql/lib/codeql/rust/elements/WhileExpr.qll index 9dcbe9c6346f..fc704d35095a 100644 --- a/rust/ql/lib/codeql/rust/elements/WhileExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/WhileExpr.qll @@ -5,9 +5,8 @@ private import internal.WhileExprImpl import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr import codeql.rust.elements.Expr -import codeql.rust.elements.Label +import codeql.rust.elements.LoopingExpr /** * A WhileExpr. For example: diff --git a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprImpl.qll index ff4ce2248209..8bda9a2d46e2 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ArrayExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ArrayExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ArrayExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ArrayExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An array expression. For example: * ```rust @@ -19,5 +19,7 @@ module Impl { * [1; 10]; * ``` */ - class ArrayExpr extends Generated::ArrayExpr { } + class ArrayExpr extends Generated::ArrayExpr { + override string toString() { result = "[...]" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/AwaitExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/AwaitExprImpl.qll index 39bbe3017df6..d9aa0f8bf448 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/AwaitExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/AwaitExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `AwaitExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.AwaitExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An `await` expression. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * } * ``` */ - class AwaitExpr extends Generated::AwaitExpr { } + class AwaitExpr extends Generated::AwaitExpr { + override string toString() { result = "await " + this.getExpr().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/BecomeExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/BecomeExprImpl.qll index 748659cfdd32..ded01ec4ef83 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/BecomeExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/BecomeExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `BecomeExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.BecomeExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `become` expression. For example: * ```rust @@ -24,5 +24,7 @@ module Impl { * } * ``` */ - class BecomeExpr extends Generated::BecomeExpr { } + class BecomeExpr extends Generated::BecomeExpr { + override string toString() { result = "become " + this.getExpr().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/BoxPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/BoxPatImpl.qll index 06fb2c0fbfa2..45870d14297b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/BoxPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/BoxPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `BoxPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.BoxPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A box pattern. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * }; * ``` */ - class BoxPat extends Generated::BoxPat { } + class BoxPat extends Generated::BoxPat { + override string toString() { result = "box " + this.getPat().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/BreakExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/BreakExprImpl.qll index 4b302674a444..d156e207150c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/BreakExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/BreakExprImpl.qll @@ -5,6 +5,7 @@ */ private import codeql.rust.elements.internal.generated.BreakExpr +import codeql.rust.elements.LabelableExpr /** * INTERNAL: This module contains the customizable definition of `BreakExpr` and should not @@ -102,5 +103,17 @@ module Impl { isLabelled(result, label) ) } + + override string toString() { + result = strictconcat(int i | | this.toStringPart(i), " " order by i) + } + + private string toStringPart(int index) { + index = 0 and result = "break" + or + index = 1 and result = this.getLifetime().toString() + or + index = 2 and result = this.getExpr().toAbbreviatedString() + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll index c03a7b9ac138..3da29db7df1c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CallExpr`. * @@ -6,12 +5,14 @@ */ private import codeql.rust.elements.internal.generated.CallExpr +private import codeql.rust.elements.PathExpr /** * INTERNAL: This module contains the customizable definition of `CallExpr` and should not * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A function call expression. For example: * ```rust @@ -21,5 +22,7 @@ module Impl { * foo(1) = 4; * ``` */ - class CallExpr extends Generated::CallExpr { } + class CallExpr extends Generated::CallExpr { + override string toString() { result = this.getExpr().toAbbreviatedString() + "(...)" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CastExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CastExprImpl.qll index 308c321dfbd2..13270d1ca0b3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CastExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CastExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `CastExpr`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.CastExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A cast expression. For example: * ```rust * value as u64; * ``` */ - class CastExpr extends Generated::CastExpr { } + class CastExpr extends Generated::CastExpr { + override string toString() { + result = this.getExpr().toAbbreviatedString() + " as " + this.getTy().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll index b1c6574b17f9..17e373290b50 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ClosureExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ClosureExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ClosureExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A closure expression. For example: * ```rust @@ -24,5 +24,7 @@ module Impl { * static |x| yield x; * ``` */ - class ClosureExpr extends Generated::ClosureExpr { } + class ClosureExpr extends Generated::ClosureExpr { + override string toString() { result = "|...| " + this.getBody().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/CommentImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CommentImpl.qll index 32a4f415ab7c..85b2a4d80d31 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CommentImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CommentImpl.qll @@ -20,11 +20,30 @@ module Impl { * ``` */ class Comment extends Generated::Comment { + override string toString() { + result = this.getCommentMarker() + "..." + this.getCommentEndMarker() + } + /** - * Gets the text of this comment, excluding the comment marker. + * Gets the text of this comment, excluding the comment markers. */ string getCommentText() { - exists(string s | s = this.getText() | result = s.regexpCapture("///?\\s*(.*)", 1)) + exists(string s | s = this.getText() | + result = + [ + s.regexpCapture("///?\\s*(.*)", 1), + s.regexpCapture("(?s)/\\*\\*?\\s*(.*?)\\s*\\*/", 1) + ] + ) + } + + /** + * Gets the marker of this comment, that is `"//"`, `"///"`, `"/*"` or `"/**"`. + */ + string getCommentMarker() { result = this.getText().regexpCapture("(?s)(///?|/\\*\\*?).*", 1) } + + private string getCommentEndMarker() { + if this.getCommentMarker() = ["//", "///"] then result = "" else result = "*/" } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ContinueExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ContinueExprImpl.qll index 4328fdfc9f93..ecfcd1a48429 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ContinueExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ContinueExprImpl.qll @@ -49,13 +49,23 @@ module Impl { * ``` */ class ContinueExpr extends Generated::ContinueExpr { + override string toString() { + result = strictconcat(int i | | this.toStringPart(i), " " order by i) + } + + private string toStringPart(int index) { + index = 0 and result = "continue" + or + index = 1 and result = this.getLifetime().getText() + } + /** * Gets the target of this `continue` expression. * * The target is either a `LoopExpr`, a `ForExpr`, or a `WhileExpr`. */ pragma[nomagic] - Expr getTarget() { + LoopingExpr getTarget() { exists(string label | result = getAContinueAncestor(this, label) and BreakExprImpl::isLabelledLoop(result, label) diff --git a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll index 6f342c00fd3c..9307a567b6e1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ElementImpl.qll @@ -14,6 +14,14 @@ module Impl { class Element extends Generated::Element { override string toString() { result = this.getAPrimaryQlClass() } + /** + * Returns a string suitable to be inserted into the name of the parent. Typically `"..."`, + * but may be overridden by subclasses. + * + * INTERNAL: Do not use. + */ + string toAbbreviatedString() { result = "..." } + predicate isUnknown() { none() } // compatibility with test generation, to be fixed } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll index bef9d3da903a..0299ce9f05e6 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/EnumImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Enum`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.Enum * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Enum. For example: * ```rust * todo!() * ``` */ - class Enum extends Generated::Enum { } + class Enum extends Generated::Enum { + override string toString() { result = "enum " + this.getName().getText() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll index 003d2789e683..b3cd63b79229 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FieldExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `FieldExpr`. * @@ -12,11 +11,20 @@ private import codeql.rust.elements.internal.generated.FieldExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A field access expression. For example: * ```rust * x.foo * ``` */ - class FieldExpr extends Generated::FieldExpr { } + class FieldExpr extends Generated::FieldExpr { + override string toString() { + exists(string abbr, string name | + abbr = this.getExpr().toAbbreviatedString() and + name = this.getNameRef().getText() and + if abbr = "..." then result = "... ." + name else result = abbr + "." + name + ) + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ForExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ForExprImpl.qll index a196a6802e9a..b333702c9415 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ForExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ForExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ForExpr`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.ForExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A ForExpr. For example: * ```rust * todo!() * ``` */ - class ForExpr extends Generated::ForExpr { } + class ForExpr extends Generated::ForExpr { + override string toStringPrefix() { + result = "for " + this.getPat().toAbbreviatedString() + " in ..." + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll index 667439777b1a..6cc3aa114616 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgsExprImpl.qll @@ -16,14 +16,15 @@ module Impl { /** * A FormatArgsExpr. For example: * ```rust - * todo!() + * format_args!("no args"); + * format_args!("{} foo {:?}", 1, 2); + * format_args!("{b} foo {a:?}", a=1, b=2); + * let (x, y) = (1, 42); + * format_args!("{x}, {y}"); * ``` */ class FormatArgsExpr extends Generated::FormatArgsExpr { - /** - * Gets the `index`th format of this `FormatArgsExpr`'s formatting template (0-based). - */ - Format getFormat(int index) { + override Format getFormat(int index) { result = rank[index + 1](Format f, int i | f.getParent() = this and f.getIndex() = i | f order by i) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatArgumentImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatArgumentImpl.qll index 7370939716d4..6719d9d8cb3c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatArgumentImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatArgumentImpl.qll @@ -39,6 +39,8 @@ module Impl { override string toString() { result = name } override Format getParent() { result = Synth::TFormat(parent, index, _, _) } + + override FormatTemplateVariableAccess getVariable() { result.getArgument() = this } } private class FormatSynthLocationImpl extends FormatArgument, LocatableImpl::SynthLocatable { diff --git a/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll index 59c66768f05f..7cde91053e91 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FormatImpl.qll @@ -38,6 +38,8 @@ module Impl { override int getIndex() { result = index } + override FormatArgument getArgument() { result.getParent() = this } + /** * Gets the name or position reference of this format, if any. For example `name` and `0` in: * ```rust diff --git a/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll index bff68da5620b..791cf4f9d7fc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll @@ -25,6 +25,6 @@ module Impl { * ``` */ class Function extends Generated::Function { - override string toString() { result = this.getName().getText() } + override string toString() { result = "fn " + this.getName().getText() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/GenericArgListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/GenericArgListImpl.qll index 44d74bffbc6f..a701801b68cf 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/GenericArgListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/GenericArgListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `GenericArgList`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.GenericArgList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * The base class for generic arguments. * ```rust * x.foo::(42); * ``` */ - class GenericArgList extends Generated::GenericArgList { } + class GenericArgList extends Generated::GenericArgList { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "<...>" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IfExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IfExprImpl.qll index f9aec6faed35..c90ee6ccdc06 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IfExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IfExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `IfExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.IfExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An `if` expression. For example: * ```rust @@ -27,5 +27,17 @@ module Impl { * }; * ``` */ - class IfExpr extends Generated::IfExpr { } + class IfExpr extends Generated::IfExpr { + override string toString() { result = concat(int i | | this.toStringPart(i), " " order by i) } + + private string toStringPart(int index) { + index = 0 and result = "if" + or + index = 1 and result = this.getCondition().toAbbreviatedString() + or + index = 2 and result = "{...}" + or + index = 3 and this.hasElse() and result = "else {...}" + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll index b1918d16e56e..c75c36b280b9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Impl`. * @@ -12,11 +11,23 @@ private import codeql.rust.elements.internal.generated.Impl * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Impl. For example: * ```rust * todo!() * ``` */ - class Impl extends Generated::Impl { } + class Impl extends Generated::Impl { + override string toString() { + exists(string trait | + ( + trait = this.getTrait().toAbbreviatedString() + " for " + or + not this.hasTrait() and trait = "" + ) and + result = "impl " + trait + this.getSelfTy().toAbbreviatedString() + " { ... }" + ) + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll index 94ff116cf1d4..2ace04fe3899 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/IndexExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `IndexExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.IndexExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An index expression. For example: * ```rust @@ -19,5 +19,10 @@ module Impl { * list[42] = 1; * ``` */ - class IndexExpr extends Generated::IndexExpr { } + class IndexExpr extends Generated::IndexExpr { + override string toString() { + result = + this.getBase().toAbbreviatedString() + "[" + this.getIndex().toAbbreviatedString() + "]" + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/InferTypeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/InferTypeImpl.qll index b29406661ba9..25c1a40701fd 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/InferTypeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/InferTypeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `InferType`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.InferType * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A InferType. For example: * ```rust * todo!() * ``` */ - class InferType extends Generated::InferType { } + class InferType extends Generated::InferType { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "_" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LabelImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LabelImpl.qll index 6740bb23ea88..822029bf3a73 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LabelImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LabelImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Label`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Label * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A label. For example: * ```rust @@ -21,5 +21,14 @@ module Impl { * }; * ``` */ - class Label extends Generated::Label { } + class Label extends Generated::Label { + override string toString() { result = this.getText() } + + override string toAbbreviatedString() { result = this.getText() } + + /** + * Gets the name of the label, together with the leading `'`. + */ + string getText() { result = this.getLifetime().getText() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LabelableExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LabelableExprImpl.qll new file mode 100644 index 000000000000..070481817145 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/LabelableExprImpl.qll @@ -0,0 +1,38 @@ +/** + * This module provides a hand-modifiable wrapper around the generated class `LabelableExpr`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.LabelableExpr + +/** + * INTERNAL: This module contains the customizable definition of `LabelableExpr` and should not + * be referenced directly. + */ +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + */ + class LabelableExpr extends Generated::LabelableExpr { + final override string toString() { + result = strictconcat(int i | | this.toStringPart(i), " " order by i) + } + + private string toStringPart(int index) { + index = 0 and result = this.getLabel().getText() + ":" + or + index = 1 and result = this.toStringPrefix() + or + index = 2 and result = "{ ... }" + } + + /** + * Get the prefix for the string representation of this element. + * + * INTERNAL: Do not use. + */ + string toStringPrefix() { none() } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/LetElseImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LetElseImpl.qll index 2399964cf1af..0ca4e58fb850 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LetElseImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LetElseImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LetElse`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.LetElse * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A LetElse. For example: * ```rust * todo!() * ``` */ - class LetElse extends Generated::LetElse { } + class LetElse extends Generated::LetElse { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "else {...}" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LetExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LetExprImpl.qll index 4a99a43ba0fe..5b8bd7ec963f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LetExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LetExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LetExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LetExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A `let` expression. For example: * ```rust @@ -20,5 +20,15 @@ module Impl { * } * ``` */ - class LetExpr extends Generated::LetExpr { } + class LetExpr extends Generated::LetExpr { + override string toString() { result = concat(int i | | this.toStringPart(i), " " order by i) } + + private string toStringPart(int index) { + index = 0 and result = "let" + or + index = 1 and result = this.getPat().toAbbreviatedString() + or + index = 2 and result = "= " + this.getExpr().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LetStmtImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LetStmtImpl.qll index 2bcaa6d7905c..d612c2082a64 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LetStmtImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LetStmtImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LetStmt`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LetStmt * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A let statement. For example: * ```rust @@ -25,5 +25,19 @@ module Impl { * }; * ``` */ - class LetStmt extends Generated::LetStmt { } + class LetStmt extends Generated::LetStmt { + override string toString() { + result = strictconcat(int i | | this.toStringPart(i), " " order by i) + } + + private string toStringPart(int index) { + index = 0 and result = "let" + or + index = 1 and result = this.getPat().toAbbreviatedString() + or + index = 2 and result = "= " + this.getInitializer().toAbbreviatedString() + or + index = 3 and result = this.getLetElse().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll index 3eb13ac87e5c..27b29f64cc9e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Lifetime`. * @@ -12,11 +11,18 @@ private import codeql.rust.elements.internal.generated.Lifetime * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Lifetime. For example: * ```rust * todo!() * ``` */ - class Lifetime extends Generated::Lifetime { } + class Lifetime extends Generated::Lifetime { + override string toString() { + result = "'" + this.getText() + or + not this.hasText() and result = "'_" + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll index 1b660b134c43..f68c79da16b1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LiteralExprImpl.qll @@ -26,6 +26,20 @@ module Impl { * ``` */ class LiteralExpr extends Generated::LiteralExpr { - override string toString() { result = this.getTextValue() } + override string toString() { result = this.getTrimmedText() } + + override string toAbbreviatedString() { result = this.getTrimmedText() } + + /** + * Get the text of this literal, trimmed with `...` if it is too long. + * + * INTERNAL: Do not use. + */ + string getTrimmedText() { + exists(string v | + v = this.getTextValue() and + if v.length() > 30 then result = v.substring(0, 30) + "..." else result = v + ) + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LiteralPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LiteralPatImpl.qll index a71d9b1bf848..1c59c3fa284a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LiteralPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LiteralPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LiteralPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LiteralPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A literal pattern. For example: * ```rust @@ -21,5 +21,9 @@ module Impl { * } * ``` */ - class LiteralPat extends Generated::LiteralPat { } + class LiteralPat extends Generated::LiteralPat { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = this.getLiteral().getTrimmedText() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LoopExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LoopExprImpl.qll index c56ea8770d48..732148717054 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LoopExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LoopExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `LoopExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.LoopExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A loop expression. For example: * ```rust @@ -36,5 +36,7 @@ module Impl { * }; * ``` */ - class LoopExpr extends Generated::LoopExpr { } + class LoopExpr extends Generated::LoopExpr { + override string toStringPrefix() { result = "loop" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LoopingExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LoopingExprImpl.qll new file mode 100644 index 000000000000..45aa8f42e74b --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/LoopingExprImpl.qll @@ -0,0 +1,19 @@ +// generated by codegen, remove this comment if you wish to edit this file +/** + * This module provides a hand-modifiable wrapper around the generated class `LoopingExpr`. + * + * INTERNAL: Do not use. + */ + +private import codeql.rust.elements.internal.generated.LoopingExpr + +/** + * INTERNAL: This module contains the customizable definition of `LoopingExpr` and should not + * be referenced directly. + */ +module Impl { + /** + * The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + */ + class LoopingExpr extends Generated::LoopingExpr { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll index 76fcd7645a6f..a34d64c0735e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MacroCallImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MacroCall`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.MacroCall * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A MacroCall. For example: * ```rust * todo!() * ``` */ - class MacroCall extends Generated::MacroCall { } + class MacroCall extends Generated::MacroCall { + override string toString() { result = this.getPath().toAbbreviatedString() + "!..." } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchArmImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchArmImpl.qll index 117e6eb3498b..23ad2551bffc 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchArmImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchArmImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `MatchArm`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.MatchArm * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A match arm. For example: * ```rust @@ -27,5 +27,17 @@ module Impl { * }; * ``` */ - class MatchArm extends Generated::MatchArm { } + class MatchArm extends Generated::MatchArm { + override string toString() { result = concat(int i | | this.toStringPart(i), " " order by i) } + + private string toStringPart(int index) { + index = 0 and result = this.getPat().toAbbreviatedString() + or + index = 1 and result = "if " + this.getGuard().toAbbreviatedString() + or + index = 2 and result = "=>" + or + index = 3 and result = this.getExpr().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/MatchExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/MatchExprImpl.qll index c8cb535b526d..3ce9aa773107 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/MatchExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/MatchExprImpl.qll @@ -28,6 +28,10 @@ module Impl { * ``` */ class MatchExpr extends Generated::MatchExpr { + override string toString() { + result = "match " + this.getExpr().toAbbreviatedString() + " { ... }" + } + /** * Gets the `index`th arm of this match expression. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll index 2e94fad609ca..505495862b7f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ModuleImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Module`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Module * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A module declaration. For example: * ```rust @@ -23,5 +23,7 @@ module Impl { * } * ``` */ - class Module extends Generated::Module { } + class Module extends Generated::Module { + override string toString() { result = "mod " + this.getName() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NeverTypeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NeverTypeImpl.qll index 9c04237f38c1..c1858fc9421a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/NeverTypeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/NeverTypeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `NeverType`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.NeverType * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A NeverType. For example: * ```rust * todo!() * ``` */ - class NeverType extends Generated::NeverType { } + class NeverType extends Generated::NeverType { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "!" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/OrPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/OrPatImpl.qll index f29e3d1865fc..07cc59f0ddee 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/OrPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/OrPatImpl.qll @@ -21,6 +21,10 @@ module Impl { * ``` */ class OrPat extends Generated::OrPat { + override string toString() { + result = concat(int i | | this.getPat(i).toAbbreviatedString(), " | " order by i) + } + /** Gets the last pattern in this or pattern. */ pragma[nomagic] Pat getLastPat() { result = this.getPat(this.getNumberOfPats() - 1) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParamImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParamImpl.qll index 7015d097e9f4..33e4f5fee59b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParamImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParamImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Param`. * @@ -12,11 +11,20 @@ private import codeql.rust.elements.internal.generated.Param * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Param. For example: * ```rust * todo!() * ``` */ - class Param extends Generated::Param { } + class Param extends Generated::Param { + override string toString() { result = concat(int i | | this.toStringPart(i) order by i) } + + private string toStringPart(int index) { + index = 0 and result = this.getPat().toAbbreviatedString() + or + index = 1 and result = ": " + this.getTy().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll index 98c3cab9267c..db9d19f5650b 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParenExpr`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.ParenExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A ParenExpr. For example: * ```rust * todo!() * ``` */ - class ParenExpr extends Generated::ParenExpr { } + class ParenExpr extends Generated::ParenExpr { + override string toString() { result = "(" + this.getExpr().toAbbreviatedString() + ")" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenPatImpl.qll index cdba455451c6..9d9016cff98e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParenPat`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.ParenPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A ParenPat. For example: * ```rust * todo!() * ``` */ - class ParenPat extends Generated::ParenPat { } + class ParenPat extends Generated::ParenPat { + override string toString() { result = "(" + this.getPat().toAbbreviatedString() + ")" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ParenTypeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ParenTypeImpl.qll index ab49c9c4fcfc..916758b91333 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ParenTypeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ParenTypeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ParenType`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.ParenType * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A ParenType. For example: * ```rust * todo!() * ``` */ - class ParenType extends Generated::ParenType { } + class ParenType extends Generated::ParenType { + override string toString() { result = "(" + this.getTy().toAbbreviatedString() + ")" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll index c8a2af3de33b..19445493c889 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathExprImpl.qll @@ -22,6 +22,8 @@ module Impl { * ``` */ class PathExpr extends Generated::PathExpr { - override string toString() { result = this.getPath().toString() } + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = this.getPath().toString() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathImpl.qll index b53c86559f0c..34cd16c144b4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathImpl.qll @@ -15,14 +15,17 @@ module Impl { /** * A path. For example: * ```rust + * use some_crate::some_module::some_item; * foo::bar; * ``` */ class Path extends Generated::Path { - override string toString() { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { if this.hasQualifier() - then result = this.getQualifier().toString() + "::" + this.getPart().toString() - else result = this.getPart().toString() + then result = "...::" + this.getPart().toAbbreviatedString() + else result = this.getPart().toAbbreviatedString() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathPatImpl.qll index 0acf7a588ba6..27914a8f4159 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PathPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.PathPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A path pattern. For example: * ```rust @@ -21,5 +21,9 @@ module Impl { * } * ``` */ - class PathPat extends Generated::PathPat { } + class PathPat extends Generated::PathPat { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = this.getPath().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll index 300a6c7d4a0c..7f586afa3755 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathSegmentImpl.qll @@ -13,17 +13,22 @@ private import codeql.rust.elements.internal.generated.PathSegment module Impl { // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * A PathSegment. For example: - * ```rust - * todo!() - * ``` + * A path segment, which is one part of a whole path. */ class PathSegment extends Generated::PathSegment { - override string toString() { - // TODO: this does not cover everything - if this.hasGenericArgList() - then result = this.getNameRef().toString() + "::<...>" - else result = this.getNameRef().toString() + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { + result = strictconcat(int i | | this.toAbbreviatedStringPart(i), "::" order by i) + } + + private string toAbbreviatedStringPart(int index) { + index = 0 and + if this.hasPathType() or this.hasTy() + then result = "<...>" + else result = this.getNameRef().getText() + or + index = 1 and result = this.getGenericArgList().toAbbreviatedString() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/PathTypeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/PathTypeImpl.qll index 74fa536e08b5..02d8a98d42a3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/PathTypeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/PathTypeImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `PathType`. * @@ -12,11 +11,17 @@ private import codeql.rust.elements.internal.generated.PathType * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * A PathType. For example: + * A type referring to a path. For example: * ```rust - * todo!() + * type X = std::collections::HashMap; + * type Y = X::Item; * ``` */ - class PathType extends Generated::PathType { } + class PathType extends Generated::PathType { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = this.getPath().toAbbreviatedString() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RangeExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RangeExprImpl.qll index c015171253f7..3b8989af7821 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RangeExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RangeExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RangeExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RangeExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A range expression. For example: * ```rust @@ -23,5 +23,29 @@ module Impl { * let x = ..; * ``` */ - class RangeExpr extends Generated::RangeExpr { } + class RangeExpr extends Generated::RangeExpr { + override string toString() { result = concat(int i | | this.toStringPart(i) order by i) } + + private string toStringPart(int index) { + index = 0 and result = this.getStartAbbreviation() + or + index = 1 and result = this.getOperatorName() + or + index = 2 and result = this.getEndAbbreviation() + } + + private string getStartAbbreviation() { + exists(string abbr | + abbr = this.getStart().toAbbreviatedString() and + if abbr = "..." then result = "... " else result = abbr + ) + } + + private string getEndAbbreviation() { + exists(string abbr | + abbr = this.getEnd().toAbbreviatedString() and + if abbr = "..." then result = " ..." else result = abbr + ) + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll index 12b86bb1e4ab..fe898c82fea4 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RecordExprFieldImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RecordExprField`. * @@ -12,11 +11,20 @@ private import codeql.rust.elements.internal.generated.RecordExprField * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A field in a record expression. For example `a: 1` in: * ```rust * Foo { a: 1, b: 2 }; * ``` */ - class RecordExprField extends Generated::RecordExprField { } + class RecordExprField extends Generated::RecordExprField { + override string toString() { result = concat(int i | | this.toStringPart(i) order by i) } + + private string toStringPart(int index) { + index = 0 and result = this.getNameRef().getText() + or + index = 1 and result = ": " + this.getExpr().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RecordExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RecordExprImpl.qll index befc9b26ebbd..a59d3bc22e2e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RecordExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RecordExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RecordExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RecordExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A record expression. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * Foo { .. } = second; * ``` */ - class RecordExpr extends Generated::RecordExpr { } + class RecordExpr extends Generated::RecordExpr { + override string toString() { result = this.getPath().toString() + " {...}" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RecordPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RecordPatImpl.qll index 6378e3220e0f..0bed25bb779f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RecordPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RecordPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RecordPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RecordPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A record pattern. For example: * ```rust @@ -21,5 +21,7 @@ module Impl { * } * ``` */ - class RecordPat extends Generated::RecordPat { } + class RecordPat extends Generated::RecordPat { + override string toString() { result = this.getPath().toAbbreviatedString() + " {...}" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RefExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RefExprImpl.qll index abc45e0d5c21..4ec593362d95 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RefExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RefExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RefExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RefExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A reference expression. For example: * ```rust @@ -21,5 +21,19 @@ module Impl { * let raw_mut: &mut i32 = &raw mut foo; * ``` */ - class RefExpr extends Generated::RefExpr { } + class RefExpr extends Generated::RefExpr { + override string toString() { + result = "&" + concat(int i | | this.getSpecPart(i), " " order by i) + } + + private string getSpecPart(int index) { + index = 0 and this.isRaw() and result = "raw" + or + index = 1 and this.isConst() and result = "const" + or + index = 2 and this.isMut() and result = "mut" + or + index = 3 and result = this.getExpr().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RefPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RefPatImpl.qll index 03b1abf5a4f9..d6b1f4c27092 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RefPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RefPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RefPat`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.RefPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A reference pattern. For example: * ```rust @@ -21,5 +21,15 @@ module Impl { * }; * ``` */ - class RefPat extends Generated::RefPat { } + class RefPat extends Generated::RefPat { + override string toString() { + result = "&" + concat(int i | | this.getSpecPart(i), " " order by i) + } + + private string getSpecPart(int index) { + index = 0 and this.isMut() and result = "mut" + or + index = 1 and result = this.getPat().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/RestPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/RestPatImpl.qll index bd483e4ba9a6..ec7d48a4d9d7 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/RestPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/RestPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `RestPat`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.RestPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A RestPat. For example: * ```rust * todo!() * ``` */ - class RestPat extends Generated::RestPat { } + class RestPat extends Generated::RestPat { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = ".." } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/ReturnExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ReturnExprImpl.qll index fd185c01b1df..1b632587867e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ReturnExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ReturnExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `ReturnExpr`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.ReturnExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A return expression. For example: * ```rust @@ -25,5 +25,13 @@ module Impl { * } * ``` */ - class ReturnExpr extends Generated::ReturnExpr { } + class ReturnExpr extends Generated::ReturnExpr { + override string toString() { result = concat(int i | | this.toStringPart(i), " " order by i) } + + private string toStringPart(int index) { + index = 0 and result = "return" + or + index = 1 and result = this.getExpr().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll index a6fa19517f41..564e54e78d64 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TraitImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Trait`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.Trait * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Trait. For example: * ``` @@ -24,5 +24,7 @@ module Impl { * pub trait Foo where T::Frobinator: Eq {} * ``` */ - class Trait extends Generated::Trait { } + class Trait extends Generated::Trait { + override string toString() { result = "trait " + this.getName().getText() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll index 03709c54b545..620a09e8c3d9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnderscoreExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `UnderscoreExpr`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.UnderscoreExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * An underscore expression. For example: * ```rust * _ = 42; * ``` */ - class UnderscoreExpr extends Generated::UnderscoreExpr { } + class UnderscoreExpr extends Generated::UnderscoreExpr { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "_" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll index dc850eac4d19..15a793741172 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/UnionImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `Union`. * @@ -12,11 +11,14 @@ private import codeql.rust.elements.internal.generated.Union * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A Union. For example: * ```rust * todo!() * ``` */ - class Union extends Generated::Union { } + class Union extends Generated::Union { + override string toString() { result = "union " + this.getName().getText() } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WhileExprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WhileExprImpl.qll index 647864d46592..e41b6a684a1e 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WhileExprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WhileExprImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WhileExpr`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.WhileExpr * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A WhileExpr. For example: * ```rust * todo!() * ``` */ - class WhileExpr extends Generated::WhileExpr { } + class WhileExpr extends Generated::WhileExpr { + override string toStringPrefix() { + result = "while " + this.getCondition().toAbbreviatedString() + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/WildcardPatImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/WildcardPatImpl.qll index d12e49e1daa9..f1a8fa1a72ee 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/WildcardPatImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/WildcardPatImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `WildcardPat`. * @@ -12,11 +11,16 @@ private import codeql.rust.elements.internal.generated.WildcardPat * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A wildcard pattern. For example: * ```rust * let _ = 42; * ``` */ - class WildcardPat extends Generated::WildcardPat { } + class WildcardPat extends Generated::WildcardPat { + override string toString() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = "_" } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll index c4f11fdd90c5..6a01a0c45880 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/BlockExpr.qll @@ -7,8 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr -import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -import codeql.rust.elements.Label +import codeql.rust.elements.internal.LabelableExprImpl::Impl as LabelableExprImpl import codeql.rust.elements.StmtList /** @@ -32,7 +31,7 @@ module Generated { * INTERNAL: Do not reference the `Generated::BlockExpr` class directly. * Use the subclass `BlockExpr`, where the following predicates are available. */ - class BlockExpr extends Synth::TBlockExpr, ExprImpl::Expr { + class BlockExpr extends Synth::TBlockExpr, LabelableExprImpl::LabelableExpr { override string getAPrimaryQlClass() { result = "BlockExpr" } /** @@ -83,19 +82,6 @@ module Generated { */ predicate isUnsafe() { Synth::convertBlockExprToRaw(this).(Raw::BlockExpr).isUnsafe() } - /** - * Gets the label of this block expression, if it exists. - */ - Label getLabel() { - result = - Synth::convertLabelFromRaw(Synth::convertBlockExprToRaw(this).(Raw::BlockExpr).getLabel()) - } - - /** - * Holds if `getLabel()` exists. - */ - final predicate hasLabel() { exists(this.getLabel()) } - /** * Gets the statement list of this block expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ForExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ForExpr.qll index dc5f2d34d3ee..202b1736fc49 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ForExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ForExpr.qll @@ -7,10 +7,8 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr import codeql.rust.elements.Expr -import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -import codeql.rust.elements.Label +import codeql.rust.elements.internal.LoopingExprImpl::Impl as LoopingExprImpl import codeql.rust.elements.Pat /** @@ -26,7 +24,7 @@ module Generated { * INTERNAL: Do not reference the `Generated::ForExpr` class directly. * Use the subclass `ForExpr`, where the following predicates are available. */ - class ForExpr extends Synth::TForExpr, ExprImpl::Expr { + class ForExpr extends Synth::TForExpr, LoopingExprImpl::LoopingExpr { override string getAPrimaryQlClass() { result = "ForExpr" } /** @@ -60,32 +58,6 @@ module Generated { */ final predicate hasIterable() { exists(this.getIterable()) } - /** - * Gets the label of this for expression, if it exists. - */ - Label getLabel() { - result = - Synth::convertLabelFromRaw(Synth::convertForExprToRaw(this).(Raw::ForExpr).getLabel()) - } - - /** - * Holds if `getLabel()` exists. - */ - final predicate hasLabel() { exists(this.getLabel()) } - - /** - * Gets the loop body of this for expression, if it exists. - */ - BlockExpr getLoopBody() { - result = - Synth::convertBlockExprFromRaw(Synth::convertForExprToRaw(this).(Raw::ForExpr).getLoopBody()) - } - - /** - * Holds if `getLoopBody()` exists. - */ - final predicate hasLoopBody() { exists(this.getLoopBody()) } - /** * Gets the pat of this for expression, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll index f2ade708ffaa..41c748d7fde3 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Format.qll @@ -7,6 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.FormatArgsExpr +import codeql.rust.elements.FormatArgument import codeql.rust.elements.internal.LocatableImpl::Impl as LocatableImpl /** @@ -34,5 +35,15 @@ module Generated { * Gets the index of this format. */ int getIndex() { none() } + + /** + * Gets the argument of this format, if it exists. + */ + FormatArgument getArgument() { none() } + + /** + * Holds if `getArgument()` exists. + */ + final predicate hasArgument() { exists(this.getArgument()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll index 7fe088e25411..38034779e053 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgsExpr.qll @@ -9,6 +9,7 @@ private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr import codeql.rust.elements.Expr import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl +import codeql.rust.elements.Format import codeql.rust.elements.FormatArgsArg /** @@ -19,7 +20,11 @@ module Generated { /** * A FormatArgsExpr. For example: * ```rust - * todo!() + * format_args!("no args"); + * format_args!("{} foo {:?}", 1, 2); + * format_args!("{b} foo {a:?}", a=1, b=2); + * let (x, y) = (1, 42); + * format_args!("{x}, {y}"); * ``` * INTERNAL: Do not reference the `Generated::FormatArgsExpr` class directly. * Use the subclass `FormatArgsExpr`, where the following predicates are available. @@ -81,5 +86,20 @@ module Generated { * Holds if `getTemplate()` exists. */ final predicate hasTemplate() { exists(this.getTemplate()) } + + /** + * Gets the `index`th format of this format arguments expression (0-based). + */ + Format getFormat(int index) { none() } + + /** + * Gets any of the formats of this format arguments expression. + */ + final Format getAFormat() { result = this.getFormat(_) } + + /** + * Gets the number of formats of this format arguments expression. + */ + final int getNumberOfFormats() { result = count(int i | exists(this.getFormat(i))) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll index 658d6b92e7a5..a1db224494b5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/FormatArgument.qll @@ -7,6 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Format +import codeql.rust.elements.FormatTemplateVariableAccess import codeql.rust.elements.internal.LocatableImpl::Impl as LocatableImpl /** @@ -33,5 +34,15 @@ module Generated { * Gets the parent of this format argument. */ Format getParent() { none() } + + /** + * Gets the variable of this format argument, if it exists. + */ + FormatTemplateVariableAccess getVariable() { none() } + + /** + * Holds if `getVariable()` exists. + */ + final predicate hasVariable() { exists(this.getVariable()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LabelableExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LabelableExpr.qll new file mode 100644 index 000000000000..a0dfd03fb400 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LabelableExpr.qll @@ -0,0 +1,38 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `LabelableExpr`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl +import codeql.rust.elements.Label + +/** + * INTERNAL: This module contains the fully generated definition of `LabelableExpr` and should not + * be referenced directly. + */ +module Generated { + /** + * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + * INTERNAL: Do not reference the `Generated::LabelableExpr` class directly. + * Use the subclass `LabelableExpr`, where the following predicates are available. + */ + class LabelableExpr extends Synth::TLabelableExpr, ExprImpl::Expr { + /** + * Gets the label of this labelable expression, if it exists. + */ + Label getLabel() { + result = + Synth::convertLabelFromRaw(Synth::convertLabelableExprToRaw(this) + .(Raw::LabelableExpr) + .getLabel()) + } + + /** + * Holds if `getLabel()` exists. + */ + final predicate hasLabel() { exists(this.getLabel()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LoopExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LoopExpr.qll index eb943bf746aa..510c3dedb683 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/LoopExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LoopExpr.qll @@ -7,9 +7,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr -import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -import codeql.rust.elements.Label +import codeql.rust.elements.internal.LoopingExprImpl::Impl as LoopingExprImpl /** * INTERNAL: This module contains the fully generated definition of `LoopExpr` and should not @@ -42,7 +40,7 @@ module Generated { * INTERNAL: Do not reference the `Generated::LoopExpr` class directly. * Use the subclass `LoopExpr`, where the following predicates are available. */ - class LoopExpr extends Synth::TLoopExpr, ExprImpl::Expr { + class LoopExpr extends Synth::TLoopExpr, LoopingExprImpl::LoopingExpr { override string getAPrimaryQlClass() { result = "LoopExpr" } /** @@ -62,33 +60,5 @@ module Generated { * Gets the number of attrs of this loop expression. */ final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } - - /** - * Gets the label of this loop expression, if it exists. - */ - Label getLabel() { - result = - Synth::convertLabelFromRaw(Synth::convertLoopExprToRaw(this).(Raw::LoopExpr).getLabel()) - } - - /** - * Holds if `getLabel()` exists. - */ - final predicate hasLabel() { exists(this.getLabel()) } - - /** - * Gets the loop body of this loop expression, if it exists. - */ - BlockExpr getLoopBody() { - result = - Synth::convertBlockExprFromRaw(Synth::convertLoopExprToRaw(this) - .(Raw::LoopExpr) - .getLoopBody()) - } - - /** - * Holds if `getLoopBody()` exists. - */ - final predicate hasLoopBody() { exists(this.getLoopBody()) } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/LoopingExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/LoopingExpr.qll new file mode 100644 index 000000000000..427ef05c2aba --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/LoopingExpr.qll @@ -0,0 +1,38 @@ +// generated by codegen, do not edit +/** + * This module provides the generated definition of `LoopingExpr`. + * INTERNAL: Do not import directly. + */ + +private import codeql.rust.elements.internal.generated.Synth +private import codeql.rust.elements.internal.generated.Raw +import codeql.rust.elements.BlockExpr +import codeql.rust.elements.internal.LabelableExprImpl::Impl as LabelableExprImpl + +/** + * INTERNAL: This module contains the fully generated definition of `LoopingExpr` and should not + * be referenced directly. + */ +module Generated { + /** + * The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + * INTERNAL: Do not reference the `Generated::LoopingExpr` class directly. + * Use the subclass `LoopingExpr`, where the following predicates are available. + */ + class LoopingExpr extends Synth::TLoopingExpr, LabelableExprImpl::LabelableExpr { + /** + * Gets the loop body of this looping expression, if it exists. + */ + BlockExpr getLoopBody() { + result = + Synth::convertBlockExprFromRaw(Synth::convertLoopingExprToRaw(this) + .(Raw::LoopingExpr) + .getLoopBody()) + } + + /** + * Holds if `getLoopBody()` exists. + */ + final predicate hasLoopBody() { exists(this.getLoopBody()) } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index 470207683ae5..b03310ce2638 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -52,14 +52,17 @@ private module Impl { } private Element getImmediateChildOfFormat(Format e, int index, string partialPredicateCall) { - exists(int b, int bLocatable, int n | + exists(int b, int bLocatable, int n, int nArgument | b = 0 and bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and n = bLocatable and + nArgument = n + 1 and ( none() or result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall) + or + index = n and result = e.getArgument() and partialPredicateCall = "Argument()" ) ) } @@ -67,14 +70,17 @@ private module Impl { private Element getImmediateChildOfFormatArgument( FormatArgument e, int index, string partialPredicateCall ) { - exists(int b, int bLocatable, int n | + exists(int b, int bLocatable, int n, int nVariable | b = 0 and bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and n = bLocatable and + nVariable = n + 1 and ( none() or result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall) + or + index = n and result = e.getVariable() and partialPredicateCall = "Variable()" ) ) } @@ -1397,29 +1403,6 @@ private module Impl { ) } - private Element getImmediateChildOfBlockExpr(BlockExpr e, int index, string partialPredicateCall) { - exists(int b, int bExpr, int n, int nAttr, int nLabel, int nStmtList | - b = 0 and - bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and - n = bExpr and - nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nLabel = nAttr + 1 and - nStmtList = nLabel + 1 and - ( - none() - or - result = getImmediateChildOfExpr(e, index - b, partialPredicateCall) - or - result = e.getAttr(index - n) and - partialPredicateCall = "Attr(" + (index - n).toString() + ")" - or - index = nAttr and result = e.getLabel() and partialPredicateCall = "Label()" - or - index = nLabel and result = e.getStmtList() and partialPredicateCall = "StmtList()" - ) - ) - } - private Element getImmediateChildOfBoxPat(BoxPat e, int index, string partialPredicateCall) { exists(int b, int bPat, int n, int nPat | b = 0 and @@ -1708,35 +1691,6 @@ private module Impl { ) } - private Element getImmediateChildOfForExpr(ForExpr e, int index, string partialPredicateCall) { - exists(int b, int bExpr, int n, int nAttr, int nIterable, int nLabel, int nLoopBody, int nPat | - b = 0 and - bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and - n = bExpr and - nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nIterable = nAttr + 1 and - nLabel = nIterable + 1 and - nLoopBody = nLabel + 1 and - nPat = nLoopBody + 1 and - ( - none() - or - result = getImmediateChildOfExpr(e, index - b, partialPredicateCall) - or - result = e.getAttr(index - n) and - partialPredicateCall = "Attr(" + (index - n).toString() + ")" - or - index = nAttr and result = e.getIterable() and partialPredicateCall = "Iterable()" - or - index = nIterable and result = e.getLabel() and partialPredicateCall = "Label()" - or - index = nLabel and result = e.getLoopBody() and partialPredicateCall = "LoopBody()" - or - index = nLoopBody and result = e.getPat() and partialPredicateCall = "Pat()" - ) - ) - } - private Element getImmediateChildOfForType(ForType e, int index, string partialPredicateCall) { exists(int b, int bTypeRef, int n, int nGenericParamList, int nTy | b = 0 and @@ -1761,13 +1715,14 @@ private module Impl { private Element getImmediateChildOfFormatArgsExpr( FormatArgsExpr e, int index, string partialPredicateCall ) { - exists(int b, int bExpr, int n, int nArg, int nAttr, int nTemplate | + exists(int b, int bExpr, int n, int nArg, int nAttr, int nTemplate, int nFormat | b = 0 and bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and n = bExpr and nArg = n + 1 + max(int i | i = -1 or exists(e.getArg(i)) | i) and nAttr = nArg + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and nTemplate = nAttr + 1 and + nFormat = nTemplate + 1 + max(int i | i = -1 or exists(e.getFormat(i)) | i) and ( none() or @@ -1780,6 +1735,9 @@ private module Impl { partialPredicateCall = "Attr(" + (index - nArg).toString() + ")" or index = nAttr and result = e.getTemplate() and partialPredicateCall = "Template()" + or + result = e.getFormat(index - nTemplate) and + partialPredicateCall = "Format(" + (index - nTemplate).toString() + ")" ) ) } @@ -1900,6 +1858,24 @@ private module Impl { ) } + private Element getImmediateChildOfLabelableExpr( + LabelableExpr e, int index, string partialPredicateCall + ) { + exists(int b, int bExpr, int n, int nLabel | + b = 0 and + bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and + n = bExpr and + nLabel = n + 1 and + ( + none() + or + result = getImmediateChildOfExpr(e, index - b, partialPredicateCall) + or + index = n and result = e.getLabel() and partialPredicateCall = "Label()" + ) + ) + } + private Element getImmediateChildOfLetExpr(LetExpr e, int index, string partialPredicateCall) { exists(int b, int bExpr, int n, int nAttr, int nExpr, int nPat | b = 0 and @@ -2034,29 +2010,6 @@ private module Impl { ) } - private Element getImmediateChildOfLoopExpr(LoopExpr e, int index, string partialPredicateCall) { - exists(int b, int bExpr, int n, int nAttr, int nLabel, int nLoopBody | - b = 0 and - bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and - n = bExpr and - nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nLabel = nAttr + 1 and - nLoopBody = nLabel + 1 and - ( - none() - or - result = getImmediateChildOfExpr(e, index - b, partialPredicateCall) - or - result = e.getAttr(index - n) and - partialPredicateCall = "Attr(" + (index - n).toString() + ")" - or - index = nAttr and result = e.getLabel() and partialPredicateCall = "Label()" - or - index = nLabel and result = e.getLoopBody() and partialPredicateCall = "LoopBody()" - ) - ) - } - private Element getImmediateChildOfMacroExpr(MacroExpr e, int index, string partialPredicateCall) { exists(int b, int bExpr, int n, int nMacroCall | b = 0 and @@ -2748,32 +2701,6 @@ private module Impl { ) } - private Element getImmediateChildOfWhileExpr(WhileExpr e, int index, string partialPredicateCall) { - exists(int b, int bExpr, int n, int nAttr, int nCondition, int nLabel, int nLoopBody | - b = 0 and - bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and - n = bExpr and - nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nCondition = nAttr + 1 and - nLabel = nCondition + 1 and - nLoopBody = nLabel + 1 and - ( - none() - or - result = getImmediateChildOfExpr(e, index - b, partialPredicateCall) - or - result = e.getAttr(index - n) and - partialPredicateCall = "Attr(" + (index - n).toString() + ")" - or - index = nAttr and result = e.getCondition() and partialPredicateCall = "Condition()" - or - index = nCondition and result = e.getLabel() and partialPredicateCall = "Label()" - or - index = nLabel and result = e.getLoopBody() and partialPredicateCall = "LoopBody()" - ) - ) - } - private Element getImmediateChildOfWildcardPat( WildcardPat e, int index, string partialPredicateCall ) { @@ -2829,6 +2756,27 @@ private module Impl { ) } + private Element getImmediateChildOfBlockExpr(BlockExpr e, int index, string partialPredicateCall) { + exists(int b, int bLabelableExpr, int n, int nAttr, int nStmtList | + b = 0 and + bLabelableExpr = + b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLabelableExpr(e, i, _)) | i) and + n = bLabelableExpr and + nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and + nStmtList = nAttr + 1 and + ( + none() + or + result = getImmediateChildOfLabelableExpr(e, index - b, partialPredicateCall) + or + result = e.getAttr(index - n) and + partialPredicateCall = "Attr(" + (index - n).toString() + ")" + or + index = nAttr and result = e.getStmtList() and partialPredicateCall = "StmtList()" + ) + ) + } + private Element getImmediateChildOfCallExpr(CallExpr e, int index, string partialPredicateCall) { exists(int b, int bCallExprBase, int n, int nExpr | b = 0 and @@ -3087,6 +3035,25 @@ private module Impl { ) } + private Element getImmediateChildOfLoopingExpr( + LoopingExpr e, int index, string partialPredicateCall + ) { + exists(int b, int bLabelableExpr, int n, int nLoopBody | + b = 0 and + bLabelableExpr = + b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLabelableExpr(e, i, _)) | i) and + n = bLabelableExpr and + nLoopBody = n + 1 and + ( + none() + or + result = getImmediateChildOfLabelableExpr(e, index - b, partialPredicateCall) + or + index = n and result = e.getLoopBody() and partialPredicateCall = "LoopBody()" + ) + ) + } + private Element getImmediateChildOfMacroCall(MacroCall e, int index, string partialPredicateCall) { exists( int b, int bAssocItem, int bExternItem, int bItem, int n, int nAttr, int nPath, @@ -3535,6 +3502,69 @@ private module Impl { ) } + private Element getImmediateChildOfForExpr(ForExpr e, int index, string partialPredicateCall) { + exists(int b, int bLoopingExpr, int n, int nAttr, int nIterable, int nPat | + b = 0 and + bLoopingExpr = + b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLoopingExpr(e, i, _)) | i) and + n = bLoopingExpr and + nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and + nIterable = nAttr + 1 and + nPat = nIterable + 1 and + ( + none() + or + result = getImmediateChildOfLoopingExpr(e, index - b, partialPredicateCall) + or + result = e.getAttr(index - n) and + partialPredicateCall = "Attr(" + (index - n).toString() + ")" + or + index = nAttr and result = e.getIterable() and partialPredicateCall = "Iterable()" + or + index = nIterable and result = e.getPat() and partialPredicateCall = "Pat()" + ) + ) + } + + private Element getImmediateChildOfLoopExpr(LoopExpr e, int index, string partialPredicateCall) { + exists(int b, int bLoopingExpr, int n, int nAttr | + b = 0 and + bLoopingExpr = + b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLoopingExpr(e, i, _)) | i) and + n = bLoopingExpr and + nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and + ( + none() + or + result = getImmediateChildOfLoopingExpr(e, index - b, partialPredicateCall) + or + result = e.getAttr(index - n) and + partialPredicateCall = "Attr(" + (index - n).toString() + ")" + ) + ) + } + + private Element getImmediateChildOfWhileExpr(WhileExpr e, int index, string partialPredicateCall) { + exists(int b, int bLoopingExpr, int n, int nAttr, int nCondition | + b = 0 and + bLoopingExpr = + b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLoopingExpr(e, i, _)) | i) and + n = bLoopingExpr and + nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and + nCondition = nAttr + 1 and + ( + none() + or + result = getImmediateChildOfLoopingExpr(e, index - b, partialPredicateCall) + or + result = e.getAttr(index - n) and + partialPredicateCall = "Attr(" + (index - n).toString() + ")" + or + index = nAttr and result = e.getCondition() and partialPredicateCall = "Condition()" + ) + ) + } + cached Element getImmediateChild(Element e, int index, string partialAccessor) { // why does this look more complicated than it should? @@ -3655,8 +3685,6 @@ private module Impl { or result = getImmediateChildOfBinaryExpr(e, index, partialAccessor) or - result = getImmediateChildOfBlockExpr(e, index, partialAccessor) - or result = getImmediateChildOfBoxPat(e, index, partialAccessor) or result = getImmediateChildOfBreakExpr(e, index, partialAccessor) @@ -3683,8 +3711,6 @@ private module Impl { or result = getImmediateChildOfFnPtrType(e, index, partialAccessor) or - result = getImmediateChildOfForExpr(e, index, partialAccessor) - or result = getImmediateChildOfForType(e, index, partialAccessor) or result = getImmediateChildOfFormatArgsExpr(e, index, partialAccessor) @@ -3711,8 +3737,6 @@ private module Impl { or result = getImmediateChildOfLiteralPat(e, index, partialAccessor) or - result = getImmediateChildOfLoopExpr(e, index, partialAccessor) - or result = getImmediateChildOfMacroExpr(e, index, partialAccessor) or result = getImmediateChildOfMacroPat(e, index, partialAccessor) @@ -3785,14 +3809,14 @@ private module Impl { or result = getImmediateChildOfUnderscoreExpr(e, index, partialAccessor) or - result = getImmediateChildOfWhileExpr(e, index, partialAccessor) - or result = getImmediateChildOfWildcardPat(e, index, partialAccessor) or result = getImmediateChildOfYeetExpr(e, index, partialAccessor) or result = getImmediateChildOfYieldExpr(e, index, partialAccessor) or + result = getImmediateChildOfBlockExpr(e, index, partialAccessor) + or result = getImmediateChildOfCallExpr(e, index, partialAccessor) or result = getImmediateChildOfConst(e, index, partialAccessor) @@ -3834,6 +3858,12 @@ private module Impl { result = getImmediateChildOfUnion(e, index, partialAccessor) or result = getImmediateChildOfUse(e, index, partialAccessor) + or + result = getImmediateChildOfForExpr(e, index, partialAccessor) + or + result = getImmediateChildOfLoopExpr(e, index, partialAccessor) + or + result = getImmediateChildOfWhileExpr(e, index, partialAccessor) } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll index 58f7d891d263..36313ca9fe9a 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Path.qll @@ -18,6 +18,7 @@ module Generated { /** * A path. For example: * ```rust + * use some_crate::some_module::some_item; * foo::bar; * ``` * INTERNAL: Do not reference the `Generated::Path` class directly. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll index 0878635e7d17..a2c3b970df68 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathSegment.qll @@ -21,10 +21,7 @@ import codeql.rust.elements.TypeRef */ module Generated { /** - * A PathSegment. For example: - * ```rust - * todo!() - * ``` + * A path segment, which is one part of a whole path. * INTERNAL: Do not reference the `Generated::PathSegment` class directly. * Use the subclass `PathSegment`, where the following predicates are available. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/PathType.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/PathType.qll index 3ac799108ccb..13d7957c40e0 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/PathType.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/PathType.qll @@ -15,9 +15,10 @@ import codeql.rust.elements.internal.TypeRefImpl::Impl as TypeRefImpl */ module Generated { /** - * A PathType. For example: + * A type referring to a path. For example: * ```rust - * todo!() + * type X = std::collections::HashMap; + * type Y = X::Item; * ``` * INTERNAL: Do not reference the `Generated::PathType` class directly. * Use the subclass `PathType`, where the following predicates are available. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index 25af8ddac644..64de46c55bb1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -578,10 +578,7 @@ module Raw { /** * INTERNAL: Do not use. - * A PathSegment. For example: - * ```rust - * todo!() - * ``` + * A path segment, which is one part of a whole path. */ class PathSegment extends @path_segment, AstNode { override string toString() { result = "PathSegment" } @@ -1366,70 +1363,6 @@ module Raw { Expr getRhs() { binary_expr_rhs(this, result) } } - /** - * INTERNAL: Do not use. - * A block expression. For example: - * ```rust - * { - * let x = 42; - * } - * ``` - * ```rust - * 'label: { - * let x = 42; - * x - * } - * ``` - */ - class BlockExpr extends @block_expr, Expr { - override string toString() { result = "BlockExpr" } - - /** - * Gets the `index`th attr of this block expression (0-based). - */ - Attr getAttr(int index) { block_expr_attrs(this, index, result) } - - /** - * Holds if this block expression is async. - */ - predicate isAsync() { block_expr_is_async(this) } - - /** - * Holds if this block expression is const. - */ - predicate isConst() { block_expr_is_const(this) } - - /** - * Holds if this block expression is gen. - */ - predicate isGen() { block_expr_is_gen(this) } - - /** - * Holds if this block expression is move. - */ - predicate isMove() { block_expr_is_move(this) } - - /** - * Holds if this block expression is try. - */ - predicate isTry() { block_expr_is_try(this) } - - /** - * Holds if this block expression is unsafe. - */ - predicate isUnsafe() { block_expr_is_unsafe(this) } - - /** - * Gets the label of this block expression, if it exists. - */ - Label getLabel() { block_expr_labels(this, result) } - - /** - * Gets the statement list of this block expression, if it exists. - */ - StmtList getStmtList() { block_expr_stmt_lists(this, result) } - } - /** * INTERNAL: Do not use. * A box pattern. For example: @@ -1824,42 +1757,6 @@ module Raw { RetType getRetType() { fn_ptr_type_ret_types(this, result) } } - /** - * INTERNAL: Do not use. - * A ForExpr. For example: - * ```rust - * todo!() - * ``` - */ - class ForExpr extends @for_expr, Expr { - override string toString() { result = "ForExpr" } - - /** - * Gets the `index`th attr of this for expression (0-based). - */ - Attr getAttr(int index) { for_expr_attrs(this, index, result) } - - /** - * Gets the iterable of this for expression, if it exists. - */ - Expr getIterable() { for_expr_iterables(this, result) } - - /** - * Gets the label of this for expression, if it exists. - */ - Label getLabel() { for_expr_labels(this, result) } - - /** - * Gets the loop body of this for expression, if it exists. - */ - BlockExpr getLoopBody() { for_expr_loop_bodies(this, result) } - - /** - * Gets the pat of this for expression, if it exists. - */ - Pat getPat() { for_expr_pats(this, result) } - } - /** * INTERNAL: Do not use. * A ForType. For example: @@ -1885,7 +1782,11 @@ module Raw { * INTERNAL: Do not use. * A FormatArgsExpr. For example: * ```rust - * todo!() + * format_args!("no args"); + * format_args!("{} foo {:?}", 1, 2); + * format_args!("{b} foo {a:?}", a=1, b=2); + * let (x, y) = (1, 42); + * format_args!("{x}, {y}"); * ``` */ class FormatArgsExpr extends @format_args_expr, Expr { @@ -2071,6 +1972,17 @@ module Raw { string getCrateOrigin() { item_crate_origins(this, result) } } + /** + * INTERNAL: Do not use. + * The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + */ + class LabelableExpr extends @labelable_expr, Expr { + /** + * Gets the label of this labelable expression, if it exists. + */ + Label getLabel() { labelable_expr_labels(this, result) } + } + /** * INTERNAL: Do not use. * A `let` expression. For example: @@ -2231,50 +2143,6 @@ module Raw { LiteralExpr getLiteral() { literal_pat_literals(this, result) } } - /** - * INTERNAL: Do not use. - * A loop expression. For example: - * ```rust - * loop { - * println!("Hello, world (again)!"); - * }; - * ``` - * ```rust - * 'label: loop { - * println!("Hello, world (once)!"); - * break 'label; - * }; - * ``` - * ```rust - * let mut x = 0; - * loop { - * if x < 10 { - * x += 1; - * } else { - * break; - * } - * }; - * ``` - */ - class LoopExpr extends @loop_expr, Expr { - override string toString() { result = "LoopExpr" } - - /** - * Gets the `index`th attr of this loop expression (0-based). - */ - Attr getAttr(int index) { loop_expr_attrs(this, index, result) } - - /** - * Gets the label of this loop expression, if it exists. - */ - Label getLabel() { loop_expr_labels(this, result) } - - /** - * Gets the loop body of this loop expression, if it exists. - */ - BlockExpr getLoopBody() { loop_expr_loop_bodies(this, result) } - } - /** * INTERNAL: Do not use. * A MacroExpr. For example: @@ -2470,6 +2338,7 @@ module Raw { * INTERNAL: Do not use. * A path. For example: * ```rust + * use some_crate::some_module::some_item; * foo::bar; * ``` */ @@ -2514,9 +2383,10 @@ module Raw { /** * INTERNAL: Do not use. - * A PathType. For example: + * A type referring to a path. For example: * ```rust - * todo!() + * type X = std::collections::HashMap; + * type Y = X::Item; * ``` */ class PathType extends @path_type, TypeRef { @@ -3063,37 +2933,6 @@ module Raw { Attr getAttr(int index) { underscore_expr_attrs(this, index, result) } } - /** - * INTERNAL: Do not use. - * A WhileExpr. For example: - * ```rust - * todo!() - * ``` - */ - class WhileExpr extends @while_expr, Expr { - override string toString() { result = "WhileExpr" } - - /** - * Gets the `index`th attr of this while expression (0-based). - */ - Attr getAttr(int index) { while_expr_attrs(this, index, result) } - - /** - * Gets the condition of this while expression, if it exists. - */ - Expr getCondition() { while_expr_conditions(this, result) } - - /** - * Gets the label of this while expression, if it exists. - */ - Label getLabel() { while_expr_labels(this, result) } - - /** - * Gets the loop body of this while expression, if it exists. - */ - BlockExpr getLoopBody() { while_expr_loop_bodies(this, result) } - } - /** * INTERNAL: Do not use. * A wildcard pattern. For example: @@ -3152,6 +2991,65 @@ module Raw { Expr getExpr() { yield_expr_exprs(this, result) } } + /** + * INTERNAL: Do not use. + * A block expression. For example: + * ```rust + * { + * let x = 42; + * } + * ``` + * ```rust + * 'label: { + * let x = 42; + * x + * } + * ``` + */ + class BlockExpr extends @block_expr, LabelableExpr { + override string toString() { result = "BlockExpr" } + + /** + * Gets the `index`th attr of this block expression (0-based). + */ + Attr getAttr(int index) { block_expr_attrs(this, index, result) } + + /** + * Holds if this block expression is async. + */ + predicate isAsync() { block_expr_is_async(this) } + + /** + * Holds if this block expression is const. + */ + predicate isConst() { block_expr_is_const(this) } + + /** + * Holds if this block expression is gen. + */ + predicate isGen() { block_expr_is_gen(this) } + + /** + * Holds if this block expression is move. + */ + predicate isMove() { block_expr_is_move(this) } + + /** + * Holds if this block expression is try. + */ + predicate isTry() { block_expr_is_try(this) } + + /** + * Holds if this block expression is unsafe. + */ + predicate isUnsafe() { block_expr_is_unsafe(this) } + + /** + * Gets the statement list of this block expression, if it exists. + */ + StmtList getStmtList() { block_expr_stmt_lists(this, result) } + } + /** * INTERNAL: Do not use. * A function call expression. For example: @@ -3458,6 +3356,17 @@ module Raw { WhereClause getWhereClause() { impl_where_clauses(this, result) } } + /** + * INTERNAL: Do not use. + * The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + */ + class LoopingExpr extends @looping_expr, LabelableExpr { + /** + * Gets the loop body of this looping expression, if it exists. + */ + BlockExpr getLoopBody() { looping_expr_loop_bodies(this, result) } + } + /** * INTERNAL: Do not use. * A MacroCall. For example: @@ -3950,4 +3859,85 @@ module Raw { */ Visibility getVisibility() { use_visibilities(this, result) } } + + /** + * INTERNAL: Do not use. + * A ForExpr. For example: + * ```rust + * todo!() + * ``` + */ + class ForExpr extends @for_expr, LoopingExpr { + override string toString() { result = "ForExpr" } + + /** + * Gets the `index`th attr of this for expression (0-based). + */ + Attr getAttr(int index) { for_expr_attrs(this, index, result) } + + /** + * Gets the iterable of this for expression, if it exists. + */ + Expr getIterable() { for_expr_iterables(this, result) } + + /** + * Gets the pat of this for expression, if it exists. + */ + Pat getPat() { for_expr_pats(this, result) } + } + + /** + * INTERNAL: Do not use. + * A loop expression. For example: + * ```rust + * loop { + * println!("Hello, world (again)!"); + * }; + * ``` + * ```rust + * 'label: loop { + * println!("Hello, world (once)!"); + * break 'label; + * }; + * ``` + * ```rust + * let mut x = 0; + * loop { + * if x < 10 { + * x += 1; + * } else { + * break; + * } + * }; + * ``` + */ + class LoopExpr extends @loop_expr, LoopingExpr { + override string toString() { result = "LoopExpr" } + + /** + * Gets the `index`th attr of this loop expression (0-based). + */ + Attr getAttr(int index) { loop_expr_attrs(this, index, result) } + } + + /** + * INTERNAL: Do not use. + * A WhileExpr. For example: + * ```rust + * todo!() + * ``` + */ + class WhileExpr extends @while_expr, LoopingExpr { + override string toString() { result = "WhileExpr" } + + /** + * Gets the `index`th attr of this while expression (0-based). + */ + Attr getAttr(int index) { while_expr_attrs(this, index, result) } + + /** + * Gets the condition of this while expression, if it exists. + */ + Expr getCondition() { while_expr_conditions(this, result) } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index 927ba1f238d8..dda242ffdf93 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -645,12 +645,12 @@ module Synth { * INTERNAL: Do not use. */ class TExpr = - TArrayExpr or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or TBlockExpr or - TBreakExpr or TCallExprBase or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or - TForExpr or TFormatArgsExpr or TIfExpr or TIndexExpr or TLetExpr or TLiteralExpr or - TLoopExpr or TMacroExpr or TMatchExpr or TOffsetOfExpr or TParenExpr or TPathExprBase or - TPrefixExpr or TRangeExpr or TRecordExpr or TRefExpr or TReturnExpr or TTryExpr or - TTupleExpr or TUnderscoreExpr or TWhileExpr or TYeetExpr or TYieldExpr; + TArrayExpr or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or TBreakExpr or + TCallExprBase or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or + TFormatArgsExpr or TIfExpr or TIndexExpr or TLabelableExpr or TLetExpr or TLiteralExpr or + TMacroExpr or TMatchExpr or TOffsetOfExpr or TParenExpr or TPathExprBase or TPrefixExpr or + TRangeExpr or TRecordExpr or TRefExpr or TReturnExpr or TTryExpr or TTupleExpr or + TUnderscoreExpr or TYeetExpr or TYieldExpr; /** * INTERNAL: Do not use. @@ -680,11 +680,21 @@ module Synth { TMacroDef or TMacroRules or TModule or TStatic or TStruct or TTrait or TTraitAlias or TTypeAlias or TUnion or TUse; + /** + * INTERNAL: Do not use. + */ + class TLabelableExpr = TBlockExpr or TLoopingExpr; + /** * INTERNAL: Do not use. */ class TLocatable = TAstNode or TFormat or TFormatArgument; + /** + * INTERNAL: Do not use. + */ + class TLoopingExpr = TForExpr or TLoopExpr or TWhileExpr; + /** * INTERNAL: Do not use. */ @@ -1795,8 +1805,6 @@ module Synth { or result = convertBinaryExprFromRaw(e) or - result = convertBlockExprFromRaw(e) - or result = convertBreakExprFromRaw(e) or result = convertCallExprBaseFromRaw(e) @@ -1809,20 +1817,18 @@ module Synth { or result = convertFieldExprFromRaw(e) or - result = convertForExprFromRaw(e) - or result = convertFormatArgsExprFromRaw(e) or result = convertIfExprFromRaw(e) or result = convertIndexExprFromRaw(e) or + result = convertLabelableExprFromRaw(e) + or result = convertLetExprFromRaw(e) or result = convertLiteralExprFromRaw(e) or - result = convertLoopExprFromRaw(e) - or result = convertMacroExprFromRaw(e) or result = convertMatchExprFromRaw(e) @@ -1849,8 +1855,6 @@ module Synth { or result = convertUnderscoreExprFromRaw(e) or - result = convertWhileExprFromRaw(e) - or result = convertYeetExprFromRaw(e) or result = convertYieldExprFromRaw(e) @@ -1946,6 +1950,16 @@ module Synth { result = convertUseFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLabelableExpr`, if possible. + */ + TLabelableExpr convertLabelableExprFromRaw(Raw::Element e) { + result = convertBlockExprFromRaw(e) + or + result = convertLoopingExprFromRaw(e) + } + /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TLocatable`, if possible. @@ -1958,6 +1972,18 @@ module Synth { result = convertFormatArgumentFromRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a raw DB element to a synthesized `TLoopingExpr`, if possible. + */ + TLoopingExpr convertLoopingExprFromRaw(Raw::Element e) { + result = convertForExprFromRaw(e) + or + result = convertLoopExprFromRaw(e) + or + result = convertWhileExprFromRaw(e) + } + /** * INTERNAL: Do not use. * Converts a raw DB element to a synthesized `TPat`, if possible. @@ -3145,8 +3171,6 @@ module Synth { or result = convertBinaryExprToRaw(e) or - result = convertBlockExprToRaw(e) - or result = convertBreakExprToRaw(e) or result = convertCallExprBaseToRaw(e) @@ -3159,20 +3183,18 @@ module Synth { or result = convertFieldExprToRaw(e) or - result = convertForExprToRaw(e) - or result = convertFormatArgsExprToRaw(e) or result = convertIfExprToRaw(e) or result = convertIndexExprToRaw(e) or + result = convertLabelableExprToRaw(e) + or result = convertLetExprToRaw(e) or result = convertLiteralExprToRaw(e) or - result = convertLoopExprToRaw(e) - or result = convertMacroExprToRaw(e) or result = convertMatchExprToRaw(e) @@ -3199,8 +3221,6 @@ module Synth { or result = convertUnderscoreExprToRaw(e) or - result = convertWhileExprToRaw(e) - or result = convertYeetExprToRaw(e) or result = convertYieldExprToRaw(e) @@ -3296,6 +3316,16 @@ module Synth { result = convertUseToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLabelableExpr` to a raw DB element, if possible. + */ + Raw::Element convertLabelableExprToRaw(TLabelableExpr e) { + result = convertBlockExprToRaw(e) + or + result = convertLoopingExprToRaw(e) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TLocatable` to a raw DB element, if possible. @@ -3308,6 +3338,18 @@ module Synth { result = convertFormatArgumentToRaw(e) } + /** + * INTERNAL: Do not use. + * Converts a synthesized `TLoopingExpr` to a raw DB element, if possible. + */ + Raw::Element convertLoopingExprToRaw(TLoopingExpr e) { + result = convertForExprToRaw(e) + or + result = convertLoopExprToRaw(e) + or + result = convertWhileExprToRaw(e) + } + /** * INTERNAL: Do not use. * Converts a synthesized `TPat` to a raw DB element, if possible. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/WhileExpr.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/WhileExpr.qll index 5cd48bb25063..fa4a4aee65c5 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/WhileExpr.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/WhileExpr.qll @@ -7,10 +7,8 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.Attr -import codeql.rust.elements.BlockExpr import codeql.rust.elements.Expr -import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl -import codeql.rust.elements.Label +import codeql.rust.elements.internal.LoopingExprImpl::Impl as LoopingExprImpl /** * INTERNAL: This module contains the fully generated definition of `WhileExpr` and should not @@ -25,7 +23,7 @@ module Generated { * INTERNAL: Do not reference the `Generated::WhileExpr` class directly. * Use the subclass `WhileExpr`, where the following predicates are available. */ - class WhileExpr extends Synth::TWhileExpr, ExprImpl::Expr { + class WhileExpr extends Synth::TWhileExpr, LoopingExprImpl::LoopingExpr { override string getAPrimaryQlClass() { result = "WhileExpr" } /** @@ -58,33 +56,5 @@ module Generated { * Holds if `getCondition()` exists. */ final predicate hasCondition() { exists(this.getCondition()) } - - /** - * Gets the label of this while expression, if it exists. - */ - Label getLabel() { - result = - Synth::convertLabelFromRaw(Synth::convertWhileExprToRaw(this).(Raw::WhileExpr).getLabel()) - } - - /** - * Holds if `getLabel()` exists. - */ - final predicate hasLabel() { exists(this.getLabel()) } - - /** - * Gets the loop body of this while expression, if it exists. - */ - BlockExpr getLoopBody() { - result = - Synth::convertBlockExprFromRaw(Synth::convertWhileExprToRaw(this) - .(Raw::WhileExpr) - .getLoopBody()) - } - - /** - * Holds if `getLoopBody()` exists. - */ - final predicate hasLoopBody() { exists(this.getLoopBody()) } } } diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 666a1e2b0e16..c9933b5b5e33 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -292,20 +292,18 @@ closure_binder_generic_param_lists( | @await_expr | @become_expr | @binary_expr -| @block_expr | @break_expr | @call_expr_base | @cast_expr | @closure_expr | @continue_expr | @field_expr -| @for_expr | @format_args_expr | @if_expr | @index_expr +| @labelable_expr | @let_expr | @literal_expr -| @loop_expr | @macro_expr | @match_expr | @offset_of_expr @@ -319,7 +317,6 @@ closure_binder_generic_param_lists( | @try_expr | @tuple_expr | @underscore_expr -| @while_expr | @yeet_expr | @yield_expr ; @@ -1314,59 +1311,6 @@ binary_expr_rhs( int rhs: @expr ref ); -block_exprs( - unique int id: @block_expr -); - -#keyset[id, index] -block_expr_attrs( - int id: @block_expr ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -block_expr_is_async( - int id: @block_expr ref -); - -#keyset[id] -block_expr_is_const( - int id: @block_expr ref -); - -#keyset[id] -block_expr_is_gen( - int id: @block_expr ref -); - -#keyset[id] -block_expr_is_move( - int id: @block_expr ref -); - -#keyset[id] -block_expr_is_try( - int id: @block_expr ref -); - -#keyset[id] -block_expr_is_unsafe( - int id: @block_expr ref -); - -#keyset[id] -block_expr_labels( - int id: @block_expr ref, - int label: @label ref -); - -#keyset[id] -block_expr_stmt_lists( - int id: @block_expr ref, - int stmt_list: @stmt_list ref -); - box_pats( unique int id: @box_pat ); @@ -1650,41 +1594,6 @@ fn_ptr_type_ret_types( int ret_type: @ret_type ref ); -for_exprs( - unique int id: @for_expr -); - -#keyset[id, index] -for_expr_attrs( - int id: @for_expr ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -for_expr_iterables( - int id: @for_expr ref, - int iterable: @expr ref -); - -#keyset[id] -for_expr_labels( - int id: @for_expr ref, - int label: @label ref -); - -#keyset[id] -for_expr_loop_bodies( - int id: @for_expr ref, - int loop_body: @block_expr ref -); - -#keyset[id] -for_expr_pats( - int id: @for_expr ref, - int pat: @pat ref -); - for_types( unique int id: @for_type ); @@ -1856,6 +1765,17 @@ item_crate_origins( string crate_origin: string ref ); +@labelable_expr = + @block_expr +| @looping_expr +; + +#keyset[id] +labelable_expr_labels( + int id: @labelable_expr ref, + int label: @label ref +); + let_exprs( unique int id: @let_expr ); @@ -1974,29 +1894,6 @@ literal_pat_literals( int literal: @literal_expr ref ); -loop_exprs( - unique int id: @loop_expr -); - -#keyset[id, index] -loop_expr_attrs( - int id: @loop_expr ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -loop_expr_labels( - int id: @loop_expr ref, - int label: @label ref -); - -#keyset[id] -loop_expr_loop_bodies( - int id: @loop_expr ref, - int loop_body: @block_expr ref -); - macro_exprs( unique int id: @macro_expr ); @@ -2555,35 +2452,6 @@ underscore_expr_attrs( int attr: @attr ref ); -while_exprs( - unique int id: @while_expr -); - -#keyset[id, index] -while_expr_attrs( - int id: @while_expr ref, - int index: int ref, - int attr: @attr ref -); - -#keyset[id] -while_expr_conditions( - int id: @while_expr ref, - int condition: @expr ref -); - -#keyset[id] -while_expr_labels( - int id: @while_expr ref, - int label: @label ref -); - -#keyset[id] -while_expr_loop_bodies( - int id: @while_expr ref, - int loop_body: @block_expr ref -); - wildcard_pats( unique int id: @wildcard_pat ); @@ -2622,6 +2490,53 @@ yield_expr_exprs( int expr: @expr ref ); +block_exprs( + unique int id: @block_expr +); + +#keyset[id, index] +block_expr_attrs( + int id: @block_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +block_expr_is_async( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_const( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_gen( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_move( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_try( + int id: @block_expr ref +); + +#keyset[id] +block_expr_is_unsafe( + int id: @block_expr ref +); + +#keyset[id] +block_expr_stmt_lists( + int id: @block_expr ref, + int stmt_list: @stmt_list ref +); + call_exprs( unique int id: @call_expr ); @@ -2908,6 +2823,18 @@ impl_where_clauses( int where_clause: @where_clause ref ); +@looping_expr = + @for_expr +| @loop_expr +| @while_expr +; + +#keyset[id] +looping_expr_loop_bodies( + int id: @looping_expr ref, + int loop_body: @block_expr ref +); + macro_calls( unique int id: @macro_call ); @@ -3368,3 +3295,54 @@ use_visibilities( int id: @use ref, int visibility: @visibility ref ); + +for_exprs( + unique int id: @for_expr +); + +#keyset[id, index] +for_expr_attrs( + int id: @for_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +for_expr_iterables( + int id: @for_expr ref, + int iterable: @expr ref +); + +#keyset[id] +for_expr_pats( + int id: @for_expr ref, + int pat: @pat ref +); + +loop_exprs( + unique int id: @loop_expr +); + +#keyset[id, index] +loop_expr_attrs( + int id: @loop_expr ref, + int index: int ref, + int attr: @attr ref +); + +while_exprs( + unique int id: @while_expr +); + +#keyset[id, index] +while_expr_attrs( + int id: @while_expr ref, + int index: int ref, + int attr: @attr ref +); + +#keyset[id] +while_expr_conditions( + int id: @while_expr ref, + int condition: @expr ref +); diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index 622652e091f7..94bcc7379d95 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -1,36 +1,36 @@ canonicalPaths -| canonical_paths.rs:1:1:34:1 | Module | repo::test | crate::canonical_paths::a | +| canonical_paths.rs:1:1:34:1 | mod a | repo::test | crate::canonical_paths::a | | canonical_paths.rs:2:5:3:22 | Struct | repo::test | crate::canonical_paths::a::Struct | -| canonical_paths.rs:5:5:7:5 | Trait | repo::test | crate::canonical_paths::a::Trait | -| canonical_paths.rs:6:9:6:20 | f | repo::test | crate::canonical_paths::a::Trait::f | -| canonical_paths.rs:9:5:11:5 | Impl | None | None | -| canonical_paths.rs:10:9:10:22 | f | repo::test | ::f | -| canonical_paths.rs:13:5:15:5 | Impl | None | None | -| canonical_paths.rs:14:9:14:22 | g | repo::test | ::g | -| canonical_paths.rs:17:5:19:5 | Trait | repo::test | crate::canonical_paths::a::TraitWithBlanketImpl | -| canonical_paths.rs:18:9:18:20 | h | repo::test | crate::canonical_paths::a::TraitWithBlanketImpl::h | -| canonical_paths.rs:21:5:23:5 | Impl | None | None | -| canonical_paths.rs:22:9:22:22 | h | repo::test | <_ as crate::canonical_paths::a::TraitWithBlanketImpl>::h | -| canonical_paths.rs:25:5:25:16 | free | repo::test | crate::canonical_paths::a::free | -| canonical_paths.rs:27:5:33:5 | usage | repo::test | crate::canonical_paths::a::usage | -| canonical_paths.rs:36:1:73:1 | Module | repo::test | crate::canonical_paths::without | +| canonical_paths.rs:5:5:7:5 | trait Trait | repo::test | crate::canonical_paths::a::Trait | +| canonical_paths.rs:6:9:6:20 | fn f | repo::test | crate::canonical_paths::a::Trait::f | +| canonical_paths.rs:9:5:11:5 | impl Trait for Struct { ... } | None | None | +| canonical_paths.rs:10:9:10:22 | fn f | repo::test | ::f | +| canonical_paths.rs:13:5:15:5 | impl Struct { ... } | None | None | +| canonical_paths.rs:14:9:14:22 | fn g | repo::test | ::g | +| canonical_paths.rs:17:5:19:5 | trait TraitWithBlanketImpl | repo::test | crate::canonical_paths::a::TraitWithBlanketImpl | +| canonical_paths.rs:18:9:18:20 | fn h | repo::test | crate::canonical_paths::a::TraitWithBlanketImpl::h | +| canonical_paths.rs:21:5:23:5 | impl TraitWithBlanketImpl for T { ... } | None | None | +| canonical_paths.rs:22:9:22:22 | fn h | repo::test | <_ as crate::canonical_paths::a::TraitWithBlanketImpl>::h | +| canonical_paths.rs:25:5:25:16 | fn free | repo::test | crate::canonical_paths::a::free | +| canonical_paths.rs:27:5:33:5 | fn usage | repo::test | crate::canonical_paths::a::usage | +| canonical_paths.rs:36:1:73:1 | mod without | repo::test | crate::canonical_paths::without | | canonical_paths.rs:37:5:37:24 | Use | None | None | -| canonical_paths.rs:39:5:68:5 | canonicals | repo::test | crate::canonical_paths::without::canonicals | +| canonical_paths.rs:39:5:68:5 | fn canonicals | repo::test | crate::canonical_paths::without::canonicals | | canonical_paths.rs:40:9:40:27 | Struct | repo::test | {34}::OtherStruct | -| canonical_paths.rs:42:9:44:9 | Trait | repo::test | {34}::OtherTrait | -| canonical_paths.rs:43:13:43:24 | g | repo::test | {34}::OtherTrait::g | -| canonical_paths.rs:46:9:48:9 | Impl | None | None | -| canonical_paths.rs:47:13:47:26 | g | repo::test | <{34}::OtherStruct as {34}::OtherTrait>::g | -| canonical_paths.rs:50:9:52:9 | Impl | None | None | -| canonical_paths.rs:51:13:51:26 | g | repo::test | ::g | -| canonical_paths.rs:54:9:56:9 | Impl | None | None | -| canonical_paths.rs:55:13:55:26 | f | repo::test | <{34}::OtherStruct as crate::canonical_paths::a::Trait>::f | -| canonical_paths.rs:58:9:60:9 | nested | repo::test | {34}::nested | +| canonical_paths.rs:42:9:44:9 | trait OtherTrait | repo::test | {34}::OtherTrait | +| canonical_paths.rs:43:13:43:24 | fn g | repo::test | {34}::OtherTrait::g | +| canonical_paths.rs:46:9:48:9 | impl OtherTrait for OtherStruct { ... } | None | None | +| canonical_paths.rs:47:13:47:26 | fn g | repo::test | <{34}::OtherStruct as {34}::OtherTrait>::g | +| canonical_paths.rs:50:9:52:9 | impl OtherTrait for ...::Struct { ... } | None | None | +| canonical_paths.rs:51:13:51:26 | fn g | repo::test | ::g | +| canonical_paths.rs:54:9:56:9 | impl ...::Trait for OtherStruct { ... } | None | None | +| canonical_paths.rs:55:13:55:26 | fn f | repo::test | <{34}::OtherStruct as crate::canonical_paths::a::Trait>::f | +| canonical_paths.rs:58:9:60:9 | fn nested | repo::test | {34}::nested | | canonical_paths.rs:59:13:59:31 | Struct | repo::test | {35}::OtherStruct | -| canonical_paths.rs:62:9:67:9 | usage | repo::test | {34}::usage | -| canonical_paths.rs:70:5:72:5 | other | repo::test | crate::canonical_paths::without::other | +| canonical_paths.rs:62:9:67:9 | fn usage | repo::test | {34}::usage | +| canonical_paths.rs:70:5:72:5 | fn other | repo::test | crate::canonical_paths::without::other | | canonical_paths.rs:71:9:71:27 | Struct | repo::test | {36}::OtherStruct | -| lib.rs:1:1:1:20 | Module | repo::test | crate::canonical_paths | +| lib.rs:1:1:1:20 | mod canonical_paths | repo::test | crate::canonical_paths | resolvedPaths | canonical_paths.rs:2:7:2:12 | derive | None | None | | canonical_paths.rs:9:10:9:14 | Trait | repo::test | crate::canonical_paths::a::Trait | @@ -48,19 +48,19 @@ resolvedPaths | canonical_paths.rs:31:9:31:13 | ... .h(...) | repo::test | <_ as crate::canonical_paths::a::TraitWithBlanketImpl>::h | | canonical_paths.rs:32:9:32:12 | free | repo::test | crate::canonical_paths::a::free | | canonical_paths.rs:37:9:37:13 | super | repo::test | crate::canonical_paths | -| canonical_paths.rs:37:9:37:16 | super::a | repo::test | crate::canonical_paths::a | -| canonical_paths.rs:37:9:37:23 | super::a::Trait | repo::test | crate::canonical_paths::a::Trait | +| canonical_paths.rs:37:9:37:16 | ...::a | repo::test | crate::canonical_paths::a | +| canonical_paths.rs:37:9:37:23 | ...::Trait | repo::test | crate::canonical_paths::a::Trait | | canonical_paths.rs:46:14:46:23 | OtherTrait | repo::test | {34}::OtherTrait | | canonical_paths.rs:46:29:46:39 | OtherStruct | repo::test | {34}::OtherStruct | | canonical_paths.rs:50:14:50:23 | OtherTrait | repo::test | {34}::OtherTrait | | canonical_paths.rs:50:29:50:33 | crate | None | None | -| canonical_paths.rs:50:29:50:50 | crate::canonical_paths | repo::test | crate::canonical_paths | -| canonical_paths.rs:50:29:50:53 | crate::canonical_paths::a | repo::test | crate::canonical_paths::a | -| canonical_paths.rs:50:29:50:61 | crate::canonical_paths::a::Struct | repo::test | crate::canonical_paths::a::Struct | +| canonical_paths.rs:50:29:50:50 | ...::canonical_paths | repo::test | crate::canonical_paths | +| canonical_paths.rs:50:29:50:53 | ...::a | repo::test | crate::canonical_paths::a | +| canonical_paths.rs:50:29:50:61 | ...::Struct | repo::test | crate::canonical_paths::a::Struct | | canonical_paths.rs:54:14:54:18 | crate | None | None | -| canonical_paths.rs:54:14:54:35 | crate::canonical_paths | repo::test | crate::canonical_paths | -| canonical_paths.rs:54:14:54:38 | crate::canonical_paths::a | repo::test | crate::canonical_paths::a | -| canonical_paths.rs:54:14:54:45 | crate::canonical_paths::a::Trait | repo::test | crate::canonical_paths::a::Trait | +| canonical_paths.rs:54:14:54:35 | ...::canonical_paths | repo::test | crate::canonical_paths | +| canonical_paths.rs:54:14:54:38 | ...::a | repo::test | crate::canonical_paths::a | +| canonical_paths.rs:54:14:54:45 | ...::Trait | repo::test | crate::canonical_paths::a::Trait | | canonical_paths.rs:54:51:54:61 | OtherStruct | repo::test | {34}::OtherStruct | | canonical_paths.rs:63:21:63:31 | OtherStruct | repo::test | {34}::OtherStruct | | canonical_paths.rs:64:13:64:13 | s | None | None | diff --git a/rust/ql/test/extractor-tests/generated/.generated_tests.list b/rust/ql/test/extractor-tests/generated/.generated_tests.list index b60779ebd86a..83affdc7e649 100644 --- a/rust/ql/test/extractor-tests/generated/.generated_tests.list +++ b/rust/ql/test/extractor-tests/generated/.generated_tests.list @@ -31,8 +31,10 @@ FieldExpr/gen_field_expr.rs 9a70500d592e0a071b03d974a55558b3bc0df531ff11bce5898f FnPtrType/gen_fn_ptr_type.rs a7842d8c21636739d1be959e5ce5e0b23482d5ef6eab5c45b009895da8175932 a7842d8c21636739d1be959e5ce5e0b23482d5ef6eab5c45b009895da8175932 ForExpr/gen_for_expr.rs 67decf3073e1a9363d9df05a5a64a6059349e50b81356f480f7aeb352189136d 67decf3073e1a9363d9df05a5a64a6059349e50b81356f480f7aeb352189136d ForType/gen_for_type.rs 6cb447df02c61b192e283e019576c28225added02d167030d64ebd0bebb1b158 6cb447df02c61b192e283e019576c28225added02d167030d64ebd0bebb1b158 -FormatArgsArg/gen_format_args_arg.rs c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a -FormatArgsExpr/gen_format_args_expr.rs 7184dbb8833f970676e59fca3a40ec51d14a68e3151d8a6d637896494f2b4454 7184dbb8833f970676e59fca3a40ec51d14a68e3151d8a6d637896494f2b4454 +FormatArgsExpr/gen_format.rs bd009cb152c35e2aacd147b5520a42be31e66e9a8715ec1d0fd57b8e97c743ed bd009cb152c35e2aacd147b5520a42be31e66e9a8715ec1d0fd57b8e97c743ed +FormatArgsExpr/gen_format_args_arg.rs c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a c466f2fc2c0f9592061a159a217a87551d67f1ccb0e4d8f7f56a463a2aa4a73a +FormatArgsExpr/gen_format_args_expr.rs 72c806ed163e9dcce2d0c5c8664d409b2aa635c1022c91959f9e8ae084f05bf2 72c806ed163e9dcce2d0c5c8664d409b2aa635c1022c91959f9e8ae084f05bf2 +FormatArgsExpr/gen_format_argument.rs 350d370e6f1db03d756384a3dbdb294697d241ff7c28d159cf57748abe99cfe9 350d370e6f1db03d756384a3dbdb294697d241ff7c28d159cf57748abe99cfe9 Function/gen_function.rs ba6ecb9e0d89183295eb02f3c20ebbf5c209f89bd0172c73a3b4a6dacbf3a54c ba6ecb9e0d89183295eb02f3c20ebbf5c209f89bd0172c73a3b4a6dacbf3a54c GenericArgList/gen_generic_arg_list.rs cfb072d3b48f9dd568c23d4dfefba28766628678f66bbf9a436de9919ead35f5 cfb072d3b48f9dd568c23d4dfefba28766628678f66bbf9a436de9919ead35f5 GenericParamList/gen_generic_param_list.rs 4cc9b628f53e1a6c5781ad195b8648fa6dee0bb41b24007fbd986527374d3669 4cc9b628f53e1a6c5781ad195b8648fa6dee0bb41b24007fbd986527374d3669 @@ -78,11 +80,10 @@ ParamList/gen_param_list.rs ef2e83d0aed45b969fe78dd717e87ef3c1f848e6179cfb4dc3cb ParenExpr/gen_paren_expr.rs dd0c4a21a92e54e8a6151145e013cbec9c9e1cad093d572e293b4f51d6c44aea dd0c4a21a92e54e8a6151145e013cbec9c9e1cad093d572e293b4f51d6c44aea ParenPat/gen_paren_pat.rs c8d18521b9a0b7d39841eb72e3895914aa652b7235dea42ed12a4eb280e3bf0e c8d18521b9a0b7d39841eb72e3895914aa652b7235dea42ed12a4eb280e3bf0e ParenType/gen_paren_type.rs ae1a945b56020eab14bb0ef75ae9ccb735d8e45d1213adee210a90e6dba8430f ae1a945b56020eab14bb0ef75ae9ccb735d8e45d1213adee210a90e6dba8430f -Path/gen_path.rs e32637d04445d5b9411086f3ad5d8b41de24327f7ad641d1a1a25c1d160121c8 e32637d04445d5b9411086f3ad5d8b41de24327f7ad641d1a1a25c1d160121c8 -PathExpr/gen_path_expr.rs a1e0ececfe62a63a43583c9bd8064a80a90c042c55bac29d86776c0c6559f33a a1e0ececfe62a63a43583c9bd8064a80a90c042c55bac29d86776c0c6559f33a -PathPat/gen_path_pat.rs fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 -PathSegment/gen_path_segment.rs bc0c914821a70f9a7db23766f4d84e2d69fc76d5075a8bc3341f2ba59a8ce911 bc0c914821a70f9a7db23766f4d84e2d69fc76d5075a8bc3341f2ba59a8ce911 -PathType/gen_path_type.rs 710a5505615769da940202e7c6d9031edc23a4b05cd9fb25241c60affbba4027 710a5505615769da940202e7c6d9031edc23a4b05cd9fb25241c60affbba4027 +Path/gen_path.rs 490268d6bfb1635883b8bdefc683d59c4dd0e9c7f86c2e55954661efb3ab0253 490268d6bfb1635883b8bdefc683d59c4dd0e9c7f86c2e55954661efb3ab0253 +Path/gen_path_expr.rs a1e0ececfe62a63a43583c9bd8064a80a90c042c55bac29d86776c0c6559f33a a1e0ececfe62a63a43583c9bd8064a80a90c042c55bac29d86776c0c6559f33a +Path/gen_path_pat.rs fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 fd7f941f8b33f19d3693be1fdb595c2fb2e85e8296702b82bf12bcd44632f371 +Path/gen_path_type.rs 210f2ce4000b59d2f908801c22c5497a0f0c9a3b1a5130e7dad0931430f49eb9 210f2ce4000b59d2f908801c22c5497a0f0c9a3b1a5130e7dad0931430f49eb9 PrefixExpr/gen_prefix_expr.rs c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab c4b53e87f370713b9a9e257be26d082b0761497bac19b1d7401a31b22b30d1ab PtrType/gen_ptr_type.rs dd7faad19454b92d7942ef664df1a5f26c01863e408b87249aa4d5d4f68c78b3 dd7faad19454b92d7942ef664df1a5f26c01863e408b87249aa4d5d4f68c78b3 RangeExpr/gen_range_expr.rs 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 3f27cff9cc76b2703beff622d1453b84121e1970a869e45f9428deac92c4ecb0 diff --git a/rust/ql/test/extractor-tests/generated/.gitattributes b/rust/ql/test/extractor-tests/generated/.gitattributes index 8ea3a00a31f0..782715565d2f 100644 --- a/rust/ql/test/extractor-tests/generated/.gitattributes +++ b/rust/ql/test/extractor-tests/generated/.gitattributes @@ -33,8 +33,10 @@ /FnPtrType/gen_fn_ptr_type.rs linguist-generated /ForExpr/gen_for_expr.rs linguist-generated /ForType/gen_for_type.rs linguist-generated -/FormatArgsArg/gen_format_args_arg.rs linguist-generated +/FormatArgsExpr/gen_format.rs linguist-generated +/FormatArgsExpr/gen_format_args_arg.rs linguist-generated /FormatArgsExpr/gen_format_args_expr.rs linguist-generated +/FormatArgsExpr/gen_format_argument.rs linguist-generated /Function/gen_function.rs linguist-generated /GenericArgList/gen_generic_arg_list.rs linguist-generated /GenericParamList/gen_generic_param_list.rs linguist-generated @@ -81,10 +83,9 @@ /ParenPat/gen_paren_pat.rs linguist-generated /ParenType/gen_paren_type.rs linguist-generated /Path/gen_path.rs linguist-generated -/PathExpr/gen_path_expr.rs linguist-generated -/PathPat/gen_path_pat.rs linguist-generated -/PathSegment/gen_path_segment.rs linguist-generated -/PathType/gen_path_type.rs linguist-generated +/Path/gen_path_expr.rs linguist-generated +/Path/gen_path_pat.rs linguist-generated +/Path/gen_path_type.rs linguist-generated /PrefixExpr/gen_prefix_expr.rs linguist-generated /PtrType/gen_ptr_type.rs linguist-generated /RangeExpr/gen_range_expr.rs linguist-generated diff --git a/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr.expected b/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr.expected index 549f43fc9892..e1ab176fe514 100644 --- a/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr.expected @@ -1,2 +1,2 @@ -| gen_array_expr.rs:5:5:5:13 | ArrayExpr | getNumberOfAttrs: | 0 | getNumberOfExprs: | 3 | -| gen_array_expr.rs:6:5:6:11 | ArrayExpr | getNumberOfAttrs: | 0 | getNumberOfExprs: | 2 | +| gen_array_expr.rs:5:5:5:13 | [...] | getNumberOfAttrs: | 0 | getNumberOfExprs: | 3 | +| gen_array_expr.rs:6:5:6:11 | [...] | getNumberOfAttrs: | 0 | getNumberOfExprs: | 2 | diff --git a/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.expected index 97da5ba1c2af..393fb28f2bfa 100644 --- a/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.expected @@ -1,5 +1,5 @@ -| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 0 | gen_array_expr.rs:5:6:5:6 | 1 | -| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 1 | gen_array_expr.rs:5:9:5:9 | 2 | -| gen_array_expr.rs:5:5:5:13 | ArrayExpr | 2 | gen_array_expr.rs:5:12:5:12 | 3 | -| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 0 | gen_array_expr.rs:6:6:6:6 | 1 | -| gen_array_expr.rs:6:5:6:11 | ArrayExpr | 1 | gen_array_expr.rs:6:9:6:10 | 10 | +| gen_array_expr.rs:5:5:5:13 | [...] | 0 | gen_array_expr.rs:5:6:5:6 | 1 | +| gen_array_expr.rs:5:5:5:13 | [...] | 1 | gen_array_expr.rs:5:9:5:9 | 2 | +| gen_array_expr.rs:5:5:5:13 | [...] | 2 | gen_array_expr.rs:5:12:5:12 | 3 | +| gen_array_expr.rs:6:5:6:11 | [...] | 0 | gen_array_expr.rs:6:6:6:6 | 1 | +| gen_array_expr.rs:6:5:6:11 | [...] | 1 | gen_array_expr.rs:6:9:6:10 | 10 | diff --git a/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr_getExpr.expected index 7a4af543f311..07aec8f5fe0d 100644 --- a/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/AsmExpr/AsmExpr_getExpr.expected @@ -1 +1 @@ -| gen_asm_expr.rs:6:9:6:24 | AsmExpr | gen_asm_expr.rs:6:23:6:23 | UnderscoreExpr | +| gen_asm_expr.rs:6:9:6:24 | AsmExpr | gen_asm_expr.rs:6:23:6:23 | _ | diff --git a/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr.expected b/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr.expected index 2ed01b9058e1..9104ba77e5fe 100644 --- a/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr.expected +++ b/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr.expected @@ -1 +1 @@ -| gen_await_expr.rs:6:17:6:27 | AwaitExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_await_expr.rs:6:17:6:27 | await ... | getNumberOfAttrs: | 0 | hasExpr: | yes | diff --git a/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr_getExpr.expected index c34a6012f4c3..a1ea7809bb01 100644 --- a/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/AwaitExpr/AwaitExpr_getExpr.expected @@ -1 +1 @@ -| gen_await_expr.rs:6:17:6:27 | AwaitExpr | gen_await_expr.rs:6:17:6:21 | CallExpr | +| gen_await_expr.rs:6:17:6:27 | await ... | gen_await_expr.rs:6:17:6:21 | foo(...) | diff --git a/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr.expected b/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr.expected index 75840ec81fed..ce3e6a096909 100644 --- a/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr.expected @@ -1 +1 @@ -| gen_become_expr.rs:8:10:8:36 | BecomeExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_become_expr.rs:8:10:8:36 | become ... | getNumberOfAttrs: | 0 | hasExpr: | yes | diff --git a/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr_getExpr.expected index 8992c4868ca2..d0cb86a0303c 100644 --- a/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BecomeExpr/BecomeExpr_getExpr.expected @@ -1 +1 @@ -| gen_become_expr.rs:8:10:8:36 | BecomeExpr | gen_become_expr.rs:8:17:8:36 | CallExpr | +| gen_become_expr.rs:8:10:8:36 | become ... | gen_become_expr.rs:8:17:8:36 | fact_a(...) | diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected index 39ec1d6a7e1a..b6be24d0bb73 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.expected @@ -1,3 +1,3 @@ -| gen_block_expr.rs:3:28:12:1 | BlockExpr | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasLabel: | no | hasStmtList: | yes | -| gen_block_expr.rs:5:5:7:5 | BlockExpr | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasLabel: | no | hasStmtList: | yes | -| gen_block_expr.rs:8:5:11:5 | BlockExpr | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasLabel: | yes | hasStmtList: | yes | +| gen_block_expr.rs:3:28:12:1 | { ... } | hasLabel: | no | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasStmtList: | yes | +| gen_block_expr.rs:5:5:7:5 | { ... } | hasLabel: | no | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasStmtList: | yes | +| gen_block_expr.rs:8:5:11:5 | 'label: { ... } | hasLabel: | yes | getNumberOfAttrs: | 0 | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isTry: | no | isUnsafe: | no | hasStmtList: | yes | diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql index 581070545155..992c06a605b6 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr.ql @@ -3,11 +3,12 @@ import codeql.rust.elements import TestUtils from - BlockExpr x, int getNumberOfAttrs, string isAsync, string isConst, string isGen, string isMove, - string isTry, string isUnsafe, string hasLabel, string hasStmtList + BlockExpr x, string hasLabel, int getNumberOfAttrs, string isAsync, string isConst, string isGen, + string isMove, string isTry, string isUnsafe, string hasStmtList where toBeTested(x) and not x.isUnknown() and + (if x.hasLabel() then hasLabel = "yes" else hasLabel = "no") and getNumberOfAttrs = x.getNumberOfAttrs() and (if x.isAsync() then isAsync = "yes" else isAsync = "no") and (if x.isConst() then isConst = "yes" else isConst = "no") and @@ -15,8 +16,7 @@ where (if x.isMove() then isMove = "yes" else isMove = "no") and (if x.isTry() then isTry = "yes" else isTry = "no") and (if x.isUnsafe() then isUnsafe = "yes" else isUnsafe = "no") and - (if x.hasLabel() then hasLabel = "yes" else hasLabel = "no") and if x.hasStmtList() then hasStmtList = "yes" else hasStmtList = "no" -select x, "getNumberOfAttrs:", getNumberOfAttrs, "isAsync:", isAsync, "isConst:", isConst, "isGen:", - isGen, "isMove:", isMove, "isTry:", isTry, "isUnsafe:", isUnsafe, "hasLabel:", hasLabel, +select x, "hasLabel:", hasLabel, "getNumberOfAttrs:", getNumberOfAttrs, "isAsync:", isAsync, + "isConst:", isConst, "isGen:", isGen, "isMove:", isMove, "isTry:", isTry, "isUnsafe:", isUnsafe, "hasStmtList:", hasStmtList diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getLabel.expected b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getLabel.expected index 3a935228e051..a6933d65b22b 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getLabel.expected +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getLabel.expected @@ -1 +1 @@ -| gen_block_expr.rs:8:5:11:5 | BlockExpr | gen_block_expr.rs:8:5:8:11 | Label | +| gen_block_expr.rs:8:5:11:5 | 'label: { ... } | gen_block_expr.rs:8:5:8:11 | 'label | diff --git a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getStmtList.expected b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getStmtList.expected index 21eb195289a2..4863264491b3 100644 --- a/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getStmtList.expected +++ b/rust/ql/test/extractor-tests/generated/BlockExpr/BlockExpr_getStmtList.expected @@ -1,3 +1,3 @@ -| gen_block_expr.rs:3:28:12:1 | BlockExpr | gen_block_expr.rs:3:28:12:1 | StmtList | -| gen_block_expr.rs:5:5:7:5 | BlockExpr | gen_block_expr.rs:5:5:7:5 | StmtList | -| gen_block_expr.rs:8:5:11:5 | BlockExpr | gen_block_expr.rs:8:13:11:5 | StmtList | +| gen_block_expr.rs:3:28:12:1 | { ... } | gen_block_expr.rs:3:28:12:1 | StmtList | +| gen_block_expr.rs:5:5:7:5 | { ... } | gen_block_expr.rs:5:5:7:5 | StmtList | +| gen_block_expr.rs:8:5:11:5 | 'label: { ... } | gen_block_expr.rs:8:13:11:5 | StmtList | diff --git a/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat.expected b/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat.expected index 95c8bdebd47a..8ca2412e8ff5 100644 --- a/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat.expected +++ b/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat.expected @@ -1,2 +1,2 @@ -| gen_box_pat.rs:6:9:6:27 | BoxPat | hasPat: | yes | -| gen_box_pat.rs:7:9:7:24 | BoxPat | hasPat: | yes | +| gen_box_pat.rs:6:9:6:27 | box ... | hasPat: | yes | +| gen_box_pat.rs:7:9:7:24 | box ...::None | hasPat: | yes | diff --git a/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat_getPat.expected b/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat_getPat.expected index cac8ee05d3c4..4e12432652dc 100644 --- a/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/BoxPat/BoxPat_getPat.expected @@ -1,2 +1,2 @@ -| gen_box_pat.rs:6:9:6:27 | BoxPat | gen_box_pat.rs:6:13:6:27 | TupleStructPat | -| gen_box_pat.rs:7:9:7:24 | BoxPat | gen_box_pat.rs:7:13:7:24 | PathPat | +| gen_box_pat.rs:6:9:6:27 | box ... | gen_box_pat.rs:6:13:6:27 | TupleStructPat | +| gen_box_pat.rs:7:9:7:24 | box ...::None | gen_box_pat.rs:7:13:7:24 | ...::None | diff --git a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr.expected b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr.expected index 763fae60866a..30c734fd682d 100644 --- a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr.expected @@ -1,3 +1,3 @@ -| gen_break_expr.rs:7:13:7:17 | BreakExpr | getNumberOfAttrs: | 0 | hasExpr: | no | hasLifetime: | no | -| gen_break_expr.rs:12:13:12:27 | BreakExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes | -| gen_break_expr.rs:17:13:17:27 | BreakExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes | +| gen_break_expr.rs:7:13:7:17 | break | getNumberOfAttrs: | 0 | hasExpr: | no | hasLifetime: | no | +| gen_break_expr.rs:12:13:12:27 | break ''label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes | +| gen_break_expr.rs:17:13:17:27 | break ''label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes | diff --git a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getExpr.expected index 0bd373a4bbc1..20c5295354af 100644 --- a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getExpr.expected @@ -1,2 +1,2 @@ -| gen_break_expr.rs:12:13:12:27 | BreakExpr | gen_break_expr.rs:12:26:12:27 | 42 | -| gen_break_expr.rs:17:13:17:27 | BreakExpr | gen_break_expr.rs:17:26:17:27 | 42 | +| gen_break_expr.rs:12:13:12:27 | break ''label 42 | gen_break_expr.rs:12:26:12:27 | 42 | +| gen_break_expr.rs:17:13:17:27 | break ''label 42 | gen_break_expr.rs:17:26:17:27 | 42 | diff --git a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getLifetime.expected b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getLifetime.expected index b993a2eebf5a..2e1a88017950 100644 --- a/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getLifetime.expected +++ b/rust/ql/test/extractor-tests/generated/BreakExpr/BreakExpr_getLifetime.expected @@ -1,2 +1,2 @@ -| gen_break_expr.rs:12:13:12:27 | BreakExpr | gen_break_expr.rs:12:19:12:24 | Lifetime | -| gen_break_expr.rs:17:13:17:27 | BreakExpr | gen_break_expr.rs:17:19:17:24 | Lifetime | +| gen_break_expr.rs:12:13:12:27 | break ''label 42 | gen_break_expr.rs:12:19:12:24 | ''label | +| gen_break_expr.rs:17:13:17:27 | break ''label 42 | gen_break_expr.rs:17:19:17:24 | ''label | diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected index 5414108064cd..a3f108b5584e 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected +++ b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr.expected @@ -1,4 +1,4 @@ -| gen_call_expr.rs:5:5:5:11 | CallExpr | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | -| gen_call_expr.rs:6:5:6:23 | CallExpr | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | -| gen_call_expr.rs:7:5:7:14 | CallExpr | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | -| gen_call_expr.rs:8:5:8:10 | CallExpr | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_call_expr.rs:5:5:5:11 | foo(...) | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_call_expr.rs:7:5:7:14 | ...(...) | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_call_expr.rs:8:5:8:10 | foo(...) | hasArgList: | yes | getNumberOfAttrs: | 0 | hasExpr: | yes | diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getArgList.expected b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getArgList.expected index a42cc13bf39c..13c426db99d1 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getArgList.expected +++ b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getArgList.expected @@ -1,4 +1,4 @@ -| gen_call_expr.rs:5:5:5:11 | CallExpr | gen_call_expr.rs:5:8:5:11 | ArgList | -| gen_call_expr.rs:6:5:6:23 | CallExpr | gen_call_expr.rs:6:20:6:23 | ArgList | -| gen_call_expr.rs:7:5:7:14 | CallExpr | gen_call_expr.rs:7:11:7:14 | ArgList | -| gen_call_expr.rs:8:5:8:10 | CallExpr | gen_call_expr.rs:8:8:8:10 | ArgList | +| gen_call_expr.rs:5:5:5:11 | foo(...) | gen_call_expr.rs:5:8:5:11 | ArgList | +| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | gen_call_expr.rs:6:20:6:23 | ArgList | +| gen_call_expr.rs:7:5:7:14 | ...(...) | gen_call_expr.rs:7:11:7:14 | ArgList | +| gen_call_expr.rs:8:5:8:10 | foo(...) | gen_call_expr.rs:8:8:8:10 | ArgList | diff --git a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getExpr.expected index 544937866b78..ecaaf15cebbc 100644 --- a/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/CallExpr/CallExpr_getExpr.expected @@ -1,4 +1,4 @@ -| gen_call_expr.rs:5:5:5:11 | CallExpr | gen_call_expr.rs:5:5:5:7 | foo | -| gen_call_expr.rs:6:5:6:23 | CallExpr | gen_call_expr.rs:6:5:6:19 | foo::<...> | -| gen_call_expr.rs:7:5:7:14 | CallExpr | gen_call_expr.rs:7:5:7:10 | IndexExpr | -| gen_call_expr.rs:8:5:8:10 | CallExpr | gen_call_expr.rs:8:5:8:7 | foo | +| gen_call_expr.rs:5:5:5:11 | foo(...) | gen_call_expr.rs:5:5:5:7 | foo | +| gen_call_expr.rs:6:5:6:23 | foo::<...>(...) | gen_call_expr.rs:6:5:6:19 | foo::<...> | +| gen_call_expr.rs:7:5:7:14 | ...(...) | gen_call_expr.rs:7:5:7:10 | foo[0] | +| gen_call_expr.rs:8:5:8:10 | foo(...) | gen_call_expr.rs:8:5:8:7 | foo | diff --git a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr.expected b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr.expected index 6050eb022593..c85e41866313 100644 --- a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr.expected +++ b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr.expected @@ -1 +1 @@ -| gen_cast_expr.rs:5:5:5:16 | CastExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasTy: | yes | +| gen_cast_expr.rs:5:5:5:16 | value as u64 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasTy: | yes | diff --git a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getExpr.expected index f3e1d4c7ec94..01a710bfb533 100644 --- a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getExpr.expected @@ -1 +1 @@ -| gen_cast_expr.rs:5:5:5:16 | CastExpr | gen_cast_expr.rs:5:5:5:9 | value | +| gen_cast_expr.rs:5:5:5:16 | value as u64 | gen_cast_expr.rs:5:5:5:9 | value | diff --git a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getTy.expected b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getTy.expected index 29cc49cc3b9f..87c07babb021 100644 --- a/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getTy.expected +++ b/rust/ql/test/extractor-tests/generated/CastExpr/CastExpr_getTy.expected @@ -1 +1 @@ -| gen_cast_expr.rs:5:5:5:16 | CastExpr | gen_cast_expr.rs:5:14:5:16 | PathType | +| gen_cast_expr.rs:5:5:5:16 | value as u64 | gen_cast_expr.rs:5:14:5:16 | u64 | diff --git a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr.expected b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr.expected index fb665ca8f605..3ea9f463a00d 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr.expected @@ -1,5 +1,5 @@ -| gen_closure_expr.rs:5:5:5:13 | ClosureExpr | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | -| gen_closure_expr.rs:6:5:6:34 | ClosureExpr | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | yes | isStatic: | no | hasRetType: | yes | -| gen_closure_expr.rs:7:5:7:27 | ClosureExpr | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | yes | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | -| gen_closure_expr.rs:8:6:9:15 | ClosureExpr | hasParamList: | yes | getNumberOfAttrs: | 1 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | -| gen_closure_expr.rs:10:6:11:23 | ClosureExpr | hasParamList: | yes | getNumberOfAttrs: | 1 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | yes | hasRetType: | no | +| gen_closure_expr.rs:5:5:5:13 | \|...\| ... | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | +| gen_closure_expr.rs:6:5:6:34 | \|...\| ... | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | yes | isStatic: | no | hasRetType: | yes | +| gen_closure_expr.rs:7:5:7:27 | \|...\| ... | hasParamList: | yes | getNumberOfAttrs: | 0 | hasBody: | yes | hasClosureBinder: | no | isAsync: | yes | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | +| gen_closure_expr.rs:8:6:9:15 | \|...\| ... | hasParamList: | yes | getNumberOfAttrs: | 1 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | no | hasRetType: | no | +| gen_closure_expr.rs:10:6:11:23 | \|...\| ... | hasParamList: | yes | getNumberOfAttrs: | 1 | hasBody: | yes | hasClosureBinder: | no | isAsync: | no | isConst: | no | isGen: | no | isMove: | no | isStatic: | yes | hasRetType: | no | diff --git a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getAttr.expected b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getAttr.expected index f1859d594d18..4de6e17d785a 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getAttr.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getAttr.expected @@ -1,2 +1,2 @@ -| gen_closure_expr.rs:8:6:9:15 | ClosureExpr | 0 | gen_closure_expr.rs:8:6:8:17 | Attr | -| gen_closure_expr.rs:10:6:11:23 | ClosureExpr | 0 | gen_closure_expr.rs:10:6:10:17 | Attr | +| gen_closure_expr.rs:8:6:9:15 | \|...\| ... | 0 | gen_closure_expr.rs:8:6:8:17 | Attr | +| gen_closure_expr.rs:10:6:11:23 | \|...\| ... | 0 | gen_closure_expr.rs:10:6:10:17 | Attr | diff --git a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getBody.expected b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getBody.expected index 71bc3cccda3c..d7b6180e63b2 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getBody.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getBody.expected @@ -1,5 +1,5 @@ -| gen_closure_expr.rs:5:5:5:13 | ClosureExpr | gen_closure_expr.rs:5:9:5:13 | ... + ... | -| gen_closure_expr.rs:6:5:6:34 | ClosureExpr | gen_closure_expr.rs:6:26:6:34 | BlockExpr | -| gen_closure_expr.rs:7:5:7:27 | ClosureExpr | gen_closure_expr.rs:7:23:7:27 | ... + ... | -| gen_closure_expr.rs:8:6:9:15 | ClosureExpr | gen_closure_expr.rs:9:9:9:15 | YieldExpr | -| gen_closure_expr.rs:10:6:11:23 | ClosureExpr | gen_closure_expr.rs:11:17:11:23 | YieldExpr | +| gen_closure_expr.rs:5:5:5:13 | \|...\| ... | gen_closure_expr.rs:5:9:5:13 | ... + ... | +| gen_closure_expr.rs:6:5:6:34 | \|...\| ... | gen_closure_expr.rs:6:26:6:34 | { ... } | +| gen_closure_expr.rs:7:5:7:27 | \|...\| ... | gen_closure_expr.rs:7:23:7:27 | ... + ... | +| gen_closure_expr.rs:8:6:9:15 | \|...\| ... | gen_closure_expr.rs:9:9:9:15 | YieldExpr | +| gen_closure_expr.rs:10:6:11:23 | \|...\| ... | gen_closure_expr.rs:11:17:11:23 | YieldExpr | diff --git a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParamList.expected b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParamList.expected index d0e6aaeac064..5945738433bd 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParamList.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParamList.expected @@ -1,5 +1,5 @@ -| gen_closure_expr.rs:5:5:5:13 | ClosureExpr | gen_closure_expr.rs:5:5:5:7 | ParamList | -| gen_closure_expr.rs:6:5:6:34 | ClosureExpr | gen_closure_expr.rs:6:10:6:17 | ParamList | -| gen_closure_expr.rs:7:5:7:27 | ClosureExpr | gen_closure_expr.rs:7:11:7:21 | ParamList | -| gen_closure_expr.rs:8:6:9:15 | ClosureExpr | gen_closure_expr.rs:9:5:9:7 | ParamList | -| gen_closure_expr.rs:10:6:11:23 | ClosureExpr | gen_closure_expr.rs:11:13:11:15 | ParamList | +| gen_closure_expr.rs:5:5:5:13 | \|...\| ... | gen_closure_expr.rs:5:5:5:7 | ParamList | +| gen_closure_expr.rs:6:5:6:34 | \|...\| ... | gen_closure_expr.rs:6:10:6:17 | ParamList | +| gen_closure_expr.rs:7:5:7:27 | \|...\| ... | gen_closure_expr.rs:7:11:7:21 | ParamList | +| gen_closure_expr.rs:8:6:9:15 | \|...\| ... | gen_closure_expr.rs:9:5:9:7 | ParamList | +| gen_closure_expr.rs:10:6:11:23 | \|...\| ... | gen_closure_expr.rs:11:13:11:15 | ParamList | diff --git a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getRetType.expected b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getRetType.expected index e018209cb53f..d7ec1024953c 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getRetType.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureExpr/ClosureExpr_getRetType.expected @@ -1 +1 @@ -| gen_closure_expr.rs:6:5:6:34 | ClosureExpr | gen_closure_expr.rs:6:19:6:24 | RetType | +| gen_closure_expr.rs:6:5:6:34 | \|...\| ... | gen_closure_expr.rs:6:19:6:24 | RetType | diff --git a/rust/ql/test/extractor-tests/generated/Comment/Comment.expected b/rust/ql/test/extractor-tests/generated/Comment/Comment.expected index 21861bb40bf9..24e95f123d8c 100644 --- a/rust/ql/test/extractor-tests/generated/Comment/Comment.expected +++ b/rust/ql/test/extractor-tests/generated/Comment/Comment.expected @@ -1,7 +1,7 @@ -| comments.rs:1:1:3:2 | Comment | getParent: | comments.rs:1:1:9:1 | foo | getText: | /** \n* A doc comment\n*/ | -| comments.rs:6:17:6:34 | Comment | getParent: | comments.rs:6:17:8:16 | nested | getText: | // print some text | -| comments.rs:7:3:7:31 | Comment | getParent: | comments.rs:6:17:8:16 | nested | getText: | /// This is a nested function | -| gen_comment.rs:1:1:1:36 | Comment | getParent: | gen_comment.rs:1:1:7:2 | SourceFile | getText: | // generated by codegen, do not edit | -| gen_comment.rs:4:5:4:30 | Comment | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | // A comment. For example: | -| gen_comment.rs:5:5:5:24 | Comment | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | // this is a comment | -| gen_comment.rs:6:5:6:29 | Comment | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | /// This is a doc comment | +| comments.rs:1:1:3:2 | /**...*/ | getParent: | comments.rs:1:1:9:1 | fn foo | getText: | /** \n* A doc comment\n*/ | +| comments.rs:6:17:6:34 | //... | getParent: | comments.rs:6:17:8:16 | fn nested | getText: | // print some text | +| comments.rs:7:3:7:31 | ///... | getParent: | comments.rs:6:17:8:16 | fn nested | getText: | /// This is a nested function | +| gen_comment.rs:1:1:1:36 | //... | getParent: | gen_comment.rs:1:1:7:2 | SourceFile | getText: | // generated by codegen, do not edit | +| gen_comment.rs:4:5:4:30 | //... | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | // A comment. For example: | +| gen_comment.rs:5:5:5:24 | //... | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | // this is a comment | +| gen_comment.rs:6:5:6:29 | ///... | getParent: | gen_comment.rs:3:25:7:1 | StmtList | getText: | /// This is a doc comment | diff --git a/rust/ql/test/extractor-tests/generated/ConstBlockPat/ConstBlockPat_getBlockExpr.expected b/rust/ql/test/extractor-tests/generated/ConstBlockPat/ConstBlockPat_getBlockExpr.expected index 58a885a48578..42cdb5ef4c30 100644 --- a/rust/ql/test/extractor-tests/generated/ConstBlockPat/ConstBlockPat_getBlockExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ConstBlockPat/ConstBlockPat_getBlockExpr.expected @@ -1 +1 @@ -| gen_const_block_pat.rs:6:9:6:27 | ConstBlockPat | gen_const_block_pat.rs:6:15:6:27 | BlockExpr | +| gen_const_block_pat.rs:6:9:6:27 | ConstBlockPat | gen_const_block_pat.rs:6:15:6:27 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr.expected b/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr.expected index ab921873d620..a09556b9a3ff 100644 --- a/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr.expected @@ -1,2 +1,2 @@ -| gen_continue_expr.rs:7:13:7:20 | ContinueExpr | getNumberOfAttrs: | 0 | hasLifetime: | no | -| gen_continue_expr.rs:12:13:12:27 | ContinueExpr | getNumberOfAttrs: | 0 | hasLifetime: | yes | +| gen_continue_expr.rs:7:13:7:20 | continue | getNumberOfAttrs: | 0 | hasLifetime: | no | +| gen_continue_expr.rs:12:13:12:27 | continue 'label | getNumberOfAttrs: | 0 | hasLifetime: | yes | diff --git a/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr_getLifetime.expected b/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr_getLifetime.expected index 525d2bb55a8e..d81d276ce0ae 100644 --- a/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr_getLifetime.expected +++ b/rust/ql/test/extractor-tests/generated/ContinueExpr/ContinueExpr_getLifetime.expected @@ -1 +1 @@ -| gen_continue_expr.rs:12:13:12:27 | ContinueExpr | gen_continue_expr.rs:12:22:12:27 | Lifetime | +| gen_continue_expr.rs:12:13:12:27 | continue 'label | gen_continue_expr.rs:12:22:12:27 | ''label | diff --git a/rust/ql/test/extractor-tests/generated/ExprStmt/ExprStmt_getExpr.expected b/rust/ql/test/extractor-tests/generated/ExprStmt/ExprStmt_getExpr.expected index f29a7f83d7d5..1cacf1e84241 100644 --- a/rust/ql/test/extractor-tests/generated/ExprStmt/ExprStmt_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ExprStmt/ExprStmt_getExpr.expected @@ -1,2 +1,2 @@ -| gen_expr_stmt.rs:5:5:5:12 | ExprStmt | gen_expr_stmt.rs:5:5:5:11 | CallExpr | -| gen_expr_stmt.rs:6:5:6:13 | ExprStmt | gen_expr_stmt.rs:6:5:6:12 | CallExpr | +| gen_expr_stmt.rs:5:5:5:12 | ExprStmt | gen_expr_stmt.rs:5:5:5:11 | start(...) | +| gen_expr_stmt.rs:6:5:6:13 | ExprStmt | gen_expr_stmt.rs:6:5:6:12 | finish(...) | diff --git a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr.expected b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr.expected index 22dcb3c92e11..c25a0633e402 100644 --- a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr.expected +++ b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr.expected @@ -1 +1 @@ -| gen_field_expr.rs:5:5:5:9 | FieldExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | +| gen_field_expr.rs:5:5:5:9 | x.foo | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | diff --git a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getExpr.expected index 32b13c1cb2b0..7d21f7f7af81 100644 --- a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getExpr.expected @@ -1 +1 @@ -| gen_field_expr.rs:5:5:5:9 | FieldExpr | gen_field_expr.rs:5:5:5:5 | x | +| gen_field_expr.rs:5:5:5:9 | x.foo | gen_field_expr.rs:5:5:5:5 | x | diff --git a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getNameRef.expected b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getNameRef.expected index 667f3130968c..0722ca1aaf28 100644 --- a/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getNameRef.expected +++ b/rust/ql/test/extractor-tests/generated/FieldExpr/FieldExpr_getNameRef.expected @@ -1 +1 @@ -| gen_field_expr.rs:5:5:5:9 | FieldExpr | gen_field_expr.rs:5:7:5:9 | foo | +| gen_field_expr.rs:5:5:5:9 | x.foo | gen_field_expr.rs:5:7:5:9 | foo | diff --git a/rust/ql/test/extractor-tests/generated/ForExpr/ForExpr.ql b/rust/ql/test/extractor-tests/generated/ForExpr/ForExpr.ql index ef1999ff4a9d..60f5ab1e0809 100644 --- a/rust/ql/test/extractor-tests/generated/ForExpr/ForExpr.ql +++ b/rust/ql/test/extractor-tests/generated/ForExpr/ForExpr.ql @@ -3,15 +3,15 @@ import codeql.rust.elements import TestUtils from - ForExpr x, int getNumberOfAttrs, string hasIterable, string hasLabel, string hasLoopBody, + ForExpr x, string hasLabel, string hasLoopBody, int getNumberOfAttrs, string hasIterable, string hasPat where toBeTested(x) and not x.isUnknown() and - getNumberOfAttrs = x.getNumberOfAttrs() and - (if x.hasIterable() then hasIterable = "yes" else hasIterable = "no") and (if x.hasLabel() then hasLabel = "yes" else hasLabel = "no") and (if x.hasLoopBody() then hasLoopBody = "yes" else hasLoopBody = "no") and + getNumberOfAttrs = x.getNumberOfAttrs() and + (if x.hasIterable() then hasIterable = "yes" else hasIterable = "no") and if x.hasPat() then hasPat = "yes" else hasPat = "no" -select x, "getNumberOfAttrs:", getNumberOfAttrs, "hasIterable:", hasIterable, "hasLabel:", hasLabel, - "hasLoopBody:", hasLoopBody, "hasPat:", hasPat +select x, "hasLabel:", hasLabel, "hasLoopBody:", hasLoopBody, "getNumberOfAttrs:", getNumberOfAttrs, + "hasIterable:", hasIterable, "hasPat:", hasPat diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.expected b/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.expected b/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.expected b/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.expected new file mode 100644 index 000000000000..312f5a3b0712 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.expected @@ -0,0 +1,9 @@ +| gen_format.rs:5:21:5:22 | {} | getParent: | gen_format.rs:5:14:5:32 | FormatArgsExpr | getIndex: | 1 | hasArgument: | no | +| gen_format_args_expr.rs:6:19:6:20 | {} | getParent: | gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | getIndex: | 1 | hasArgument: | no | +| gen_format_args_expr.rs:6:26:6:29 | {:?} | getParent: | gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | getIndex: | 3 | hasArgument: | no | +| gen_format_args_expr.rs:7:19:7:21 | {b} | getParent: | gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | getIndex: | 1 | hasArgument: | yes | +| gen_format_args_expr.rs:7:27:7:31 | {a:?} | getParent: | gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | getIndex: | 3 | hasArgument: | yes | +| gen_format_args_expr.rs:9:19:9:21 | {x} | getParent: | gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | getIndex: | 1 | hasArgument: | yes | +| gen_format_args_expr.rs:9:24:9:26 | {y} | getParent: | gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | getIndex: | 3 | hasArgument: | yes | +| gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | getParent: | gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | getIndex: | 1 | hasArgument: | yes | +| gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | getParent: | gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | getIndex: | 1 | hasArgument: | yes | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.ql new file mode 100644 index 000000000000..fa17b4294f7e --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format.ql @@ -0,0 +1,12 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from Format x, FormatArgsExpr getParent, int getIndex, string hasArgument +where + toBeTested(x) and + not x.isUnknown() and + getParent = x.getParent() and + getIndex = x.getIndex() and + if x.hasArgument() then hasArgument = "yes" else hasArgument = "no" +select x, "getParent:", getParent, "getIndex:", getIndex, "hasArgument:", hasArgument diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected new file mode 100644 index 000000000000..8e704471e02c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.expected @@ -0,0 +1,8 @@ +| gen_format.rs:5:26:5:32 | FormatArgsArg | hasExpr: | yes | hasName: | no | +| gen_format_args_expr.rs:6:33:6:33 | FormatArgsArg | hasExpr: | yes | hasName: | no | +| gen_format_args_expr.rs:6:36:6:36 | FormatArgsArg | hasExpr: | yes | hasName: | no | +| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | hasExpr: | yes | hasName: | yes | +| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | hasExpr: | yes | hasName: | yes | +| gen_format_argument.rs:7:34:7:38 | FormatArgsArg | hasExpr: | yes | hasName: | no | +| gen_format_argument.rs:7:41:7:45 | FormatArgsArg | hasExpr: | yes | hasName: | no | +| gen_format_argument.rs:7:48:7:56 | FormatArgsArg | hasExpr: | yes | hasName: | no | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg.ql rename to rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg.ql diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.expected new file mode 100644 index 000000000000..90cf2cae221f --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.expected @@ -0,0 +1,8 @@ +| gen_format.rs:5:26:5:32 | FormatArgsArg | gen_format.rs:5:26:5:32 | "world" | +| gen_format_args_expr.rs:6:33:6:33 | FormatArgsArg | gen_format_args_expr.rs:6:33:6:33 | 1 | +| gen_format_args_expr.rs:6:36:6:36 | FormatArgsArg | gen_format_args_expr.rs:6:36:6:36 | 2 | +| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:37:7:37 | 1 | +| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:42:7:42 | 2 | +| gen_format_argument.rs:7:34:7:38 | FormatArgsArg | gen_format_argument.rs:7:34:7:38 | value | +| gen_format_argument.rs:7:41:7:45 | FormatArgsArg | gen_format_argument.rs:7:41:7:45 | width | +| gen_format_argument.rs:7:48:7:56 | FormatArgsArg | gen_format_argument.rs:7:48:7:56 | precision | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getExpr.ql rename to rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getExpr.ql diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.expected new file mode 100644 index 000000000000..ad5d7ab4ab22 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.expected @@ -0,0 +1,2 @@ +| gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | gen_format_args_expr.rs:7:35:7:35 | a | +| gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | gen_format_args_expr.rs:7:40:7:40 | b | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/FormatArgsArg/FormatArgsArg_getName.ql rename to rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsArg_getName.ql diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.expected index e69de29bb2d1..bed19ed26d47 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.expected +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.expected @@ -0,0 +1,7 @@ +| gen_format.rs:5:14:5:32 | FormatArgsExpr | getNumberOfArgs: | 1 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 1 | +| gen_format_args_expr.rs:5:17:5:27 | FormatArgsExpr | getNumberOfArgs: | 0 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 0 | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | getNumberOfArgs: | 2 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 2 | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | getNumberOfArgs: | 2 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 2 | +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | getNumberOfArgs: | 0 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 2 | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | getNumberOfArgs: | 0 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 1 | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | getNumberOfArgs: | 3 | getNumberOfAttrs: | 0 | hasTemplate: | yes | getNumberOfFormats: | 1 | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql index 4d5bcf051735..6a43bc1ea0a3 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr.ql @@ -2,12 +2,15 @@ import codeql.rust.elements import TestUtils -from FormatArgsExpr x, int getNumberOfArgs, int getNumberOfAttrs, string hasTemplate +from + FormatArgsExpr x, int getNumberOfArgs, int getNumberOfAttrs, string hasTemplate, + int getNumberOfFormats where toBeTested(x) and not x.isUnknown() and getNumberOfArgs = x.getNumberOfArgs() and getNumberOfAttrs = x.getNumberOfAttrs() and - if x.hasTemplate() then hasTemplate = "yes" else hasTemplate = "no" + (if x.hasTemplate() then hasTemplate = "yes" else hasTemplate = "no") and + getNumberOfFormats = x.getNumberOfFormats() select x, "getNumberOfArgs:", getNumberOfArgs, "getNumberOfAttrs:", getNumberOfAttrs, - "hasTemplate:", hasTemplate + "hasTemplate:", hasTemplate, "getNumberOfFormats:", getNumberOfFormats diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.expected index e69de29bb2d1..89fce13908fd 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.expected +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getArg.expected @@ -0,0 +1,8 @@ +| gen_format.rs:5:14:5:32 | FormatArgsExpr | 0 | gen_format.rs:5:26:5:32 | FormatArgsArg | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | 0 | gen_format_args_expr.rs:6:33:6:33 | FormatArgsArg | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | 1 | gen_format_args_expr.rs:6:36:6:36 | FormatArgsArg | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | 0 | gen_format_args_expr.rs:7:35:7:37 | FormatArgsArg | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | 1 | gen_format_args_expr.rs:7:40:7:42 | FormatArgsArg | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | 0 | gen_format_argument.rs:7:34:7:38 | FormatArgsArg | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | 1 | gen_format_argument.rs:7:41:7:45 | FormatArgsArg | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | 2 | gen_format_argument.rs:7:48:7:56 | FormatArgsArg | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.expected new file mode 100644 index 000000000000..f0061b8dba46 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.expected @@ -0,0 +1,9 @@ +| gen_format.rs:5:14:5:32 | FormatArgsExpr | 0 | gen_format.rs:5:21:5:22 | {} | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | 0 | gen_format_args_expr.rs:6:19:6:20 | {} | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | 1 | gen_format_args_expr.rs:6:26:6:29 | {:?} | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | 0 | gen_format_args_expr.rs:7:19:7:21 | {b} | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | 1 | gen_format_args_expr.rs:7:27:7:31 | {a:?} | +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | 0 | gen_format_args_expr.rs:9:19:9:21 | {x} | +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | 1 | gen_format_args_expr.rs:9:24:9:26 | {y} | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | 0 | gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | 0 | gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.ql new file mode 100644 index 000000000000..ca61ca2bebd9 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getFormat.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from FormatArgsExpr x, int index +where toBeTested(x) and not x.isUnknown() +select x, index, x.getFormat(index) diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.expected index e69de29bb2d1..1b201bbf36f2 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.expected +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getTemplate.expected @@ -0,0 +1,7 @@ +| gen_format.rs:5:14:5:32 | FormatArgsExpr | gen_format.rs:5:14:5:23 | "Hello {}\\n" | +| gen_format_args_expr.rs:5:17:5:27 | FormatArgsExpr | gen_format_args_expr.rs:5:18:5:26 | "no args" | +| gen_format_args_expr.rs:6:17:6:37 | FormatArgsExpr | gen_format_args_expr.rs:6:18:6:30 | "{} foo {:?}" | +| gen_format_args_expr.rs:7:17:7:43 | FormatArgsExpr | gen_format_args_expr.rs:7:18:7:32 | "{b} foo {a:?}" | +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | gen_format_args_expr.rs:9:18:9:27 | "{x}, {y}" | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | gen_format_argument.rs:5:14:5:47 | "Value {value:#width$.precisio... | +| gen_format_argument.rs:7:14:7:56 | FormatArgsExpr | gen_format_argument.rs:7:14:7:31 | "Value {0:#1$.2$}\\n" | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getVariable.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getVariable.expected new file mode 100644 index 000000000000..dca240710f7d --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgsExpr_getVariable.expected @@ -0,0 +1,5 @@ +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | 1 | gen_format_args_expr.rs:9:20:9:20 | x | +| gen_format_args_expr.rs:9:17:9:28 | FormatArgsExpr | 3 | gen_format_args_expr.rs:9:25:9:25 | y | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | 1 | gen_format_argument.rs:5:22:5:26 | value | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | 1 | gen_format_argument.rs:5:29:5:33 | width | +| gen_format_argument.rs:5:14:5:47 | FormatArgsExpr | 1 | gen_format_argument.rs:5:36:5:44 | precision | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.expected new file mode 100644 index 000000000000..e63b4b6558fc --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.expected @@ -0,0 +1,10 @@ +| gen_format_args_expr.rs:7:20:7:20 | b | getParent: | gen_format_args_expr.rs:7:19:7:21 | {b} | hasVariable: | no | +| gen_format_args_expr.rs:7:28:7:28 | a | getParent: | gen_format_args_expr.rs:7:27:7:31 | {a:?} | hasVariable: | no | +| gen_format_args_expr.rs:9:20:9:20 | x | getParent: | gen_format_args_expr.rs:9:19:9:21 | {x} | hasVariable: | yes | +| gen_format_args_expr.rs:9:25:9:25 | y | getParent: | gen_format_args_expr.rs:9:24:9:26 | {y} | hasVariable: | yes | +| gen_format_argument.rs:5:22:5:26 | value | getParent: | gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | hasVariable: | yes | +| gen_format_argument.rs:5:29:5:33 | width | getParent: | gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | hasVariable: | yes | +| gen_format_argument.rs:5:36:5:44 | precision | getParent: | gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | hasVariable: | yes | +| gen_format_argument.rs:7:22:7:22 | 0 | getParent: | gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | hasVariable: | no | +| gen_format_argument.rs:7:25:7:25 | 1 | getParent: | gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | hasVariable: | no | +| gen_format_argument.rs:7:28:7:28 | 2 | getParent: | gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | hasVariable: | no | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql new file mode 100644 index 000000000000..ed57154f7e82 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument.ql @@ -0,0 +1,11 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from FormatArgument x, Format getParent, string hasVariable +where + toBeTested(x) and + not x.isUnknown() and + getParent = x.getParent() and + if x.hasVariable() then hasVariable = "yes" else hasVariable = "no" +select x, "getParent:", getParent, "hasVariable:", hasVariable diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.expected new file mode 100644 index 000000000000..11db93ec06dd --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.expected @@ -0,0 +1,5 @@ +| gen_format_args_expr.rs:9:20:9:20 | x | gen_format_args_expr.rs:9:20:9:20 | x | +| gen_format_args_expr.rs:9:25:9:25 | y | gen_format_args_expr.rs:9:25:9:25 | y | +| gen_format_argument.rs:5:22:5:26 | value | gen_format_argument.rs:5:22:5:26 | value | +| gen_format_argument.rs:5:29:5:33 | width | gen_format_argument.rs:5:29:5:33 | width | +| gen_format_argument.rs:5:36:5:44 | precision | gen_format_argument.rs:5:36:5:44 | precision | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.ql new file mode 100644 index 000000000000..5d303bc4b6c6 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatArgument_getVariable.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from FormatArgument x +where toBeTested(x) and not x.isUnknown() +select x, x.getVariable() diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.expected new file mode 100644 index 000000000000..df4fdad5c911 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.expected @@ -0,0 +1,5 @@ +| gen_format_args_expr.rs:9:20:9:20 | x | +| gen_format_args_expr.rs:9:25:9:25 | y | +| gen_format_argument.rs:5:22:5:26 | value | +| gen_format_argument.rs:5:29:5:33 | width | +| gen_format_argument.rs:5:36:5:44 | precision | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql new file mode 100644 index 000000000000..4f43ca11870a --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/FormatTemplateVariableAccess.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from FormatTemplateVariableAccess x +where toBeTested(x) and not x.isUnknown() +select x diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.expected b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.expected new file mode 100644 index 000000000000..af9dd77578ce --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.expected @@ -0,0 +1,10 @@ +| gen_format_args_expr.rs:7:19:7:21 | {b} | gen_format_args_expr.rs:7:20:7:20 | b | +| gen_format_args_expr.rs:7:27:7:31 | {a:?} | gen_format_args_expr.rs:7:28:7:28 | a | +| gen_format_args_expr.rs:9:19:9:21 | {x} | gen_format_args_expr.rs:9:20:9:20 | x | +| gen_format_args_expr.rs:9:24:9:26 | {y} | gen_format_args_expr.rs:9:25:9:25 | y | +| gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | gen_format_argument.rs:5:22:5:26 | value | +| gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | gen_format_argument.rs:5:29:5:33 | width | +| gen_format_argument.rs:5:21:5:46 | {value:#width$.precision$} | gen_format_argument.rs:5:36:5:44 | precision | +| gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | gen_format_argument.rs:7:22:7:22 | 0 | +| gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | gen_format_argument.rs:7:25:7:25 | 1 | +| gen_format_argument.rs:7:21:7:30 | {0:#1$.2$} | gen_format_argument.rs:7:28:7:28 | 2 | diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.ql b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.ql new file mode 100644 index 000000000000..e131365770b6 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/Format_getArgument.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from Format x +where toBeTested(x) and not x.isUnknown() +select x, x.getArgument() diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs new file mode 100644 index 000000000000..86b78256d403 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format.rs @@ -0,0 +1,6 @@ +// generated by codegen, do not edit + +fn test_format() -> () { + // A format element in a formatting template. For example the `{}` in: + println!("Hello {}", "world"); +} diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsArg/gen_format_args_arg.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs similarity index 100% rename from rust/ql/test/extractor-tests/generated/FormatArgsArg/gen_format_args_arg.rs rename to rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_arg.rs diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_expr.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_expr.rs index 7345a633ba5d..3c2acb387fc7 100644 --- a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_expr.rs +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_args_expr.rs @@ -2,5 +2,9 @@ fn test_format_args_expr() -> () { // A FormatArgsExpr. For example: - todo!() + format_args!("no args"); + format_args!("{} foo {:?}", 1, 2); + format_args!("{b} foo {a:?}", a=1, b=2); + let (x, y) = (1, 42); + format_args!("{x}, {y}"); } diff --git a/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_argument.rs b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_argument.rs new file mode 100644 index 000000000000..32cb123f51d0 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/FormatArgsExpr/gen_format_argument.rs @@ -0,0 +1,8 @@ +// generated by codegen, do not edit + +fn test_format_argument() -> () { + // An argument in a format element in a formatting template. For example the `width`, `precision`, and `value` in: + println!("Value {value:#width$.precision$}"); + // or the `0`, `1` and `2` in: + println!("Value {0:#1$.2$}", value, width, precision); +} diff --git a/rust/ql/test/extractor-tests/generated/Function/Function.expected b/rust/ql/test/extractor-tests/generated/Function/Function.expected index f93eb58b2ae4..b96996beef94 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function.expected @@ -1,2 +1,2 @@ -| gen_function.rs:3:1:4:38 | foo | hasParamList: | yes | getNumberOfAttrs: | 0 | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAbi: | no | hasBody: | yes | hasGenericParamList: | no | isAsync: | no | isConst: | no | isDefault: | no | isGen: | no | isUnsafe: | no | hasName: | yes | hasRetType: | yes | hasVisibility: | no | hasWhereClause: | no | -| gen_function.rs:7:5:7:13 | bar | hasParamList: | yes | getNumberOfAttrs: | 0 | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAbi: | no | hasBody: | no | hasGenericParamList: | no | isAsync: | no | isConst: | no | isDefault: | no | isGen: | no | isUnsafe: | no | hasName: | yes | hasRetType: | no | hasVisibility: | no | hasWhereClause: | no | +| gen_function.rs:3:1:4:38 | fn foo | hasParamList: | yes | getNumberOfAttrs: | 0 | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAbi: | no | hasBody: | yes | hasGenericParamList: | no | isAsync: | no | isConst: | no | isDefault: | no | isGen: | no | isUnsafe: | no | hasName: | yes | hasRetType: | yes | hasVisibility: | no | hasWhereClause: | no | +| gen_function.rs:7:5:7:13 | fn bar | hasParamList: | yes | getNumberOfAttrs: | 0 | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAbi: | no | hasBody: | no | hasGenericParamList: | no | isAsync: | no | isConst: | no | isDefault: | no | isGen: | no | isUnsafe: | no | hasName: | yes | hasRetType: | no | hasVisibility: | no | hasWhereClause: | no | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getBody.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getBody.expected index 996e8c1a27c3..894900b3eaa8 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getBody.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getBody.expected @@ -1 +1 @@ -| gen_function.rs:3:1:4:38 | foo | gen_function.rs:4:23:4:38 | BlockExpr | +| gen_function.rs:3:1:4:38 | fn foo | gen_function.rs:4:23:4:38 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getCrateOrigin.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getCrateOrigin.expected index 7c376ffaf1e6..eabc941bd5be 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getCrateOrigin.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getCrateOrigin.expected @@ -1,2 +1,2 @@ -| gen_function.rs:3:1:4:38 | foo | repo::test | -| gen_function.rs:7:5:7:13 | bar | repo::test | +| gen_function.rs:3:1:4:38 | fn foo | repo::test | +| gen_function.rs:7:5:7:13 | fn bar | repo::test | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getExtendedCanonicalPath.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getExtendedCanonicalPath.expected index d9b6255918f8..2c0059ebc2a5 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getExtendedCanonicalPath.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getExtendedCanonicalPath.expected @@ -1,2 +1,2 @@ -| gen_function.rs:3:1:4:38 | foo | crate::gen_function::foo | -| gen_function.rs:7:5:7:13 | bar | crate::gen_function::Trait::bar | +| gen_function.rs:3:1:4:38 | fn foo | crate::gen_function::foo | +| gen_function.rs:7:5:7:13 | fn bar | crate::gen_function::Trait::bar | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getName.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getName.expected index 62676019818d..7e889e82d284 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getName.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getName.expected @@ -1,2 +1,2 @@ -| gen_function.rs:3:1:4:38 | foo | gen_function.rs:4:4:4:6 | foo | -| gen_function.rs:7:5:7:13 | bar | gen_function.rs:7:8:7:10 | bar | +| gen_function.rs:3:1:4:38 | fn foo | gen_function.rs:4:4:4:6 | foo | +| gen_function.rs:7:5:7:13 | fn bar | gen_function.rs:7:8:7:10 | bar | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getParamList.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getParamList.expected index baa2734e86ac..df5810619191 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getParamList.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getParamList.expected @@ -1,2 +1,2 @@ -| gen_function.rs:3:1:4:38 | foo | gen_function.rs:4:7:4:14 | ParamList | -| gen_function.rs:7:5:7:13 | bar | gen_function.rs:7:11:7:12 | ParamList | +| gen_function.rs:3:1:4:38 | fn foo | gen_function.rs:4:7:4:14 | ParamList | +| gen_function.rs:7:5:7:13 | fn bar | gen_function.rs:7:11:7:12 | ParamList | diff --git a/rust/ql/test/extractor-tests/generated/Function/Function_getRetType.expected b/rust/ql/test/extractor-tests/generated/Function/Function_getRetType.expected index 7a5338705600..bd225b268e84 100644 --- a/rust/ql/test/extractor-tests/generated/Function/Function_getRetType.expected +++ b/rust/ql/test/extractor-tests/generated/Function/Function_getRetType.expected @@ -1 +1 @@ -| gen_function.rs:3:1:4:38 | foo | gen_function.rs:4:16:4:21 | RetType | +| gen_function.rs:3:1:4:38 | fn foo | gen_function.rs:4:16:4:21 | RetType | diff --git a/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList.expected b/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList.expected index 370ee8ce4d66..d2a5b7bcd8f0 100644 --- a/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList.expected +++ b/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList.expected @@ -1 +1 @@ -| gen_generic_arg_list.rs:5:10:5:21 | GenericArgList | getNumberOfGenericArgs: | 2 | +| gen_generic_arg_list.rs:5:10:5:21 | <...> | getNumberOfGenericArgs: | 2 | diff --git a/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList_getGenericArg.expected b/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList_getGenericArg.expected index b72d3035ed14..69e416a57ad7 100644 --- a/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList_getGenericArg.expected +++ b/rust/ql/test/extractor-tests/generated/GenericArgList/GenericArgList_getGenericArg.expected @@ -1,2 +1,2 @@ -| gen_generic_arg_list.rs:5:10:5:21 | GenericArgList | 0 | gen_generic_arg_list.rs:5:13:5:15 | TypeArg | -| gen_generic_arg_list.rs:5:10:5:21 | GenericArgList | 1 | gen_generic_arg_list.rs:5:18:5:20 | TypeArg | +| gen_generic_arg_list.rs:5:10:5:21 | <...> | 0 | gen_generic_arg_list.rs:5:13:5:15 | TypeArg | +| gen_generic_arg_list.rs:5:10:5:21 | <...> | 1 | gen_generic_arg_list.rs:5:18:5:20 | TypeArg | diff --git a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr.expected b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr.expected index a0e0ea15594f..d9a33ad74f79 100644 --- a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr.expected +++ b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr.expected @@ -1,2 +1,2 @@ -| gen_if_expr.rs:5:5:7:5 | IfExpr | getNumberOfAttrs: | 0 | hasCondition: | yes | hasElse: | no | hasThen: | yes | -| gen_if_expr.rs:8:13:12:5 | IfExpr | getNumberOfAttrs: | 0 | hasCondition: | yes | hasElse: | yes | hasThen: | yes | +| gen_if_expr.rs:5:5:7:5 | if ... {...} | getNumberOfAttrs: | 0 | hasCondition: | yes | hasElse: | no | hasThen: | yes | +| gen_if_expr.rs:8:13:12:5 | if ... {...} else {...} | getNumberOfAttrs: | 0 | hasCondition: | yes | hasElse: | yes | hasThen: | yes | diff --git a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getCondition.expected b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getCondition.expected index 7bdb262dd324..4990a47bc96e 100644 --- a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getCondition.expected +++ b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getCondition.expected @@ -1,2 +1,2 @@ -| gen_if_expr.rs:5:5:7:5 | IfExpr | gen_if_expr.rs:5:8:5:14 | ... == ... | -| gen_if_expr.rs:8:13:12:5 | IfExpr | gen_if_expr.rs:8:16:8:20 | ... > ... | +| gen_if_expr.rs:5:5:7:5 | if ... {...} | gen_if_expr.rs:5:8:5:14 | ... == ... | +| gen_if_expr.rs:8:13:12:5 | if ... {...} else {...} | gen_if_expr.rs:8:16:8:20 | ... > ... | diff --git a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getElse.expected b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getElse.expected index a857dbe2099a..a03626f5e5dd 100644 --- a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getElse.expected +++ b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getElse.expected @@ -1 +1 @@ -| gen_if_expr.rs:8:13:12:5 | IfExpr | gen_if_expr.rs:10:12:12:5 | BlockExpr | +| gen_if_expr.rs:8:13:12:5 | if ... {...} else {...} | gen_if_expr.rs:10:12:12:5 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getThen.expected b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getThen.expected index 0916c3f33916..6080b004f38f 100644 --- a/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getThen.expected +++ b/rust/ql/test/extractor-tests/generated/IfExpr/IfExpr_getThen.expected @@ -1,2 +1,2 @@ -| gen_if_expr.rs:5:5:7:5 | IfExpr | gen_if_expr.rs:5:16:7:5 | BlockExpr | -| gen_if_expr.rs:8:13:12:5 | IfExpr | gen_if_expr.rs:8:22:10:5 | BlockExpr | +| gen_if_expr.rs:5:5:7:5 | if ... {...} | gen_if_expr.rs:5:16:7:5 | { ... } | +| gen_if_expr.rs:8:13:12:5 | if ... {...} else {...} | gen_if_expr.rs:8:22:10:5 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr.expected b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr.expected index c113934115d2..614afc3040f4 100644 --- a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr.expected +++ b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr.expected @@ -1,2 +1,2 @@ -| gen_index_expr.rs:5:5:5:12 | IndexExpr | getNumberOfAttrs: | 0 | hasBase: | yes | hasIndex: | yes | -| gen_index_expr.rs:6:5:6:12 | IndexExpr | getNumberOfAttrs: | 0 | hasBase: | yes | hasIndex: | yes | +| gen_index_expr.rs:5:5:5:12 | list[42] | getNumberOfAttrs: | 0 | hasBase: | yes | hasIndex: | yes | +| gen_index_expr.rs:6:5:6:12 | list[42] | getNumberOfAttrs: | 0 | hasBase: | yes | hasIndex: | yes | diff --git a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getBase.expected b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getBase.expected index c149597172b8..13fb9a2c6a6d 100644 --- a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getBase.expected +++ b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getBase.expected @@ -1,2 +1,2 @@ -| gen_index_expr.rs:5:5:5:12 | IndexExpr | gen_index_expr.rs:5:5:5:8 | list | -| gen_index_expr.rs:6:5:6:12 | IndexExpr | gen_index_expr.rs:6:5:6:8 | list | +| gen_index_expr.rs:5:5:5:12 | list[42] | gen_index_expr.rs:5:5:5:8 | list | +| gen_index_expr.rs:6:5:6:12 | list[42] | gen_index_expr.rs:6:5:6:8 | list | diff --git a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getIndex.expected b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getIndex.expected index 433afd85eb99..dfca82040881 100644 --- a/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getIndex.expected +++ b/rust/ql/test/extractor-tests/generated/IndexExpr/IndexExpr_getIndex.expected @@ -1,2 +1,2 @@ -| gen_index_expr.rs:5:5:5:12 | IndexExpr | gen_index_expr.rs:5:10:5:11 | 42 | -| gen_index_expr.rs:6:5:6:12 | IndexExpr | gen_index_expr.rs:6:10:6:11 | 42 | +| gen_index_expr.rs:5:5:5:12 | list[42] | gen_index_expr.rs:5:10:5:11 | 42 | +| gen_index_expr.rs:6:5:6:12 | list[42] | gen_index_expr.rs:6:10:6:11 | 42 | diff --git a/rust/ql/test/extractor-tests/generated/Label/Label.expected b/rust/ql/test/extractor-tests/generated/Label/Label.expected index 5cea4ef72221..7525044aaa25 100644 --- a/rust/ql/test/extractor-tests/generated/Label/Label.expected +++ b/rust/ql/test/extractor-tests/generated/Label/Label.expected @@ -1 +1 @@ -| gen_label.rs:5:5:5:11 | Label | hasLifetime: | yes | +| gen_label.rs:5:5:5:11 | 'label | hasLifetime: | yes | diff --git a/rust/ql/test/extractor-tests/generated/Label/Label_getLifetime.expected b/rust/ql/test/extractor-tests/generated/Label/Label_getLifetime.expected index 9c78f23307d2..73ebbe963e85 100644 --- a/rust/ql/test/extractor-tests/generated/Label/Label_getLifetime.expected +++ b/rust/ql/test/extractor-tests/generated/Label/Label_getLifetime.expected @@ -1 +1 @@ -| gen_label.rs:5:5:5:11 | Label | gen_label.rs:5:5:5:10 | Lifetime | +| gen_label.rs:5:5:5:11 | 'label | gen_label.rs:5:5:5:10 | ''label | diff --git a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr.expected b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr.expected index 26a968ef35b3..7ff5ad393e19 100644 --- a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr.expected +++ b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr.expected @@ -1 +1 @@ -| gen_let_expr.rs:5:8:5:31 | LetExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasPat: | yes | +| gen_let_expr.rs:5:8:5:31 | let ... = maybe_some | getNumberOfAttrs: | 0 | hasExpr: | yes | hasPat: | yes | diff --git a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getExpr.expected index f90fa5862299..0080ab4ee6e5 100644 --- a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getExpr.expected @@ -1 +1 @@ -| gen_let_expr.rs:5:8:5:31 | LetExpr | gen_let_expr.rs:5:22:5:31 | maybe_some | +| gen_let_expr.rs:5:8:5:31 | let ... = maybe_some | gen_let_expr.rs:5:22:5:31 | maybe_some | diff --git a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getPat.expected b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getPat.expected index 287200e610ff..7c31e314128d 100644 --- a/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/LetExpr/LetExpr_getPat.expected @@ -1 +1 @@ -| gen_let_expr.rs:5:8:5:31 | LetExpr | gen_let_expr.rs:5:12:5:18 | TupleStructPat | +| gen_let_expr.rs:5:8:5:31 | let ... = maybe_some | gen_let_expr.rs:5:12:5:18 | TupleStructPat | diff --git a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt.expected b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt.expected index 7c05e07e2f3e..847ff988ff0d 100644 --- a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt.expected +++ b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt.expected @@ -1,6 +1,6 @@ -| gen_let_stmt.rs:5:5:5:15 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | no | -| gen_let_stmt.rs:6:5:6:20 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | yes | -| gen_let_stmt.rs:7:5:7:15 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | no | hasLetElse: | no | hasPat: | yes | hasTy: | yes | -| gen_let_stmt.rs:8:5:8:10 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | no | hasLetElse: | no | hasPat: | yes | hasTy: | no | -| gen_let_stmt.rs:9:5:9:24 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | no | -| gen_let_stmt.rs:10:5:12:6 | LetStmt | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | yes | hasPat: | yes | hasTy: | no | +| gen_let_stmt.rs:5:5:5:15 | let ... = 42 | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | no | +| gen_let_stmt.rs:6:5:6:20 | let ... = 42 | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | yes | +| gen_let_stmt.rs:7:5:7:15 | let ... | getNumberOfAttrs: | 0 | hasInitializer: | no | hasLetElse: | no | hasPat: | yes | hasTy: | yes | +| gen_let_stmt.rs:8:5:8:10 | let ... | getNumberOfAttrs: | 0 | hasInitializer: | no | hasLetElse: | no | hasPat: | yes | hasTy: | no | +| gen_let_stmt.rs:9:5:9:24 | let ... = ... | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | no | hasPat: | yes | hasTy: | no | +| gen_let_stmt.rs:10:5:12:6 | let ... = ... else {...} | getNumberOfAttrs: | 0 | hasInitializer: | yes | hasLetElse: | yes | hasPat: | yes | hasTy: | no | diff --git a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getInitializer.expected b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getInitializer.expected index 5e79b98f8278..bd8368e351fb 100644 --- a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getInitializer.expected +++ b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getInitializer.expected @@ -1,4 +1,4 @@ -| gen_let_stmt.rs:5:5:5:15 | LetStmt | gen_let_stmt.rs:5:13:5:14 | 42 | -| gen_let_stmt.rs:6:5:6:20 | LetStmt | gen_let_stmt.rs:6:18:6:19 | 42 | -| gen_let_stmt.rs:9:5:9:24 | LetStmt | gen_let_stmt.rs:9:18:9:23 | TupleExpr | -| gen_let_stmt.rs:10:5:12:6 | LetStmt | gen_let_stmt.rs:10:19:10:38 | CallExpr | +| gen_let_stmt.rs:5:5:5:15 | let ... = 42 | gen_let_stmt.rs:5:13:5:14 | 42 | +| gen_let_stmt.rs:6:5:6:20 | let ... = 42 | gen_let_stmt.rs:6:18:6:19 | 42 | +| gen_let_stmt.rs:9:5:9:24 | let ... = ... | gen_let_stmt.rs:9:18:9:23 | TupleExpr | +| gen_let_stmt.rs:10:5:12:6 | let ... = ... else {...} | gen_let_stmt.rs:10:19:10:38 | ...::var(...) | diff --git a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getLetElse.expected b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getLetElse.expected index 8078ec669660..5e8090859af5 100644 --- a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getLetElse.expected +++ b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getLetElse.expected @@ -1 +1 @@ -| gen_let_stmt.rs:10:5:12:6 | LetStmt | gen_let_stmt.rs:10:40:12:5 | LetElse | +| gen_let_stmt.rs:10:5:12:6 | let ... = ... else {...} | gen_let_stmt.rs:10:40:12:5 | else {...} | diff --git a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getPat.expected b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getPat.expected index 93810df10e36..758837c946d1 100644 --- a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getPat.expected @@ -1,6 +1,6 @@ -| gen_let_stmt.rs:5:5:5:15 | LetStmt | gen_let_stmt.rs:5:9:5:9 | x | -| gen_let_stmt.rs:6:5:6:20 | LetStmt | gen_let_stmt.rs:6:9:6:9 | x | -| gen_let_stmt.rs:7:5:7:15 | LetStmt | gen_let_stmt.rs:7:9:7:9 | x | -| gen_let_stmt.rs:8:5:8:10 | LetStmt | gen_let_stmt.rs:8:9:8:9 | x | -| gen_let_stmt.rs:9:5:9:24 | LetStmt | gen_let_stmt.rs:9:9:9:14 | TuplePat | -| gen_let_stmt.rs:10:5:12:6 | LetStmt | gen_let_stmt.rs:10:9:10:15 | TupleStructPat | +| gen_let_stmt.rs:5:5:5:15 | let ... = 42 | gen_let_stmt.rs:5:9:5:9 | x | +| gen_let_stmt.rs:6:5:6:20 | let ... = 42 | gen_let_stmt.rs:6:9:6:9 | x | +| gen_let_stmt.rs:7:5:7:15 | let ... | gen_let_stmt.rs:7:9:7:9 | x | +| gen_let_stmt.rs:8:5:8:10 | let ... | gen_let_stmt.rs:8:9:8:9 | x | +| gen_let_stmt.rs:9:5:9:24 | let ... = ... | gen_let_stmt.rs:9:9:9:14 | TuplePat | +| gen_let_stmt.rs:10:5:12:6 | let ... = ... else {...} | gen_let_stmt.rs:10:9:10:15 | TupleStructPat | diff --git a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getTy.expected b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getTy.expected index 1cf6d1d2a513..489647f4793a 100644 --- a/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getTy.expected +++ b/rust/ql/test/extractor-tests/generated/LetStmt/LetStmt_getTy.expected @@ -1,2 +1,2 @@ -| gen_let_stmt.rs:6:5:6:20 | LetStmt | gen_let_stmt.rs:6:12:6:14 | PathType | -| gen_let_stmt.rs:7:5:7:15 | LetStmt | gen_let_stmt.rs:7:12:7:14 | PathType | +| gen_let_stmt.rs:6:5:6:20 | let ... = 42 | gen_let_stmt.rs:6:12:6:14 | i32 | +| gen_let_stmt.rs:7:5:7:15 | let ... | gen_let_stmt.rs:7:12:7:14 | i32 | diff --git a/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat.expected b/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat.expected index b7ac2ced75f8..d4734ef3dac3 100644 --- a/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat.expected +++ b/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat.expected @@ -1 +1 @@ -| gen_literal_pat.rs:6:9:6:10 | LiteralPat | hasLiteral: | yes | +| gen_literal_pat.rs:6:9:6:10 | 42 | hasLiteral: | yes | diff --git a/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat_getLiteral.expected b/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat_getLiteral.expected index ce74da0fb3a5..487f239737bc 100644 --- a/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat_getLiteral.expected +++ b/rust/ql/test/extractor-tests/generated/LiteralPat/LiteralPat_getLiteral.expected @@ -1 +1 @@ -| gen_literal_pat.rs:6:9:6:10 | LiteralPat | gen_literal_pat.rs:6:9:6:10 | 42 | +| gen_literal_pat.rs:6:9:6:10 | 42 | gen_literal_pat.rs:6:9:6:10 | 42 | diff --git a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.expected b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.expected index aae22652d645..b0adbe40897f 100644 --- a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.expected +++ b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.expected @@ -1,3 +1,3 @@ -| gen_loop_expr.rs:5:5:7:5 | LoopExpr | getNumberOfAttrs: | 0 | hasLabel: | no | hasLoopBody: | yes | -| gen_loop_expr.rs:8:5:11:5 | LoopExpr | getNumberOfAttrs: | 0 | hasLabel: | yes | hasLoopBody: | yes | -| gen_loop_expr.rs:13:5:19:5 | LoopExpr | getNumberOfAttrs: | 0 | hasLabel: | no | hasLoopBody: | yes | +| gen_loop_expr.rs:5:5:7:5 | loop { ... } | hasLabel: | no | hasLoopBody: | yes | getNumberOfAttrs: | 0 | +| gen_loop_expr.rs:8:5:11:5 | 'label: loop { ... } | hasLabel: | yes | hasLoopBody: | yes | getNumberOfAttrs: | 0 | +| gen_loop_expr.rs:13:5:19:5 | loop { ... } | hasLabel: | no | hasLoopBody: | yes | getNumberOfAttrs: | 0 | diff --git a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.ql b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.ql index c627fb16771a..92248ab5ec07 100644 --- a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.ql +++ b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr.ql @@ -2,11 +2,11 @@ import codeql.rust.elements import TestUtils -from LoopExpr x, int getNumberOfAttrs, string hasLabel, string hasLoopBody +from LoopExpr x, string hasLabel, string hasLoopBody, int getNumberOfAttrs where toBeTested(x) and not x.isUnknown() and - getNumberOfAttrs = x.getNumberOfAttrs() and (if x.hasLabel() then hasLabel = "yes" else hasLabel = "no") and - if x.hasLoopBody() then hasLoopBody = "yes" else hasLoopBody = "no" -select x, "getNumberOfAttrs:", getNumberOfAttrs, "hasLabel:", hasLabel, "hasLoopBody:", hasLoopBody + (if x.hasLoopBody() then hasLoopBody = "yes" else hasLoopBody = "no") and + getNumberOfAttrs = x.getNumberOfAttrs() +select x, "hasLabel:", hasLabel, "hasLoopBody:", hasLoopBody, "getNumberOfAttrs:", getNumberOfAttrs diff --git a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLabel.expected b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLabel.expected index 98a657f09832..e2dc2fdf8950 100644 --- a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLabel.expected +++ b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLabel.expected @@ -1 +1 @@ -| gen_loop_expr.rs:8:5:11:5 | LoopExpr | gen_loop_expr.rs:8:5:8:11 | Label | +| gen_loop_expr.rs:8:5:11:5 | 'label: loop { ... } | gen_loop_expr.rs:8:5:8:11 | 'label | diff --git a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLoopBody.expected b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLoopBody.expected index 358fd7625b57..9cf0c64dd0b8 100644 --- a/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLoopBody.expected +++ b/rust/ql/test/extractor-tests/generated/LoopExpr/LoopExpr_getLoopBody.expected @@ -1,3 +1,3 @@ -| gen_loop_expr.rs:5:5:7:5 | LoopExpr | gen_loop_expr.rs:5:10:7:5 | BlockExpr | -| gen_loop_expr.rs:8:5:11:5 | LoopExpr | gen_loop_expr.rs:8:18:11:5 | BlockExpr | -| gen_loop_expr.rs:13:5:19:5 | LoopExpr | gen_loop_expr.rs:13:10:19:5 | BlockExpr | +| gen_loop_expr.rs:5:5:7:5 | loop { ... } | gen_loop_expr.rs:5:10:7:5 | { ... } | +| gen_loop_expr.rs:8:5:11:5 | 'label: loop { ... } | gen_loop_expr.rs:8:18:11:5 | { ... } | +| gen_loop_expr.rs:13:5:19:5 | loop { ... } | gen_loop_expr.rs:13:10:19:5 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall.expected b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall.expected index 03bcc247a9d2..db69c4e068ab 100644 --- a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall.expected +++ b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall.expected @@ -1 +1 @@ -| gen_macro_call.rs:5:5:5:11 | MacroCall | hasExtendedCanonicalPath: | no | hasCrateOrigin: | no | getNumberOfAttrs: | 0 | hasPath: | yes | hasTokenTree: | yes | hasExpanded: | yes | +| gen_macro_call.rs:5:5:5:11 | todo!... | hasExtendedCanonicalPath: | no | hasCrateOrigin: | no | getNumberOfAttrs: | 0 | hasPath: | yes | hasTokenTree: | yes | hasExpanded: | yes | diff --git a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getExpanded.expected b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getExpanded.expected index 7bdb564985f8..1b60df41f797 100644 --- a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getExpanded.expected +++ b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getExpanded.expected @@ -1 +1 @@ -| gen_macro_call.rs:5:5:5:11 | MacroCall | gen_macro_call.rs:5:5:5:11 | MacroStmts | +| gen_macro_call.rs:5:5:5:11 | todo!... | gen_macro_call.rs:5:5:5:11 | MacroStmts | diff --git a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getPath.expected b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getPath.expected index 33685ad0aad9..23762715c9a2 100644 --- a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getPath.expected +++ b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getPath.expected @@ -1 +1 @@ -| gen_macro_call.rs:5:5:5:11 | MacroCall | gen_macro_call.rs:5:5:5:8 | todo | +| gen_macro_call.rs:5:5:5:11 | todo!... | gen_macro_call.rs:5:5:5:8 | todo | diff --git a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getTokenTree.expected b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getTokenTree.expected index 5f92a68536c1..d2ed004ecc43 100644 --- a/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getTokenTree.expected +++ b/rust/ql/test/extractor-tests/generated/MacroCall/MacroCall_getTokenTree.expected @@ -1 +1 @@ -| gen_macro_call.rs:5:5:5:11 | MacroCall | gen_macro_call.rs:5:10:5:11 | TokenTree | +| gen_macro_call.rs:5:5:5:11 | todo!... | gen_macro_call.rs:5:10:5:11 | TokenTree | diff --git a/rust/ql/test/extractor-tests/generated/MacroExpr/MacroExpr_getMacroCall.expected b/rust/ql/test/extractor-tests/generated/MacroExpr/MacroExpr_getMacroCall.expected index 5a635cabcbe1..c1815adac090 100644 --- a/rust/ql/test/extractor-tests/generated/MacroExpr/MacroExpr_getMacroCall.expected +++ b/rust/ql/test/extractor-tests/generated/MacroExpr/MacroExpr_getMacroCall.expected @@ -1 +1 @@ -| gen_macro_expr.rs:5:5:5:11 | MacroExpr | gen_macro_expr.rs:5:5:5:11 | MacroCall | +| gen_macro_expr.rs:5:5:5:11 | MacroExpr | gen_macro_expr.rs:5:5:5:11 | todo!... | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/DataFlowConsistency.expected index 02210855a69c..28012e97348f 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/DataFlowConsistency.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/CONSISTENCY/DataFlowConsistency.expected @@ -1,9 +1,11 @@ uniqueNodeLocation | file://:0:0:0:0 | ... .parent(...) | Node should have one location but has 0. | +| file://:0:0:0:0 | ... .parent(...) | Node should have one location but has 0. | | file://:0:0:0:0 | ... .unwrap(...) | Node should have one location but has 0. | -| file://:0:0:0:0 | BlockExpr | Node should have one location but has 0. | -| file://:0:0:0:0 | Param | Node should have one location but has 0. | +| file://:0:0:0:0 | ...: ... | Node should have one location but has 0. | +| file://:0:0:0:0 | path | Node should have one location but has 0. | | file://:0:0:0:0 | path | Node should have one location but has 0. | | file://:0:0:0:0 | path | Node should have one location but has 0. | +| file://:0:0:0:0 | { ... } | Node should have one location but has 0. | missingLocation -| Nodes without location: 6 | +| Nodes without location: 8 | diff --git a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected index a66e6bcca5ec..5940fb61696a 100644 --- a/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected +++ b/rust/ql/test/extractor-tests/generated/MacroItems/MacroItems_getItem.expected @@ -1,2 +1,2 @@ | file://:0:0:0:0 | MacroItems | 0 | file://:0:0:0:0 | Use | -| file://:0:0:0:0 | MacroItems | 1 | file://:0:0:0:0 | get_parent | +| file://:0:0:0:0 | MacroItems | 1 | file://:0:0:0:0 | fn get_parent | diff --git a/rust/ql/test/extractor-tests/generated/MacroStmts/MacroStmts_getExpr.expected b/rust/ql/test/extractor-tests/generated/MacroStmts/MacroStmts_getExpr.expected index 7d30926c1528..d1390595304e 100644 --- a/rust/ql/test/extractor-tests/generated/MacroStmts/MacroStmts_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MacroStmts/MacroStmts_getExpr.expected @@ -1 +1 @@ -| gen_macro_stmts.rs:5:14:5:28 | MacroStmts | gen_macro_stmts.rs:5:14:5:28 | BlockExpr | +| gen_macro_stmts.rs:5:14:5:28 | MacroStmts | gen_macro_stmts.rs:5:14:5:28 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm.expected b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm.expected index b685f8823628..b3eb4c178b26 100644 --- a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm.expected +++ b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm.expected @@ -1,4 +1,4 @@ -| gen_match_arm.rs:6:9:6:29 | MatchArm | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | -| gen_match_arm.rs:7:9:7:26 | MatchArm | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | -| gen_match_arm.rs:10:9:10:35 | MatchArm | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | yes | hasPat: | yes | -| gen_match_arm.rs:11:9:11:15 | MatchArm | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | +| gen_match_arm.rs:6:9:6:29 | ... => y | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | +| gen_match_arm.rs:7:9:7:26 | ...::None => 0 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | +| gen_match_arm.rs:10:9:10:35 | ... if ... => ... | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | yes | hasPat: | yes | +| gen_match_arm.rs:11:9:11:15 | _ => 0 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasGuard: | no | hasPat: | yes | diff --git a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getExpr.expected b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getExpr.expected index 493ea8d9bb03..95d4a7fc2f22 100644 --- a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getExpr.expected @@ -1,4 +1,4 @@ -| gen_match_arm.rs:6:9:6:29 | MatchArm | gen_match_arm.rs:6:28:6:28 | y | -| gen_match_arm.rs:7:9:7:26 | MatchArm | gen_match_arm.rs:7:25:7:25 | 0 | -| gen_match_arm.rs:10:9:10:35 | MatchArm | gen_match_arm.rs:10:30:10:34 | ... / ... | -| gen_match_arm.rs:11:9:11:15 | MatchArm | gen_match_arm.rs:11:14:11:14 | 0 | +| gen_match_arm.rs:6:9:6:29 | ... => y | gen_match_arm.rs:6:28:6:28 | y | +| gen_match_arm.rs:7:9:7:26 | ...::None => 0 | gen_match_arm.rs:7:25:7:25 | 0 | +| gen_match_arm.rs:10:9:10:35 | ... if ... => ... | gen_match_arm.rs:10:30:10:34 | ... / ... | +| gen_match_arm.rs:11:9:11:15 | _ => 0 | gen_match_arm.rs:11:14:11:14 | 0 | diff --git a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getGuard.expected b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getGuard.expected index 4e5da9874740..002917455476 100644 --- a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getGuard.expected +++ b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getGuard.expected @@ -1 +1 @@ -| gen_match_arm.rs:10:9:10:35 | MatchArm | gen_match_arm.rs:10:17:10:25 | MatchGuard | +| gen_match_arm.rs:10:9:10:35 | ... if ... => ... | gen_match_arm.rs:10:17:10:25 | MatchGuard | diff --git a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getPat.expected b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getPat.expected index 41f79ed16c9e..9928555fc324 100644 --- a/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/MatchArm/MatchArm_getPat.expected @@ -1,4 +1,4 @@ -| gen_match_arm.rs:6:9:6:29 | MatchArm | gen_match_arm.rs:6:9:6:23 | TupleStructPat | -| gen_match_arm.rs:7:9:7:26 | MatchArm | gen_match_arm.rs:7:9:7:20 | PathPat | -| gen_match_arm.rs:10:9:10:35 | MatchArm | gen_match_arm.rs:10:9:10:15 | TupleStructPat | -| gen_match_arm.rs:11:9:11:15 | MatchArm | gen_match_arm.rs:11:9:11:9 | WildcardPat | +| gen_match_arm.rs:6:9:6:29 | ... => y | gen_match_arm.rs:6:9:6:23 | TupleStructPat | +| gen_match_arm.rs:7:9:7:26 | ...::None => 0 | gen_match_arm.rs:7:9:7:20 | ...::None | +| gen_match_arm.rs:10:9:10:35 | ... if ... => ... | gen_match_arm.rs:10:9:10:15 | TupleStructPat | +| gen_match_arm.rs:11:9:11:15 | _ => 0 | gen_match_arm.rs:11:9:11:9 | _ | diff --git a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr.expected b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr.expected index 4591d8a57c36..b98c3de696b6 100644 --- a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr.expected @@ -1,2 +1,2 @@ -| gen_match_expr.rs:5:5:8:5 | MatchExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasMatchArmList: | yes | -| gen_match_expr.rs:9:5:12:5 | MatchExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | hasMatchArmList: | yes | +| gen_match_expr.rs:5:5:8:5 | match x { ... } | getNumberOfAttrs: | 0 | hasExpr: | yes | hasMatchArmList: | yes | +| gen_match_expr.rs:9:5:12:5 | match x { ... } | getNumberOfAttrs: | 0 | hasExpr: | yes | hasMatchArmList: | yes | diff --git a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getExpr.expected index 924eb3f807fa..427af7c6ed0c 100644 --- a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getExpr.expected @@ -1,2 +1,2 @@ -| gen_match_expr.rs:5:5:8:5 | MatchExpr | gen_match_expr.rs:5:11:5:11 | x | -| gen_match_expr.rs:9:5:12:5 | MatchExpr | gen_match_expr.rs:9:11:9:11 | x | +| gen_match_expr.rs:5:5:8:5 | match x { ... } | gen_match_expr.rs:5:11:5:11 | x | +| gen_match_expr.rs:9:5:12:5 | match x { ... } | gen_match_expr.rs:9:11:9:11 | x | diff --git a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getMatchArmList.expected b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getMatchArmList.expected index db83ecb1c535..f5e25db5b39d 100644 --- a/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getMatchArmList.expected +++ b/rust/ql/test/extractor-tests/generated/MatchExpr/MatchExpr_getMatchArmList.expected @@ -1,2 +1,2 @@ -| gen_match_expr.rs:5:5:8:5 | MatchExpr | gen_match_expr.rs:5:13:8:5 | MatchArmList | -| gen_match_expr.rs:9:5:12:5 | MatchExpr | gen_match_expr.rs:9:13:12:5 | MatchArmList | +| gen_match_expr.rs:5:5:8:5 | match x { ... } | gen_match_expr.rs:5:13:8:5 | MatchArmList | +| gen_match_expr.rs:9:5:12:5 | match x { ... } | gen_match_expr.rs:9:13:12:5 | MatchArmList | diff --git a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr_getGenericArgList.expected b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr_getGenericArgList.expected index 8b2622f09abe..dd1ed8c03041 100644 --- a/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr_getGenericArgList.expected +++ b/rust/ql/test/extractor-tests/generated/MethodCallExpr/MethodCallExpr_getGenericArgList.expected @@ -1 +1 @@ -| gen_method_call_expr.rs:6:5:6:25 | ... .foo(...) | gen_method_call_expr.rs:6:10:6:21 | GenericArgList | +| gen_method_call_expr.rs:6:5:6:25 | ... .foo(...) | gen_method_call_expr.rs:6:10:6:21 | <...> | diff --git a/rust/ql/test/extractor-tests/generated/Module/Module.expected b/rust/ql/test/extractor-tests/generated/Module/Module.expected index d7c04f7c1180..11b6d9e1e9bd 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module.expected @@ -1,3 +1,3 @@ -| gen_module.rs:3:1:4:8 | Module | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | no | hasName: | yes | hasVisibility: | no | -| gen_module.rs:5:1:7:1 | Module | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | yes | hasName: | yes | hasVisibility: | no | -| lib.rs:1:1:1:15 | Module | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | no | hasName: | yes | hasVisibility: | no | +| gen_module.rs:3:1:4:8 | mod foo | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | no | hasName: | yes | hasVisibility: | no | +| gen_module.rs:5:1:7:1 | mod bar | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | yes | hasName: | yes | hasVisibility: | no | +| lib.rs:1:1:1:15 | mod gen_module | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | getNumberOfAttrs: | 0 | hasItemList: | no | hasName: | yes | hasVisibility: | no | diff --git a/rust/ql/test/extractor-tests/generated/Module/Module_getCrateOrigin.expected b/rust/ql/test/extractor-tests/generated/Module/Module_getCrateOrigin.expected index e2e58c030ef7..0164fbb8e29b 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module_getCrateOrigin.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module_getCrateOrigin.expected @@ -1,3 +1,3 @@ -| gen_module.rs:3:1:4:8 | Module | repo::test | -| gen_module.rs:5:1:7:1 | Module | repo::test | -| lib.rs:1:1:1:15 | Module | repo::test | +| gen_module.rs:3:1:4:8 | mod foo | repo::test | +| gen_module.rs:5:1:7:1 | mod bar | repo::test | +| lib.rs:1:1:1:15 | mod gen_module | repo::test | diff --git a/rust/ql/test/extractor-tests/generated/Module/Module_getExtendedCanonicalPath.expected b/rust/ql/test/extractor-tests/generated/Module/Module_getExtendedCanonicalPath.expected index 19eadfdafd54..c573ef164ebe 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module_getExtendedCanonicalPath.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module_getExtendedCanonicalPath.expected @@ -1,3 +1,3 @@ -| gen_module.rs:3:1:4:8 | Module | crate::gen_module::foo | -| gen_module.rs:5:1:7:1 | Module | crate::gen_module::bar | -| lib.rs:1:1:1:15 | Module | crate::gen_module | +| gen_module.rs:3:1:4:8 | mod foo | crate::gen_module::foo | +| gen_module.rs:5:1:7:1 | mod bar | crate::gen_module::bar | +| lib.rs:1:1:1:15 | mod gen_module | crate::gen_module | diff --git a/rust/ql/test/extractor-tests/generated/Module/Module_getItemList.expected b/rust/ql/test/extractor-tests/generated/Module/Module_getItemList.expected index 04fd8d4a81a0..8edc36efa738 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module_getItemList.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module_getItemList.expected @@ -1 +1 @@ -| gen_module.rs:5:1:7:1 | Module | gen_module.rs:5:9:7:1 | ItemList | +| gen_module.rs:5:1:7:1 | mod bar | gen_module.rs:5:9:7:1 | ItemList | diff --git a/rust/ql/test/extractor-tests/generated/Module/Module_getName.expected b/rust/ql/test/extractor-tests/generated/Module/Module_getName.expected index cc295b1da89a..1874862befe5 100644 --- a/rust/ql/test/extractor-tests/generated/Module/Module_getName.expected +++ b/rust/ql/test/extractor-tests/generated/Module/Module_getName.expected @@ -1,3 +1,3 @@ -| gen_module.rs:3:1:4:8 | Module | gen_module.rs:4:5:4:7 | foo | -| gen_module.rs:5:1:7:1 | Module | gen_module.rs:5:5:5:7 | bar | -| lib.rs:1:1:1:15 | Module | lib.rs:1:5:1:14 | gen_module | +| gen_module.rs:3:1:4:8 | mod foo | gen_module.rs:4:5:4:7 | foo | +| gen_module.rs:5:1:7:1 | mod bar | gen_module.rs:5:5:5:7 | bar | +| lib.rs:1:1:1:15 | mod gen_module | lib.rs:1:5:1:14 | gen_module | diff --git a/rust/ql/test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr_getTy.expected b/rust/ql/test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr_getTy.expected index c7d0f2ee6afc..e2e11abb6a0f 100644 --- a/rust/ql/test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr_getTy.expected +++ b/rust/ql/test/extractor-tests/generated/OffsetOfExpr/OffsetOfExpr_getTy.expected @@ -1 +1 @@ -| gen_offset_of_expr.rs:5:5:5:38 | OffsetOfExpr | gen_offset_of_expr.rs:5:25:5:30 | PathType | +| gen_offset_of_expr.rs:5:5:5:38 | OffsetOfExpr | gen_offset_of_expr.rs:5:25:5:30 | Struct | diff --git a/rust/ql/test/extractor-tests/generated/OrPat/OrPat.expected b/rust/ql/test/extractor-tests/generated/OrPat/OrPat.expected index 786a00180935..1d67a8509b91 100644 --- a/rust/ql/test/extractor-tests/generated/OrPat/OrPat.expected +++ b/rust/ql/test/extractor-tests/generated/OrPat/OrPat.expected @@ -1 +1 @@ -| gen_or_pat.rs:6:9:6:38 | OrPat | getNumberOfPats: | 2 | +| gen_or_pat.rs:6:9:6:38 | ... \| ...::None | getNumberOfPats: | 2 | diff --git a/rust/ql/test/extractor-tests/generated/OrPat/OrPat_getPat.expected b/rust/ql/test/extractor-tests/generated/OrPat/OrPat_getPat.expected index a701548b2345..22ebce5dde55 100644 --- a/rust/ql/test/extractor-tests/generated/OrPat/OrPat_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/OrPat/OrPat_getPat.expected @@ -1,2 +1,2 @@ -| gen_or_pat.rs:6:9:6:38 | OrPat | 0 | gen_or_pat.rs:6:9:6:23 | TupleStructPat | -| gen_or_pat.rs:6:9:6:38 | OrPat | 1 | gen_or_pat.rs:6:27:6:38 | PathPat | +| gen_or_pat.rs:6:9:6:38 | ... \| ...::None | 0 | gen_or_pat.rs:6:9:6:23 | TupleStructPat | +| gen_or_pat.rs:6:9:6:38 | ... \| ...::None | 1 | gen_or_pat.rs:6:27:6:38 | ...::None | diff --git a/rust/ql/test/extractor-tests/generated/Path/Path.expected b/rust/ql/test/extractor-tests/generated/Path/Path.expected index db093224b76b..dfc303c3293c 100644 --- a/rust/ql/test/extractor-tests/generated/Path/Path.expected +++ b/rust/ql/test/extractor-tests/generated/Path/Path.expected @@ -1,2 +1,26 @@ -| gen_path.rs:5:5:5:7 | foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | -| gen_path.rs:5:5:5:12 | foo::bar | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path.rs:5:9:5:18 | some_crate | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path.rs:5:9:5:31 | ...::some_module | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path.rs:5:9:5:42 | ...::some_item | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path.rs:6:5:6:7 | foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path.rs:6:5:6:12 | ...::bar | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path_expr.rs:5:13:5:20 | variable | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:6:13:6:15 | foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:6:13:6:20 | ...::bar | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path_expr.rs:7:13:7:15 | <...> | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:7:13:7:20 | ...::foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path_expr.rs:7:14:7:14 | T | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:7:14:7:14 | T | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:8:13:8:30 | <...> | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:8:13:8:35 | ...::foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_pat.rs:5:11:5:11 | x | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_pat.rs:6:9:6:11 | Foo | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_pat.rs:6:9:6:16 | ...::Bar | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | +| gen_path_type.rs:5:14:5:16 | std | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_type.rs:5:14:5:29 | ...::collections | hasResolvedPath: | yes | hasResolvedCrateOrigin: | yes | hasQualifier: | yes | hasPart: | yes | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | hasResolvedPath: | yes | hasResolvedCrateOrigin: | yes | hasQualifier: | yes | hasPart: | yes | +| gen_path_type.rs:5:40:5:42 | i32 | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_type.rs:5:45:5:47 | i32 | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_type.rs:6:14:6:14 | X | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | no | hasPart: | yes | +| gen_path_type.rs:6:14:6:20 | ...::Item | hasResolvedPath: | no | hasResolvedCrateOrigin: | no | hasQualifier: | yes | hasPart: | yes | diff --git a/rust/ql/test/extractor-tests/generated/Path/PathExpr.expected b/rust/ql/test/extractor-tests/generated/Path/PathExpr.expected new file mode 100644 index 000000000000..4f6def5dd438 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathExpr.expected @@ -0,0 +1,6 @@ +| gen_path.rs:6:5:6:12 | ...::bar | getNumberOfAttrs: | 0 | hasPath: | yes | +| gen_path_expr.rs:5:13:5:20 | variable | getNumberOfAttrs: | 0 | hasPath: | yes | +| gen_path_expr.rs:6:13:6:20 | ...::bar | getNumberOfAttrs: | 0 | hasPath: | yes | +| gen_path_expr.rs:7:13:7:20 | ...::foo | getNumberOfAttrs: | 0 | hasPath: | yes | +| gen_path_expr.rs:8:13:8:35 | ...::foo | getNumberOfAttrs: | 0 | hasPath: | yes | +| gen_path_pat.rs:5:11:5:11 | x | getNumberOfAttrs: | 0 | hasPath: | yes | diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr.ql b/rust/ql/test/extractor-tests/generated/Path/PathExpr.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathExpr/PathExpr.ql rename to rust/ql/test/extractor-tests/generated/Path/PathExpr.ql diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getAttr.expected b/rust/ql/test/extractor-tests/generated/Path/PathExpr_getAttr.expected similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getAttr.expected rename to rust/ql/test/extractor-tests/generated/Path/PathExpr_getAttr.expected diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getAttr.ql b/rust/ql/test/extractor-tests/generated/Path/PathExpr_getAttr.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getAttr.ql rename to rust/ql/test/extractor-tests/generated/Path/PathExpr_getAttr.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathExpr_getPath.expected b/rust/ql/test/extractor-tests/generated/Path/PathExpr_getPath.expected new file mode 100644 index 000000000000..31b98a6a8ecf --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathExpr_getPath.expected @@ -0,0 +1,6 @@ +| gen_path.rs:6:5:6:12 | ...::bar | gen_path.rs:6:5:6:12 | ...::bar | +| gen_path_expr.rs:5:13:5:20 | variable | gen_path_expr.rs:5:13:5:20 | variable | +| gen_path_expr.rs:6:13:6:20 | ...::bar | gen_path_expr.rs:6:13:6:20 | ...::bar | +| gen_path_expr.rs:7:13:7:20 | ...::foo | gen_path_expr.rs:7:13:7:20 | ...::foo | +| gen_path_expr.rs:8:13:8:35 | ...::foo | gen_path_expr.rs:8:13:8:35 | ...::foo | +| gen_path_pat.rs:5:11:5:11 | x | gen_path_pat.rs:5:11:5:11 | x | diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getPath.ql b/rust/ql/test/extractor-tests/generated/Path/PathExpr_getPath.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getPath.ql rename to rust/ql/test/extractor-tests/generated/Path/PathExpr_getPath.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathPat.expected b/rust/ql/test/extractor-tests/generated/Path/PathPat.expected new file mode 100644 index 000000000000..159f006eecb1 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathPat.expected @@ -0,0 +1 @@ +| gen_path_pat.rs:6:9:6:16 | ...::Bar | hasPath: | yes | diff --git a/rust/ql/test/extractor-tests/generated/PathPat/PathPat.ql b/rust/ql/test/extractor-tests/generated/Path/PathPat.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathPat/PathPat.ql rename to rust/ql/test/extractor-tests/generated/Path/PathPat.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathPat_getPath.expected b/rust/ql/test/extractor-tests/generated/Path/PathPat_getPath.expected new file mode 100644 index 000000000000..3a601023f3f9 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathPat_getPath.expected @@ -0,0 +1 @@ +| gen_path_pat.rs:6:9:6:16 | ...::Bar | gen_path_pat.rs:6:9:6:16 | ...::Bar | diff --git a/rust/ql/test/extractor-tests/generated/PathPat/PathPat_getPath.ql b/rust/ql/test/extractor-tests/generated/Path/PathPat_getPath.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathPat/PathPat_getPath.ql rename to rust/ql/test/extractor-tests/generated/Path/PathPat_getPath.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathSegment.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment.expected new file mode 100644 index 000000000000..8278d7685dc3 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathSegment.expected @@ -0,0 +1,26 @@ +| gen_path.rs:5:9:5:18 | some_crate | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path.rs:5:21:5:31 | some_module | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path.rs:5:34:5:42 | some_item | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path.rs:6:5:6:7 | foo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path.rs:6:10:6:12 | bar | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:5:13:5:20 | variable | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:6:13:6:15 | foo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:6:18:6:20 | bar | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:7:13:7:15 | <...> | hasGenericArgList: | no | hasNameRef: | no | hasParamList: | no | hasPathType: | yes | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | yes | +| gen_path_expr.rs:7:14:7:14 | T | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:7:14:7:14 | T | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:7:18:7:20 | foo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:8:13:8:30 | <...> | hasGenericArgList: | no | hasNameRef: | no | hasParamList: | no | hasPathType: | yes | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | yes | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_expr.rs:8:33:8:35 | foo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_pat.rs:5:11:5:11 | x | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_pat.rs:6:9:6:11 | Foo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_pat.rs:6:14:6:16 | Bar | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:5:14:5:16 | std | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:5:19:5:29 | collections | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:5:32:5:48 | HashMap::<...> | hasGenericArgList: | yes | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:5:40:5:42 | i32 | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:5:45:5:47 | i32 | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:6:14:6:14 | X | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | +| gen_path_type.rs:6:17:6:20 | Item | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.expected new file mode 100644 index 000000000000..7487eb65c84c --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.expected @@ -0,0 +1 @@ +| gen_path_type.rs:5:32:5:48 | HashMap::<...> | gen_path_type.rs:5:39:5:48 | <...> | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getGenericArgList.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathSegment_getNameRef.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getNameRef.expected new file mode 100644 index 000000000000..8778f6b4aefd --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getNameRef.expected @@ -0,0 +1,24 @@ +| gen_path.rs:5:9:5:18 | some_crate | gen_path.rs:5:9:5:18 | some_crate | +| gen_path.rs:5:21:5:31 | some_module | gen_path.rs:5:21:5:31 | some_module | +| gen_path.rs:5:34:5:42 | some_item | gen_path.rs:5:34:5:42 | some_item | +| gen_path.rs:6:5:6:7 | foo | gen_path.rs:6:5:6:7 | foo | +| gen_path.rs:6:10:6:12 | bar | gen_path.rs:6:10:6:12 | bar | +| gen_path_expr.rs:5:13:5:20 | variable | gen_path_expr.rs:5:13:5:20 | variable | +| gen_path_expr.rs:6:13:6:15 | foo | gen_path_expr.rs:6:13:6:15 | foo | +| gen_path_expr.rs:6:18:6:20 | bar | gen_path_expr.rs:6:18:6:20 | bar | +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:7:18:7:20 | foo | gen_path_expr.rs:7:18:7:20 | foo | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_expr.rs:8:33:8:35 | foo | gen_path_expr.rs:8:33:8:35 | foo | +| gen_path_pat.rs:5:11:5:11 | x | gen_path_pat.rs:5:11:5:11 | x | +| gen_path_pat.rs:6:9:6:11 | Foo | gen_path_pat.rs:6:9:6:11 | Foo | +| gen_path_pat.rs:6:14:6:16 | Bar | gen_path_pat.rs:6:14:6:16 | Bar | +| gen_path_type.rs:5:14:5:16 | std | gen_path_type.rs:5:14:5:16 | std | +| gen_path_type.rs:5:19:5:29 | collections | gen_path_type.rs:5:19:5:29 | collections | +| gen_path_type.rs:5:32:5:48 | HashMap::<...> | gen_path_type.rs:5:32:5:38 | HashMap | +| gen_path_type.rs:5:40:5:42 | i32 | gen_path_type.rs:5:40:5:42 | i32 | +| gen_path_type.rs:5:45:5:47 | i32 | gen_path_type.rs:5:45:5:47 | i32 | +| gen_path_type.rs:6:14:6:14 | X | gen_path_type.rs:6:14:6:14 | X | +| gen_path_type.rs:6:17:6:20 | Item | gen_path_type.rs:6:17:6:20 | Item | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getNameRef.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getNameRef.ql diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getParamList.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getParamList.expected similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getParamList.expected rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getParamList.expected diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getParamList.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getParamList.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getParamList.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getParamList.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathSegment_getPathType.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getPathType.expected new file mode 100644 index 000000000000..db25db90b83e --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getPathType.expected @@ -0,0 +1,2 @@ +| gen_path_expr.rs:7:13:7:15 | <...> | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:8:13:8:30 | <...> | gen_path_expr.rs:8:14:8:20 | TypeRef | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getPathType.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getPathType.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getPathType.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getPathType.ql diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getRetType.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getRetType.expected similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getRetType.expected rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getRetType.expected diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getRetType.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getRetType.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getRetType.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getRetType.ql diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.expected similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.expected rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.expected diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getReturnTypeSyntax.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getReturnTypeSyntax.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathSegment_getTy.expected b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getTy.expected new file mode 100644 index 000000000000..db25db90b83e --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getTy.expected @@ -0,0 +1,2 @@ +| gen_path_expr.rs:7:13:7:15 | <...> | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:8:13:8:30 | <...> | gen_path_expr.rs:8:14:8:20 | TypeRef | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getTy.ql b/rust/ql/test/extractor-tests/generated/Path/PathSegment_getTy.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getTy.ql rename to rust/ql/test/extractor-tests/generated/Path/PathSegment_getTy.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathType.expected b/rust/ql/test/extractor-tests/generated/Path/PathType.expected new file mode 100644 index 000000000000..7d876dc4fa8d --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathType.expected @@ -0,0 +1,8 @@ +| gen_path_expr.rs:7:14:7:14 | T | hasPath: | yes | +| gen_path_expr.rs:7:14:7:14 | T | hasPath: | yes | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasPath: | yes | +| gen_path_expr.rs:8:14:8:20 | TypeRef | hasPath: | yes | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | hasPath: | yes | +| gen_path_type.rs:5:40:5:42 | i32 | hasPath: | yes | +| gen_path_type.rs:5:45:5:47 | i32 | hasPath: | yes | +| gen_path_type.rs:6:14:6:20 | ...::Item | hasPath: | yes | diff --git a/rust/ql/test/extractor-tests/generated/PathType/PathType.ql b/rust/ql/test/extractor-tests/generated/Path/PathType.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathType/PathType.ql rename to rust/ql/test/extractor-tests/generated/Path/PathType.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/PathType_getPath.expected b/rust/ql/test/extractor-tests/generated/Path/PathType_getPath.expected new file mode 100644 index 000000000000..879ed298b93f --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/PathType_getPath.expected @@ -0,0 +1,8 @@ +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | +| gen_path_type.rs:5:40:5:42 | i32 | gen_path_type.rs:5:40:5:42 | i32 | +| gen_path_type.rs:5:45:5:47 | i32 | gen_path_type.rs:5:45:5:47 | i32 | +| gen_path_type.rs:6:14:6:20 | ...::Item | gen_path_type.rs:6:14:6:20 | ...::Item | diff --git a/rust/ql/test/extractor-tests/generated/PathType/PathType_getPath.ql b/rust/ql/test/extractor-tests/generated/Path/PathType_getPath.ql similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathType/PathType_getPath.ql rename to rust/ql/test/extractor-tests/generated/Path/PathType_getPath.ql diff --git a/rust/ql/test/extractor-tests/generated/Path/Path_getPart.expected b/rust/ql/test/extractor-tests/generated/Path/Path_getPart.expected index 0e05956ea897..99ed98b3f521 100644 --- a/rust/ql/test/extractor-tests/generated/Path/Path_getPart.expected +++ b/rust/ql/test/extractor-tests/generated/Path/Path_getPart.expected @@ -1,2 +1,26 @@ -| gen_path.rs:5:5:5:7 | foo | gen_path.rs:5:5:5:7 | foo | -| gen_path.rs:5:5:5:12 | foo::bar | gen_path.rs:5:10:5:12 | bar | +| gen_path.rs:5:9:5:18 | some_crate | gen_path.rs:5:9:5:18 | some_crate | +| gen_path.rs:5:9:5:31 | ...::some_module | gen_path.rs:5:21:5:31 | some_module | +| gen_path.rs:5:9:5:42 | ...::some_item | gen_path.rs:5:34:5:42 | some_item | +| gen_path.rs:6:5:6:7 | foo | gen_path.rs:6:5:6:7 | foo | +| gen_path.rs:6:5:6:12 | ...::bar | gen_path.rs:6:10:6:12 | bar | +| gen_path_expr.rs:5:13:5:20 | variable | gen_path_expr.rs:5:13:5:20 | variable | +| gen_path_expr.rs:6:13:6:15 | foo | gen_path_expr.rs:6:13:6:15 | foo | +| gen_path_expr.rs:6:13:6:20 | ...::bar | gen_path_expr.rs:6:18:6:20 | bar | +| gen_path_expr.rs:7:13:7:15 | <...> | gen_path_expr.rs:7:13:7:15 | <...> | +| gen_path_expr.rs:7:13:7:20 | ...::foo | gen_path_expr.rs:7:18:7:20 | foo | +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:7:14:7:14 | T | gen_path_expr.rs:7:14:7:14 | T | +| gen_path_expr.rs:8:13:8:30 | <...> | gen_path_expr.rs:8:13:8:30 | <...> | +| gen_path_expr.rs:8:13:8:35 | ...::foo | gen_path_expr.rs:8:33:8:35 | foo | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_expr.rs:8:14:8:20 | TypeRef | gen_path_expr.rs:8:14:8:20 | TypeRef | +| gen_path_pat.rs:5:11:5:11 | x | gen_path_pat.rs:5:11:5:11 | x | +| gen_path_pat.rs:6:9:6:11 | Foo | gen_path_pat.rs:6:9:6:11 | Foo | +| gen_path_pat.rs:6:9:6:16 | ...::Bar | gen_path_pat.rs:6:14:6:16 | Bar | +| gen_path_type.rs:5:14:5:16 | std | gen_path_type.rs:5:14:5:16 | std | +| gen_path_type.rs:5:14:5:29 | ...::collections | gen_path_type.rs:5:19:5:29 | collections | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | gen_path_type.rs:5:32:5:48 | HashMap::<...> | +| gen_path_type.rs:5:40:5:42 | i32 | gen_path_type.rs:5:40:5:42 | i32 | +| gen_path_type.rs:5:45:5:47 | i32 | gen_path_type.rs:5:45:5:47 | i32 | +| gen_path_type.rs:6:14:6:14 | X | gen_path_type.rs:6:14:6:14 | X | +| gen_path_type.rs:6:14:6:20 | ...::Item | gen_path_type.rs:6:17:6:20 | Item | diff --git a/rust/ql/test/extractor-tests/generated/Path/Path_getQualifier.expected b/rust/ql/test/extractor-tests/generated/Path/Path_getQualifier.expected index 44aa2ca5a006..162efd4b1870 100644 --- a/rust/ql/test/extractor-tests/generated/Path/Path_getQualifier.expected +++ b/rust/ql/test/extractor-tests/generated/Path/Path_getQualifier.expected @@ -1 +1,10 @@ -| gen_path.rs:5:5:5:12 | foo::bar | gen_path.rs:5:5:5:7 | foo | +| gen_path.rs:5:9:5:31 | ...::some_module | gen_path.rs:5:9:5:18 | some_crate | +| gen_path.rs:5:9:5:42 | ...::some_item | gen_path.rs:5:9:5:31 | ...::some_module | +| gen_path.rs:6:5:6:12 | ...::bar | gen_path.rs:6:5:6:7 | foo | +| gen_path_expr.rs:6:13:6:20 | ...::bar | gen_path_expr.rs:6:13:6:15 | foo | +| gen_path_expr.rs:7:13:7:20 | ...::foo | gen_path_expr.rs:7:13:7:15 | <...> | +| gen_path_expr.rs:8:13:8:35 | ...::foo | gen_path_expr.rs:8:13:8:30 | <...> | +| gen_path_pat.rs:6:9:6:16 | ...::Bar | gen_path_pat.rs:6:9:6:11 | Foo | +| gen_path_type.rs:5:14:5:29 | ...::collections | gen_path_type.rs:5:14:5:16 | std | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | gen_path_type.rs:5:14:5:29 | ...::collections | +| gen_path_type.rs:6:14:6:20 | ...::Item | gen_path_type.rs:6:14:6:14 | X | diff --git a/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.expected b/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.expected index e69de29bb2d1..df80e22f7446 100644 --- a/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.expected +++ b/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedCrateOrigin.expected @@ -0,0 +1,2 @@ +| gen_path_type.rs:5:14:5:29 | ...::collections | lang:std | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | lang:std | diff --git a/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedPath.expected b/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedPath.expected index e69de29bb2d1..7d1c698b0ce5 100644 --- a/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedPath.expected +++ b/rust/ql/test/extractor-tests/generated/Path/Path_getResolvedPath.expected @@ -0,0 +1,2 @@ +| gen_path_type.rs:5:14:5:29 | ...::collections | crate::collections | +| gen_path_type.rs:5:14:5:48 | ...::HashMap::<...> | crate::collections::hash::map::HashMap | diff --git a/rust/ql/test/extractor-tests/generated/Path/gen_path.rs b/rust/ql/test/extractor-tests/generated/Path/gen_path.rs index 3b3f054875a9..de58e6978afe 100644 --- a/rust/ql/test/extractor-tests/generated/Path/gen_path.rs +++ b/rust/ql/test/extractor-tests/generated/Path/gen_path.rs @@ -2,5 +2,6 @@ fn test_path() -> () { // A path. For example: + use some_crate::some_module::some_item; foo::bar; } diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/gen_path_expr.rs b/rust/ql/test/extractor-tests/generated/Path/gen_path_expr.rs similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathExpr/gen_path_expr.rs rename to rust/ql/test/extractor-tests/generated/Path/gen_path_expr.rs diff --git a/rust/ql/test/extractor-tests/generated/PathPat/gen_path_pat.rs b/rust/ql/test/extractor-tests/generated/Path/gen_path_pat.rs similarity index 100% rename from rust/ql/test/extractor-tests/generated/PathPat/gen_path_pat.rs rename to rust/ql/test/extractor-tests/generated/Path/gen_path_pat.rs diff --git a/rust/ql/test/extractor-tests/generated/Path/gen_path_type.rs b/rust/ql/test/extractor-tests/generated/Path/gen_path_type.rs new file mode 100644 index 000000000000..62797d756779 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Path/gen_path_type.rs @@ -0,0 +1,7 @@ +// generated by codegen, do not edit + +fn test_path_type() -> () { + // A type referring to a path. For example: + type X = std::collections::HashMap; + type Y = X::Item; +} diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/extractor-tests/generated/PathExpr/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index c54360f7361b..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathExpr/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,3 +0,0 @@ -uniqueNodeToString -| gen_path_expr.rs:7:13:7:20 | (no string representation) | Node should have one toString but has 0. | -| gen_path_expr.rs:8:13:8:35 | (no string representation) | Node should have one toString but has 0. | diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr.expected b/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr.expected deleted file mode 100644 index a676396a2f9b..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr.expected +++ /dev/null @@ -1,4 +0,0 @@ -| gen_path_expr.rs:5:13:5:20 | variable | getNumberOfAttrs: | 0 | hasPath: | yes | -| gen_path_expr.rs:6:13:6:20 | foo::bar | getNumberOfAttrs: | 0 | hasPath: | yes | -| gen_path_expr.rs:7:13:7:20 | (no string representation) | getNumberOfAttrs: | 0 | hasPath: | yes | -| gen_path_expr.rs:8:13:8:35 | (no string representation) | getNumberOfAttrs: | 0 | hasPath: | yes | diff --git a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getPath.expected b/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getPath.expected deleted file mode 100644 index a5765b5be60b..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathExpr/PathExpr_getPath.expected +++ /dev/null @@ -1,4 +0,0 @@ -| gen_path_expr.rs:5:13:5:20 | variable | gen_path_expr.rs:5:13:5:20 | variable | -| gen_path_expr.rs:6:13:6:20 | foo::bar | gen_path_expr.rs:6:13:6:20 | foo::bar | -| gen_path_expr.rs:7:13:7:20 | (no string representation) | gen_path_expr.rs:7:13:7:20 | (no string representation) | -| gen_path_expr.rs:8:13:8:35 | (no string representation) | gen_path_expr.rs:8:13:8:35 | (no string representation) | diff --git a/rust/ql/test/extractor-tests/generated/PathPat/PathPat.expected b/rust/ql/test/extractor-tests/generated/PathPat/PathPat.expected deleted file mode 100644 index 54845a7565c4..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathPat/PathPat.expected +++ /dev/null @@ -1 +0,0 @@ -| gen_path_pat.rs:6:9:6:16 | PathPat | hasPath: | yes | diff --git a/rust/ql/test/extractor-tests/generated/PathPat/PathPat_getPath.expected b/rust/ql/test/extractor-tests/generated/PathPat/PathPat_getPath.expected deleted file mode 100644 index d48ba6549dba..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathPat/PathPat_getPath.expected +++ /dev/null @@ -1 +0,0 @@ -| gen_path_pat.rs:6:9:6:16 | PathPat | gen_path_pat.rs:6:9:6:16 | Foo::Bar | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment.expected b/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment.expected deleted file mode 100644 index 32042fc6a59d..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment.expected +++ /dev/null @@ -1,4 +0,0 @@ -| gen_path_segment.rs:5:5:5:8 | todo | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | -| gen_path_segment.rs:5:5:5:11 | $crate | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | -| gen_path_segment.rs:5:5:5:11 | panic | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | -| gen_path_segment.rs:5:5:5:11 | panicking | hasGenericArgList: | no | hasNameRef: | yes | hasParamList: | no | hasPathType: | no | hasRetType: | no | hasReturnTypeSyntax: | no | hasTy: | no | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.expected b/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getGenericArgList.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.expected b/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.expected deleted file mode 100644 index 28346240d296..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getNameRef.expected +++ /dev/null @@ -1,4 +0,0 @@ -| gen_path_segment.rs:5:5:5:8 | todo | gen_path_segment.rs:5:5:5:8 | todo | -| gen_path_segment.rs:5:5:5:11 | $crate | gen_path_segment.rs:5:5:5:11 | $crate | -| gen_path_segment.rs:5:5:5:11 | panic | gen_path_segment.rs:5:5:5:11 | panic | -| gen_path_segment.rs:5:5:5:11 | panicking | gen_path_segment.rs:5:5:5:11 | panicking | diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getPathType.expected b/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getPathType.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getTy.expected b/rust/ql/test/extractor-tests/generated/PathSegment/PathSegment_getTy.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/PathSegment/gen_path_segment.rs b/rust/ql/test/extractor-tests/generated/PathSegment/gen_path_segment.rs deleted file mode 100644 index 0ab008b6a685..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathSegment/gen_path_segment.rs +++ /dev/null @@ -1,6 +0,0 @@ -// generated by codegen, do not edit - -fn test_path_segment() -> () { - // A PathSegment. For example: - todo!() -} diff --git a/rust/ql/test/extractor-tests/generated/PathType/PathType.expected b/rust/ql/test/extractor-tests/generated/PathType/PathType.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/PathType/PathType_getPath.expected b/rust/ql/test/extractor-tests/generated/PathType/PathType_getPath.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/extractor-tests/generated/PathType/gen_path_type.rs b/rust/ql/test/extractor-tests/generated/PathType/gen_path_type.rs deleted file mode 100644 index e7666e2128a6..000000000000 --- a/rust/ql/test/extractor-tests/generated/PathType/gen_path_type.rs +++ /dev/null @@ -1,6 +0,0 @@ -// generated by codegen, do not edit - -fn test_path_type() -> () { - // A PathType. For example: - todo!() -} diff --git a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr.expected b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr.expected index 6f222c18f03b..7d8aeff6dfa9 100644 --- a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr.expected +++ b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr.expected @@ -1,6 +1,6 @@ -| gen_range_expr.rs:5:13:5:18 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | yes | -| gen_range_expr.rs:6:13:6:17 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | yes | -| gen_range_expr.rs:7:13:7:16 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | no | hasOperatorName: | yes | hasStart: | yes | -| gen_range_expr.rs:8:13:8:16 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | no | -| gen_range_expr.rs:9:13:9:17 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | no | -| gen_range_expr.rs:10:13:10:14 | RangeExpr | getNumberOfAttrs: | 0 | hasEnd: | no | hasOperatorName: | yes | hasStart: | no | +| gen_range_expr.rs:5:13:5:18 | 1..=10 | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | yes | +| gen_range_expr.rs:6:13:6:17 | 1..10 | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | yes | +| gen_range_expr.rs:7:13:7:16 | 10.. | getNumberOfAttrs: | 0 | hasEnd: | no | hasOperatorName: | yes | hasStart: | yes | +| gen_range_expr.rs:8:13:8:16 | ..10 | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | no | +| gen_range_expr.rs:9:13:9:17 | ..=10 | getNumberOfAttrs: | 0 | hasEnd: | yes | hasOperatorName: | yes | hasStart: | no | +| gen_range_expr.rs:10:13:10:14 | .. | getNumberOfAttrs: | 0 | hasEnd: | no | hasOperatorName: | yes | hasStart: | no | diff --git a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getEnd.expected b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getEnd.expected index 101ae46138a4..46f5dba778c5 100644 --- a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getEnd.expected +++ b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getEnd.expected @@ -1,4 +1,4 @@ -| gen_range_expr.rs:5:13:5:18 | RangeExpr | gen_range_expr.rs:5:17:5:18 | 10 | -| gen_range_expr.rs:6:13:6:17 | RangeExpr | gen_range_expr.rs:6:16:6:17 | 10 | -| gen_range_expr.rs:8:13:8:16 | RangeExpr | gen_range_expr.rs:8:15:8:16 | 10 | -| gen_range_expr.rs:9:13:9:17 | RangeExpr | gen_range_expr.rs:9:16:9:17 | 10 | +| gen_range_expr.rs:5:13:5:18 | 1..=10 | gen_range_expr.rs:5:17:5:18 | 10 | +| gen_range_expr.rs:6:13:6:17 | 1..10 | gen_range_expr.rs:6:16:6:17 | 10 | +| gen_range_expr.rs:8:13:8:16 | ..10 | gen_range_expr.rs:8:15:8:16 | 10 | +| gen_range_expr.rs:9:13:9:17 | ..=10 | gen_range_expr.rs:9:16:9:17 | 10 | diff --git a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getOperatorName.expected b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getOperatorName.expected index b0d778eb7bb2..ee9172ac1ced 100644 --- a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getOperatorName.expected +++ b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getOperatorName.expected @@ -1,6 +1,6 @@ -| gen_range_expr.rs:5:13:5:18 | RangeExpr | ..= | -| gen_range_expr.rs:6:13:6:17 | RangeExpr | .. | -| gen_range_expr.rs:7:13:7:16 | RangeExpr | .. | -| gen_range_expr.rs:8:13:8:16 | RangeExpr | .. | -| gen_range_expr.rs:9:13:9:17 | RangeExpr | ..= | -| gen_range_expr.rs:10:13:10:14 | RangeExpr | .. | +| gen_range_expr.rs:5:13:5:18 | 1..=10 | ..= | +| gen_range_expr.rs:6:13:6:17 | 1..10 | .. | +| gen_range_expr.rs:7:13:7:16 | 10.. | .. | +| gen_range_expr.rs:8:13:8:16 | ..10 | .. | +| gen_range_expr.rs:9:13:9:17 | ..=10 | ..= | +| gen_range_expr.rs:10:13:10:14 | .. | .. | diff --git a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getStart.expected b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getStart.expected index 79b34397efe4..7f58ee5299fb 100644 --- a/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getStart.expected +++ b/rust/ql/test/extractor-tests/generated/RangeExpr/RangeExpr_getStart.expected @@ -1,3 +1,3 @@ -| gen_range_expr.rs:5:13:5:18 | RangeExpr | gen_range_expr.rs:5:13:5:13 | 1 | -| gen_range_expr.rs:6:13:6:17 | RangeExpr | gen_range_expr.rs:6:13:6:13 | 1 | -| gen_range_expr.rs:7:13:7:16 | RangeExpr | gen_range_expr.rs:7:13:7:14 | 10 | +| gen_range_expr.rs:5:13:5:18 | 1..=10 | gen_range_expr.rs:5:13:5:13 | 1 | +| gen_range_expr.rs:6:13:6:17 | 1..10 | gen_range_expr.rs:6:13:6:13 | 1 | +| gen_range_expr.rs:7:13:7:16 | 10.. | gen_range_expr.rs:7:13:7:14 | 10 | diff --git a/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getEnd.expected b/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getEnd.expected index 591b8d9093e1..38ded3fb940d 100644 --- a/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getEnd.expected +++ b/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getEnd.expected @@ -1,2 +1,2 @@ -| gen_range_pat.rs:6:9:6:12 | RangePat | gen_range_pat.rs:6:11:6:12 | LiteralPat | -| gen_range_pat.rs:7:9:7:15 | RangePat | gen_range_pat.rs:7:14:7:15 | LiteralPat | +| gen_range_pat.rs:6:9:6:12 | RangePat | gen_range_pat.rs:6:11:6:12 | 15 | +| gen_range_pat.rs:7:9:7:15 | RangePat | gen_range_pat.rs:7:14:7:15 | 25 | diff --git a/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getStart.expected b/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getStart.expected index ef6a8ea21216..ac6eadaf08c0 100644 --- a/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getStart.expected +++ b/rust/ql/test/extractor-tests/generated/RangePat/RangePat_getStart.expected @@ -1,2 +1,2 @@ -| gen_range_pat.rs:7:9:7:15 | RangePat | gen_range_pat.rs:7:9:7:10 | LiteralPat | -| gen_range_pat.rs:8:9:8:12 | RangePat | gen_range_pat.rs:8:9:8:10 | LiteralPat | +| gen_range_pat.rs:7:9:7:15 | RangePat | gen_range_pat.rs:7:9:7:10 | 16 | +| gen_range_pat.rs:8:9:8:12 | RangePat | gen_range_pat.rs:8:9:8:10 | 26 | diff --git a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr.expected b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr.expected index d30c4ef70e5d..445b906bf88b 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr.expected @@ -1,4 +1,4 @@ -| gen_record_expr.rs:5:17:5:34 | RecordExpr | hasPath: | yes | hasRecordExprFieldList: | yes | -| gen_record_expr.rs:6:18:6:38 | RecordExpr | hasPath: | yes | hasRecordExprFieldList: | yes | -| gen_record_expr.rs:7:5:7:22 | RecordExpr | hasPath: | yes | hasRecordExprFieldList: | yes | -| gen_record_expr.rs:8:5:8:14 | RecordExpr | hasPath: | yes | hasRecordExprFieldList: | yes | +| gen_record_expr.rs:5:17:5:34 | Foo {...} | hasPath: | yes | hasRecordExprFieldList: | yes | +| gen_record_expr.rs:6:18:6:38 | Foo {...} | hasPath: | yes | hasRecordExprFieldList: | yes | +| gen_record_expr.rs:7:5:7:22 | Foo {...} | hasPath: | yes | hasRecordExprFieldList: | yes | +| gen_record_expr.rs:8:5:8:14 | Foo {...} | hasPath: | yes | hasRecordExprFieldList: | yes | diff --git a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.expected b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.expected index 91d4f5cb0b56..5aad8aad60c9 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getPath.expected @@ -1,4 +1,4 @@ -| gen_record_expr.rs:5:17:5:34 | RecordExpr | gen_record_expr.rs:5:17:5:19 | Foo | -| gen_record_expr.rs:6:18:6:38 | RecordExpr | gen_record_expr.rs:6:18:6:20 | Foo | -| gen_record_expr.rs:7:5:7:22 | RecordExpr | gen_record_expr.rs:7:5:7:7 | Foo | -| gen_record_expr.rs:8:5:8:14 | RecordExpr | gen_record_expr.rs:8:5:8:7 | Foo | +| gen_record_expr.rs:5:17:5:34 | Foo {...} | gen_record_expr.rs:5:17:5:19 | Foo | +| gen_record_expr.rs:6:18:6:38 | Foo {...} | gen_record_expr.rs:6:18:6:20 | Foo | +| gen_record_expr.rs:7:5:7:22 | Foo {...} | gen_record_expr.rs:7:5:7:7 | Foo | +| gen_record_expr.rs:8:5:8:14 | Foo {...} | gen_record_expr.rs:8:5:8:7 | Foo | diff --git a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getRecordExprFieldList.expected b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getRecordExprFieldList.expected index d00bf3935d3e..79d18cac3b0d 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getRecordExprFieldList.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExpr/RecordExpr_getRecordExprFieldList.expected @@ -1,4 +1,4 @@ -| gen_record_expr.rs:5:17:5:34 | RecordExpr | gen_record_expr.rs:5:21:5:34 | RecordExprFieldList | -| gen_record_expr.rs:6:18:6:38 | RecordExpr | gen_record_expr.rs:6:22:6:38 | RecordExprFieldList | -| gen_record_expr.rs:7:5:7:22 | RecordExpr | gen_record_expr.rs:7:9:7:22 | RecordExprFieldList | -| gen_record_expr.rs:8:5:8:14 | RecordExpr | gen_record_expr.rs:8:9:8:14 | RecordExprFieldList | +| gen_record_expr.rs:5:17:5:34 | Foo {...} | gen_record_expr.rs:5:21:5:34 | RecordExprFieldList | +| gen_record_expr.rs:6:18:6:38 | Foo {...} | gen_record_expr.rs:6:22:6:38 | RecordExprFieldList | +| gen_record_expr.rs:7:5:7:22 | Foo {...} | gen_record_expr.rs:7:9:7:22 | RecordExprFieldList | +| gen_record_expr.rs:8:5:8:14 | Foo {...} | gen_record_expr.rs:8:9:8:14 | RecordExprFieldList | diff --git a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField.expected b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField.expected index 79ed38759180..46e7ce811bb7 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField.expected @@ -1,2 +1,2 @@ -| gen_record_expr_field.rs:5:11:5:14 | RecordExprField | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | -| gen_record_expr_field.rs:5:17:5:20 | RecordExprField | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | +| gen_record_expr_field.rs:5:11:5:14 | a: 1 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | +| gen_record_expr_field.rs:5:17:5:20 | b: 2 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasNameRef: | yes | diff --git a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getExpr.expected b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getExpr.expected index ec096d00a314..cfb892424494 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getExpr.expected @@ -1,2 +1,2 @@ -| gen_record_expr_field.rs:5:11:5:14 | RecordExprField | gen_record_expr_field.rs:5:14:5:14 | 1 | -| gen_record_expr_field.rs:5:17:5:20 | RecordExprField | gen_record_expr_field.rs:5:20:5:20 | 2 | +| gen_record_expr_field.rs:5:11:5:14 | a: 1 | gen_record_expr_field.rs:5:14:5:14 | 1 | +| gen_record_expr_field.rs:5:17:5:20 | b: 2 | gen_record_expr_field.rs:5:20:5:20 | 2 | diff --git a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getNameRef.expected b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getNameRef.expected index 081e3ccac566..d0a3f82cd9d2 100644 --- a/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getNameRef.expected +++ b/rust/ql/test/extractor-tests/generated/RecordExprField/RecordExprField_getNameRef.expected @@ -1,2 +1,2 @@ -| gen_record_expr_field.rs:5:11:5:14 | RecordExprField | gen_record_expr_field.rs:5:11:5:11 | a | -| gen_record_expr_field.rs:5:17:5:20 | RecordExprField | gen_record_expr_field.rs:5:17:5:17 | b | +| gen_record_expr_field.rs:5:11:5:14 | a: 1 | gen_record_expr_field.rs:5:11:5:11 | a | +| gen_record_expr_field.rs:5:17:5:20 | b: 2 | gen_record_expr_field.rs:5:17:5:17 | b | diff --git a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat.expected b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat.expected index 62cd3eb3c37d..8d7f96229ad7 100644 --- a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat.expected +++ b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat.expected @@ -1,2 +1,2 @@ -| gen_record_pat.rs:6:9:6:26 | RecordPat | hasPath: | yes | hasRecordPatFieldList: | yes | -| gen_record_pat.rs:7:9:7:18 | RecordPat | hasPath: | yes | hasRecordPatFieldList: | yes | +| gen_record_pat.rs:6:9:6:26 | Foo {...} | hasPath: | yes | hasRecordPatFieldList: | yes | +| gen_record_pat.rs:7:9:7:18 | Foo {...} | hasPath: | yes | hasRecordPatFieldList: | yes | diff --git a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getPath.expected b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getPath.expected index a9e0be01d5b5..7cd2f51d9eb6 100644 --- a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getPath.expected +++ b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getPath.expected @@ -1,2 +1,2 @@ -| gen_record_pat.rs:6:9:6:26 | RecordPat | gen_record_pat.rs:6:9:6:11 | Foo | -| gen_record_pat.rs:7:9:7:18 | RecordPat | gen_record_pat.rs:7:9:7:11 | Foo | +| gen_record_pat.rs:6:9:6:26 | Foo {...} | gen_record_pat.rs:6:9:6:11 | Foo | +| gen_record_pat.rs:7:9:7:18 | Foo {...} | gen_record_pat.rs:7:9:7:11 | Foo | diff --git a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getRecordPatFieldList.expected b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getRecordPatFieldList.expected index 86ba10ed9a3c..bad0003c07bd 100644 --- a/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getRecordPatFieldList.expected +++ b/rust/ql/test/extractor-tests/generated/RecordPat/RecordPat_getRecordPatFieldList.expected @@ -1,2 +1,2 @@ -| gen_record_pat.rs:6:9:6:26 | RecordPat | gen_record_pat.rs:6:13:6:26 | RecordPatFieldList | -| gen_record_pat.rs:7:9:7:18 | RecordPat | gen_record_pat.rs:7:13:7:18 | RecordPatFieldList | +| gen_record_pat.rs:6:9:6:26 | Foo {...} | gen_record_pat.rs:6:13:6:26 | RecordPatFieldList | +| gen_record_pat.rs:7:9:7:18 | Foo {...} | gen_record_pat.rs:7:13:7:18 | RecordPatFieldList | diff --git a/rust/ql/test/extractor-tests/generated/RecordPatField/RecordPatField_getPat.expected b/rust/ql/test/extractor-tests/generated/RecordPatField/RecordPatField_getPat.expected index a3ac24ec52be..1fa8a0f8bb7f 100644 --- a/rust/ql/test/extractor-tests/generated/RecordPatField/RecordPatField_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/RecordPatField/RecordPatField_getPat.expected @@ -1,2 +1,2 @@ -| gen_record_pat_field.rs:5:15:5:18 | RecordPatField | gen_record_pat_field.rs:5:18:5:18 | LiteralPat | -| gen_record_pat_field.rs:5:21:5:24 | RecordPatField | gen_record_pat_field.rs:5:24:5:24 | LiteralPat | +| gen_record_pat_field.rs:5:15:5:18 | RecordPatField | gen_record_pat_field.rs:5:18:5:18 | 1 | +| gen_record_pat_field.rs:5:21:5:24 | RecordPatField | gen_record_pat_field.rs:5:24:5:24 | 2 | diff --git a/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr.expected b/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr.expected index d4c75d9a79a0..412f82142060 100644 --- a/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr.expected +++ b/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr.expected @@ -1,4 +1,4 @@ -| gen_ref_expr.rs:5:25:5:28 | RefExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | no | isRaw: | no | -| gen_ref_expr.rs:6:23:6:30 | RefExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | yes | isRaw: | no | -| gen_ref_expr.rs:7:35:7:48 | RefExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | yes | isMut: | no | isRaw: | yes | -| gen_ref_expr.rs:8:33:8:44 | RefExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | yes | isRaw: | yes | +| gen_ref_expr.rs:5:25:5:28 | &foo | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | no | isRaw: | no | +| gen_ref_expr.rs:6:23:6:30 | &mut foo | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | yes | isRaw: | no | +| gen_ref_expr.rs:7:35:7:48 | &raw const foo | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | yes | isMut: | no | isRaw: | yes | +| gen_ref_expr.rs:8:33:8:44 | &raw mut foo | getNumberOfAttrs: | 0 | hasExpr: | yes | isConst: | no | isMut: | yes | isRaw: | yes | diff --git a/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr_getExpr.expected index 571986ecf102..7709668f6fd8 100644 --- a/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/RefExpr/RefExpr_getExpr.expected @@ -1,4 +1,4 @@ -| gen_ref_expr.rs:5:25:5:28 | RefExpr | gen_ref_expr.rs:5:26:5:28 | foo | -| gen_ref_expr.rs:6:23:6:30 | RefExpr | gen_ref_expr.rs:6:28:6:30 | foo | -| gen_ref_expr.rs:7:35:7:48 | RefExpr | gen_ref_expr.rs:7:46:7:48 | foo | -| gen_ref_expr.rs:8:33:8:44 | RefExpr | gen_ref_expr.rs:8:42:8:44 | foo | +| gen_ref_expr.rs:5:25:5:28 | &foo | gen_ref_expr.rs:5:26:5:28 | foo | +| gen_ref_expr.rs:6:23:6:30 | &mut foo | gen_ref_expr.rs:6:28:6:30 | foo | +| gen_ref_expr.rs:7:35:7:48 | &raw const foo | gen_ref_expr.rs:7:46:7:48 | foo | +| gen_ref_expr.rs:8:33:8:44 | &raw mut foo | gen_ref_expr.rs:8:42:8:44 | foo | diff --git a/rust/ql/test/extractor-tests/generated/RefPat/RefPat.expected b/rust/ql/test/extractor-tests/generated/RefPat/RefPat.expected index c2fc3416297a..a9dfaf874561 100644 --- a/rust/ql/test/extractor-tests/generated/RefPat/RefPat.expected +++ b/rust/ql/test/extractor-tests/generated/RefPat/RefPat.expected @@ -1,2 +1,2 @@ -| gen_ref_pat.rs:6:9:6:28 | RefPat | isMut: | yes | hasPat: | yes | -| gen_ref_pat.rs:7:9:7:21 | RefPat | isMut: | no | hasPat: | yes | +| gen_ref_pat.rs:6:9:6:28 | &mut ... | isMut: | yes | hasPat: | yes | +| gen_ref_pat.rs:7:9:7:21 | &...::None | isMut: | no | hasPat: | yes | diff --git a/rust/ql/test/extractor-tests/generated/RefPat/RefPat_getPat.expected b/rust/ql/test/extractor-tests/generated/RefPat/RefPat_getPat.expected index 891c3c8216e6..d4f78daeb829 100644 --- a/rust/ql/test/extractor-tests/generated/RefPat/RefPat_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/RefPat/RefPat_getPat.expected @@ -1,2 +1,2 @@ -| gen_ref_pat.rs:6:9:6:28 | RefPat | gen_ref_pat.rs:6:14:6:28 | TupleStructPat | -| gen_ref_pat.rs:7:9:7:21 | RefPat | gen_ref_pat.rs:7:10:7:21 | PathPat | +| gen_ref_pat.rs:6:9:6:28 | &mut ... | gen_ref_pat.rs:6:14:6:28 | TupleStructPat | +| gen_ref_pat.rs:7:9:7:21 | &...::None | gen_ref_pat.rs:7:10:7:21 | ...::None | diff --git a/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr.expected b/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr.expected index dbf54e0f49bd..83220773989e 100644 --- a/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr.expected @@ -1,2 +1,2 @@ -| gen_return_expr.rs:5:5:5:13 | ReturnExpr | getNumberOfAttrs: | 0 | hasExpr: | yes | -| gen_return_expr.rs:8:5:8:10 | ReturnExpr | getNumberOfAttrs: | 0 | hasExpr: | no | +| gen_return_expr.rs:5:5:5:13 | return 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | +| gen_return_expr.rs:8:5:8:10 | return | getNumberOfAttrs: | 0 | hasExpr: | no | diff --git a/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr_getExpr.expected b/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr_getExpr.expected index 2e1a4a8f8cec..c75ecd0b23c5 100644 --- a/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr_getExpr.expected +++ b/rust/ql/test/extractor-tests/generated/ReturnExpr/ReturnExpr_getExpr.expected @@ -1 +1 @@ -| gen_return_expr.rs:5:5:5:13 | ReturnExpr | gen_return_expr.rs:5:12:5:13 | 42 | +| gen_return_expr.rs:5:5:5:13 | return 42 | gen_return_expr.rs:5:12:5:13 | 42 | diff --git a/rust/ql/test/extractor-tests/generated/SlicePat/SlicePat_getPat.expected b/rust/ql/test/extractor-tests/generated/SlicePat/SlicePat_getPat.expected index e874d3a22ee4..0725988f37fd 100644 --- a/rust/ql/test/extractor-tests/generated/SlicePat/SlicePat_getPat.expected +++ b/rust/ql/test/extractor-tests/generated/SlicePat/SlicePat_getPat.expected @@ -1,13 +1,13 @@ -| gen_slice_pat.rs:6:9:6:23 | SlicePat | 0 | gen_slice_pat.rs:6:10:6:10 | LiteralPat | -| gen_slice_pat.rs:6:9:6:23 | SlicePat | 1 | gen_slice_pat.rs:6:13:6:13 | LiteralPat | -| gen_slice_pat.rs:6:9:6:23 | SlicePat | 2 | gen_slice_pat.rs:6:16:6:16 | LiteralPat | -| gen_slice_pat.rs:6:9:6:23 | SlicePat | 3 | gen_slice_pat.rs:6:19:6:19 | LiteralPat | -| gen_slice_pat.rs:6:9:6:23 | SlicePat | 4 | gen_slice_pat.rs:6:22:6:22 | LiteralPat | -| gen_slice_pat.rs:7:9:7:18 | SlicePat | 0 | gen_slice_pat.rs:7:10:7:10 | LiteralPat | -| gen_slice_pat.rs:7:9:7:18 | SlicePat | 1 | gen_slice_pat.rs:7:13:7:13 | LiteralPat | -| gen_slice_pat.rs:7:9:7:18 | SlicePat | 2 | gen_slice_pat.rs:7:16:7:17 | RestPat | +| gen_slice_pat.rs:6:9:6:23 | SlicePat | 0 | gen_slice_pat.rs:6:10:6:10 | 1 | +| gen_slice_pat.rs:6:9:6:23 | SlicePat | 1 | gen_slice_pat.rs:6:13:6:13 | 2 | +| gen_slice_pat.rs:6:9:6:23 | SlicePat | 2 | gen_slice_pat.rs:6:16:6:16 | 3 | +| gen_slice_pat.rs:6:9:6:23 | SlicePat | 3 | gen_slice_pat.rs:6:19:6:19 | 4 | +| gen_slice_pat.rs:6:9:6:23 | SlicePat | 4 | gen_slice_pat.rs:6:22:6:22 | 5 | +| gen_slice_pat.rs:7:9:7:18 | SlicePat | 0 | gen_slice_pat.rs:7:10:7:10 | 1 | +| gen_slice_pat.rs:7:9:7:18 | SlicePat | 1 | gen_slice_pat.rs:7:13:7:13 | 2 | +| gen_slice_pat.rs:7:9:7:18 | SlicePat | 2 | gen_slice_pat.rs:7:16:7:17 | .. | | gen_slice_pat.rs:8:9:8:24 | SlicePat | 0 | gen_slice_pat.rs:8:10:8:10 | x | | gen_slice_pat.rs:8:9:8:24 | SlicePat | 1 | gen_slice_pat.rs:8:13:8:13 | y | -| gen_slice_pat.rs:8:9:8:24 | SlicePat | 2 | gen_slice_pat.rs:8:16:8:17 | RestPat | +| gen_slice_pat.rs:8:9:8:24 | SlicePat | 2 | gen_slice_pat.rs:8:16:8:17 | .. | | gen_slice_pat.rs:8:9:8:24 | SlicePat | 3 | gen_slice_pat.rs:8:20:8:20 | z | -| gen_slice_pat.rs:8:9:8:24 | SlicePat | 4 | gen_slice_pat.rs:8:23:8:23 | LiteralPat | +| gen_slice_pat.rs:8:9:8:24 | SlicePat | 4 | gen_slice_pat.rs:8:23:8:23 | 7 | diff --git a/rust/ql/test/extractor-tests/generated/SourceFile/SourceFile_getItem.expected b/rust/ql/test/extractor-tests/generated/SourceFile/SourceFile_getItem.expected index a256c2b84b20..981f445201e0 100644 --- a/rust/ql/test/extractor-tests/generated/SourceFile/SourceFile_getItem.expected +++ b/rust/ql/test/extractor-tests/generated/SourceFile/SourceFile_getItem.expected @@ -1,2 +1,2 @@ -| gen_source_file.rs:1:1:6:2 | SourceFile | 0 | gen_source_file.rs:3:1:6:1 | test_source_file | -| lib.rs:1:1:1:20 | SourceFile | 0 | lib.rs:1:1:1:20 | Module | +| gen_source_file.rs:1:1:6:2 | SourceFile | 0 | gen_source_file.rs:3:1:6:1 | fn test_source_file | +| lib.rs:1:1:1:20 | SourceFile | 0 | lib.rs:1:1:1:20 | mod gen_source_file | diff --git a/rust/ql/test/extractor-tests/generated/Trait/AssocItemList_getAssocItem.expected b/rust/ql/test/extractor-tests/generated/Trait/AssocItemList_getAssocItem.expected index 0f70039583a8..c7337ca090ae 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/AssocItemList_getAssocItem.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/AssocItemList_getAssocItem.expected @@ -1,3 +1,3 @@ | gen_trait.rs:4:20:8:1 | AssocItemList | 0 | gen_trait.rs:5:3:5:18 | TypeAlias | | gen_trait.rs:4:20:8:1 | AssocItemList | 1 | gen_trait.rs:6:3:6:20 | TypeAlias | -| gen_trait.rs:4:20:8:1 | AssocItemList | 2 | gen_trait.rs:7:3:7:72 | frobinize_with | +| gen_trait.rs:4:20:8:1 | AssocItemList | 2 | gen_trait.rs:7:3:7:72 | fn frobinize_with | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected index ba06219a2d4c..451422d330ab 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait.expected @@ -1,2 +1,2 @@ -| gen_trait.rs:3:1:8:1 | Trait | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAssocItemList: | yes | getNumberOfAttrs: | 0 | hasGenericParamList: | no | isAuto: | no | isUnsafe: | no | hasName: | yes | hasTypeBoundList: | no | hasVisibility: | no | hasWhereClause: | no | -| gen_trait.rs:10:1:10:57 | Trait | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAssocItemList: | yes | getNumberOfAttrs: | 0 | hasGenericParamList: | yes | isAuto: | no | isUnsafe: | no | hasName: | yes | hasTypeBoundList: | no | hasVisibility: | yes | hasWhereClause: | yes | +| gen_trait.rs:3:1:8:1 | trait Frobinizable | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAssocItemList: | yes | getNumberOfAttrs: | 0 | hasGenericParamList: | no | isAuto: | no | isUnsafe: | no | hasName: | yes | hasTypeBoundList: | no | hasVisibility: | no | hasWhereClause: | no | +| gen_trait.rs:10:1:10:57 | trait Foo | hasExtendedCanonicalPath: | yes | hasCrateOrigin: | yes | hasAssocItemList: | yes | getNumberOfAttrs: | 0 | hasGenericParamList: | yes | isAuto: | no | isUnsafe: | no | hasName: | yes | hasTypeBoundList: | no | hasVisibility: | yes | hasWhereClause: | yes | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getAssocItemList.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getAssocItemList.expected index fc16a774800e..b60c89c8d3fe 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getAssocItemList.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getAssocItemList.expected @@ -1,2 +1,2 @@ -| gen_trait.rs:3:1:8:1 | Trait | gen_trait.rs:4:20:8:1 | AssocItemList | -| gen_trait.rs:10:1:10:57 | Trait | gen_trait.rs:10:56:10:57 | AssocItemList | +| gen_trait.rs:3:1:8:1 | trait Frobinizable | gen_trait.rs:4:20:8:1 | AssocItemList | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:56:10:57 | AssocItemList | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getCrateOrigin.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getCrateOrigin.expected index 36106a58ae0c..1e42bb437317 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getCrateOrigin.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getCrateOrigin.expected @@ -1,2 +1,2 @@ -| gen_trait.rs:3:1:8:1 | Trait | repo::test | -| gen_trait.rs:10:1:10:57 | Trait | repo::test | +| gen_trait.rs:3:1:8:1 | trait Frobinizable | repo::test | +| gen_trait.rs:10:1:10:57 | trait Foo | repo::test | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getExtendedCanonicalPath.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getExtendedCanonicalPath.expected index d89c9f23757d..6a5e82036739 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getExtendedCanonicalPath.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getExtendedCanonicalPath.expected @@ -1,2 +1,2 @@ -| gen_trait.rs:3:1:8:1 | Trait | crate::gen_trait::Frobinizable | -| gen_trait.rs:10:1:10:57 | Trait | crate::gen_trait::Foo | +| gen_trait.rs:3:1:8:1 | trait Frobinizable | crate::gen_trait::Frobinizable | +| gen_trait.rs:10:1:10:57 | trait Foo | crate::gen_trait::Foo | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getGenericParamList.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getGenericParamList.expected index 85a848355f12..1ea7592a5973 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getGenericParamList.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getGenericParamList.expected @@ -1 +1 @@ -| gen_trait.rs:10:1:10:57 | Trait | gen_trait.rs:10:14:10:30 | GenericParamList | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:14:10:30 | GenericParamList | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getName.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getName.expected index cc60a2ab9386..1c087cdea895 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getName.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getName.expected @@ -1,2 +1,2 @@ -| gen_trait.rs:3:1:8:1 | Trait | gen_trait.rs:4:7:4:18 | Frobinizable | -| gen_trait.rs:10:1:10:57 | Trait | gen_trait.rs:10:11:10:13 | Foo | +| gen_trait.rs:3:1:8:1 | trait Frobinizable | gen_trait.rs:4:7:4:18 | Frobinizable | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:11:10:13 | Foo | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getVisibility.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getVisibility.expected index 67d505acda7e..56576624e47f 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getVisibility.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getVisibility.expected @@ -1 +1 @@ -| gen_trait.rs:10:1:10:57 | Trait | gen_trait.rs:10:1:10:3 | Visibility | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:1:10:3 | Visibility | diff --git a/rust/ql/test/extractor-tests/generated/Trait/Trait_getWhereClause.expected b/rust/ql/test/extractor-tests/generated/Trait/Trait_getWhereClause.expected index a1ae3161e79d..d46ac2d04cd9 100644 --- a/rust/ql/test/extractor-tests/generated/Trait/Trait_getWhereClause.expected +++ b/rust/ql/test/extractor-tests/generated/Trait/Trait_getWhereClause.expected @@ -1 +1 @@ -| gen_trait.rs:10:1:10:57 | Trait | gen_trait.rs:10:32:10:54 | WhereClause | +| gen_trait.rs:10:1:10:57 | trait Foo | gen_trait.rs:10:32:10:54 | WhereClause | diff --git a/rust/ql/test/extractor-tests/generated/TuplePat/TuplePat_getField.expected b/rust/ql/test/extractor-tests/generated/TuplePat/TuplePat_getField.expected index 59d028b43ca9..78e00f39c92b 100644 --- a/rust/ql/test/extractor-tests/generated/TuplePat/TuplePat_getField.expected +++ b/rust/ql/test/extractor-tests/generated/TuplePat/TuplePat_getField.expected @@ -2,5 +2,5 @@ | gen_tuple_pat.rs:5:9:5:14 | TuplePat | 1 | gen_tuple_pat.rs:5:13:5:13 | y | | gen_tuple_pat.rs:6:9:6:22 | TuplePat | 0 | gen_tuple_pat.rs:6:10:6:10 | a | | gen_tuple_pat.rs:6:9:6:22 | TuplePat | 1 | gen_tuple_pat.rs:6:13:6:13 | b | -| gen_tuple_pat.rs:6:9:6:22 | TuplePat | 2 | gen_tuple_pat.rs:6:16:6:17 | RestPat | +| gen_tuple_pat.rs:6:9:6:22 | TuplePat | 2 | gen_tuple_pat.rs:6:16:6:17 | .. | | gen_tuple_pat.rs:6:9:6:22 | TuplePat | 3 | gen_tuple_pat.rs:6:21:6:21 | z | diff --git a/rust/ql/test/extractor-tests/generated/TupleStructPat/TupleStructPat_getField.expected b/rust/ql/test/extractor-tests/generated/TupleStructPat/TupleStructPat_getField.expected index 7a009a0818b7..5885cbcea3e3 100644 --- a/rust/ql/test/extractor-tests/generated/TupleStructPat/TupleStructPat_getField.expected +++ b/rust/ql/test/extractor-tests/generated/TupleStructPat/TupleStructPat_getField.expected @@ -1,7 +1,7 @@ -| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:6:15:6:17 | LiteralPat | -| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 1 | gen_tuple_struct_pat.rs:6:20:6:20 | LiteralPat | -| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 2 | gen_tuple_struct_pat.rs:6:23:6:23 | LiteralPat | -| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 3 | gen_tuple_struct_pat.rs:6:26:6:26 | LiteralPat | -| gen_tuple_struct_pat.rs:7:9:7:20 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:7:15:7:16 | RestPat | -| gen_tuple_struct_pat.rs:7:9:7:20 | TupleStructPat | 1 | gen_tuple_struct_pat.rs:7:19:7:19 | LiteralPat | -| gen_tuple_struct_pat.rs:8:9:8:17 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:8:15:8:16 | RestPat | +| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:6:15:6:17 | "a" | +| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 1 | gen_tuple_struct_pat.rs:6:20:6:20 | 1 | +| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 2 | gen_tuple_struct_pat.rs:6:23:6:23 | 2 | +| gen_tuple_struct_pat.rs:6:9:6:27 | TupleStructPat | 3 | gen_tuple_struct_pat.rs:6:26:6:26 | 3 | +| gen_tuple_struct_pat.rs:7:9:7:20 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:7:15:7:16 | .. | +| gen_tuple_struct_pat.rs:7:9:7:20 | TupleStructPat | 1 | gen_tuple_struct_pat.rs:7:19:7:19 | 3 | +| gen_tuple_struct_pat.rs:8:9:8:17 | TupleStructPat | 0 | gen_tuple_struct_pat.rs:8:15:8:16 | .. | diff --git a/rust/ql/test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.expected b/rust/ql/test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.expected index 3b2effb788e1..ea89e8b29b4e 100644 --- a/rust/ql/test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.expected +++ b/rust/ql/test/extractor-tests/generated/UnderscoreExpr/UnderscoreExpr.expected @@ -1 +1 @@ -| gen_underscore_expr.rs:5:5:5:5 | UnderscoreExpr | getNumberOfAttrs: | 0 | +| gen_underscore_expr.rs:5:5:5:5 | _ | getNumberOfAttrs: | 0 | diff --git a/rust/ql/test/extractor-tests/generated/WhileExpr/WhileExpr.ql b/rust/ql/test/extractor-tests/generated/WhileExpr/WhileExpr.ql index ceb095e9d201..8544014e571a 100644 --- a/rust/ql/test/extractor-tests/generated/WhileExpr/WhileExpr.ql +++ b/rust/ql/test/extractor-tests/generated/WhileExpr/WhileExpr.ql @@ -2,13 +2,13 @@ import codeql.rust.elements import TestUtils -from WhileExpr x, int getNumberOfAttrs, string hasCondition, string hasLabel, string hasLoopBody +from WhileExpr x, string hasLabel, string hasLoopBody, int getNumberOfAttrs, string hasCondition where toBeTested(x) and not x.isUnknown() and - getNumberOfAttrs = x.getNumberOfAttrs() and - (if x.hasCondition() then hasCondition = "yes" else hasCondition = "no") and (if x.hasLabel() then hasLabel = "yes" else hasLabel = "no") and - if x.hasLoopBody() then hasLoopBody = "yes" else hasLoopBody = "no" -select x, "getNumberOfAttrs:", getNumberOfAttrs, "hasCondition:", hasCondition, "hasLabel:", - hasLabel, "hasLoopBody:", hasLoopBody + (if x.hasLoopBody() then hasLoopBody = "yes" else hasLoopBody = "no") and + getNumberOfAttrs = x.getNumberOfAttrs() and + if x.hasCondition() then hasCondition = "yes" else hasCondition = "no" +select x, "hasLabel:", hasLabel, "hasLoopBody:", hasLoopBody, "getNumberOfAttrs:", getNumberOfAttrs, + "hasCondition:", hasCondition diff --git a/rust/ql/test/extractor-tests/generated/WildcardPat/WildcardPat.expected b/rust/ql/test/extractor-tests/generated/WildcardPat/WildcardPat.expected index ceb155671b7f..b8ac989ee1c0 100644 --- a/rust/ql/test/extractor-tests/generated/WildcardPat/WildcardPat.expected +++ b/rust/ql/test/extractor-tests/generated/WildcardPat/WildcardPat.expected @@ -1 +1 @@ -| gen_wildcard_pat.rs:5:9:5:9 | WildcardPat | +| gen_wildcard_pat.rs:5:9:5:9 | _ | diff --git a/rust/ql/test/extractor-tests/utf8/ast.expected b/rust/ql/test/extractor-tests/utf8/ast.expected index dfc20f5ab58b..560f834766e3 100644 --- a/rust/ql/test/extractor-tests/utf8/ast.expected +++ b/rust/ql/test/extractor-tests/utf8/ast.expected @@ -1,33 +1,33 @@ -| lib.rs:1:1:1:21 | Module | | lib.rs:1:1:1:21 | SourceFile | +| lib.rs:1:1:1:21 | mod utf8_identifiers | | lib.rs:1:5:1:20 | utf8_identifiers | -| utf8_identifiers.rs:1:1:4:6 | foo | +| utf8_identifiers.rs:1:1:4:6 | fn foo | | utf8_identifiers.rs:1:1:12:2 | SourceFile | | utf8_identifiers.rs:1:4:1:6 | foo | | utf8_identifiers.rs:1:7:4:1 | GenericParamList | -| utf8_identifiers.rs:2:5:2:6 | Lifetime | +| utf8_identifiers.rs:2:5:2:6 | ''\u03b2 | | utf8_identifiers.rs:2:5:2:6 | LifetimeParam | | utf8_identifiers.rs:3:5:3:5 | TypeParam | | utf8_identifiers.rs:3:5:3:5 | \u03b3 | | utf8_identifiers.rs:4:2:4:3 | ParamList | -| utf8_identifiers.rs:4:5:4:6 | BlockExpr | | utf8_identifiers.rs:4:5:4:6 | StmtList | +| utf8_identifiers.rs:4:5:4:6 | { ... } | | utf8_identifiers.rs:6:1:8:1 | Struct | | utf8_identifiers.rs:6:8:6:8 | X | | utf8_identifiers.rs:6:10:8:1 | RecordFieldList | | utf8_identifiers.rs:7:5:7:5 | \u03b4 | | utf8_identifiers.rs:7:5:7:13 | RecordField | -| utf8_identifiers.rs:7:9:7:13 | PathType | +| utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:7:9:7:13 | usize | | utf8_identifiers.rs:10:1:10:3 | Visibility | -| utf8_identifiers.rs:10:1:12:1 | main | +| utf8_identifiers.rs:10:1:12:1 | fn main | | utf8_identifiers.rs:10:8:10:11 | main | | utf8_identifiers.rs:10:12:10:13 | ParamList | -| utf8_identifiers.rs:10:15:12:1 | BlockExpr | | utf8_identifiers.rs:10:15:12:1 | StmtList | -| utf8_identifiers.rs:11:5:11:24 | LetStmt | +| utf8_identifiers.rs:10:15:12:1 | { ... } | +| utf8_identifiers.rs:11:5:11:24 | let ... = 0.00001f64 | | utf8_identifiers.rs:11:9:11:9 | \u03b1 | | utf8_identifiers.rs:11:9:11:9 | \u03b1 | | utf8_identifiers.rs:11:14:11:23 | 0.00001f64 | diff --git a/rust/ql/test/library-tests/controlflow-unstable/Cfg.expected b/rust/ql/test/library-tests/controlflow-unstable/Cfg.expected index 05851289a35f..4260e2384c8f 100644 --- a/rust/ql/test/library-tests/controlflow-unstable/Cfg.expected +++ b/rust/ql/test/library-tests/controlflow-unstable/Cfg.expected @@ -1,53 +1,53 @@ edges -| test.rs:5:5:11:5 | enter test_and_if_let | test.rs:5:24:5:24 | a | | -| test.rs:5:5:11:5 | exit test_and_if_let (normal) | test.rs:5:5:11:5 | exit test_and_if_let | | -| test.rs:5:24:5:24 | a | test.rs:5:24:5:30 | Param | match | -| test.rs:5:24:5:30 | Param | test.rs:5:33:5:33 | b | | -| test.rs:5:33:5:33 | b | test.rs:5:33:5:47 | Param | match | -| test.rs:5:33:5:47 | Param | test.rs:5:50:5:50 | c | | -| test.rs:5:50:5:50 | c | test.rs:5:50:5:56 | Param | match | -| test.rs:5:50:5:56 | Param | test.rs:6:12:6:12 | a | | -| test.rs:5:67:11:5 | BlockExpr | test.rs:5:5:11:5 | exit test_and_if_let (normal) | | -| test.rs:6:9:10:9 | IfExpr | test.rs:5:67:11:5 | BlockExpr | | +| test.rs:5:5:11:5 | enter fn test_and_if_let | test.rs:5:24:5:24 | a | | +| test.rs:5:5:11:5 | exit fn test_and_if_let (normal) | test.rs:5:5:11:5 | exit fn test_and_if_let | | +| test.rs:5:24:5:24 | a | test.rs:5:24:5:30 | ...: bool | match | +| test.rs:5:24:5:30 | ...: bool | test.rs:5:33:5:33 | b | | +| test.rs:5:33:5:33 | b | test.rs:5:33:5:47 | ...: Option::<...> | match | +| test.rs:5:33:5:47 | ...: Option::<...> | test.rs:5:50:5:50 | c | | +| test.rs:5:50:5:50 | c | test.rs:5:50:5:56 | ...: bool | match | +| test.rs:5:50:5:56 | ...: bool | test.rs:6:12:6:12 | a | | +| test.rs:5:67:11:5 | { ... } | test.rs:5:5:11:5 | exit fn test_and_if_let (normal) | | +| test.rs:6:9:10:9 | if ... {...} else {...} | test.rs:5:67:11:5 | { ... } | | | test.rs:6:12:6:12 | a | test.rs:6:12:6:31 | [boolean(false)] ... && ... | false | -| test.rs:6:12:6:12 | a | test.rs:6:17:6:31 | LetExpr | true | +| test.rs:6:12:6:12 | a | test.rs:6:17:6:31 | let ... = b | true | | test.rs:6:12:6:31 | [boolean(false)] ... && ... | test.rs:9:13:9:17 | false | false | | test.rs:6:12:6:31 | [boolean(true)] ... && ... | test.rs:7:13:7:13 | d | true | -| test.rs:6:17:6:31 | LetExpr | test.rs:6:31:6:31 | b | | +| test.rs:6:17:6:31 | let ... = b | test.rs:6:31:6:31 | b | | | test.rs:6:21:6:27 | TupleStructPat | test.rs:6:12:6:31 | [boolean(false)] ... && ... | no-match | | test.rs:6:21:6:27 | TupleStructPat | test.rs:6:26:6:26 | d | match | | test.rs:6:26:6:26 | d | test.rs:6:12:6:31 | [boolean(true)] ... && ... | match | | test.rs:6:31:6:31 | b | test.rs:6:21:6:27 | TupleStructPat | | -| test.rs:6:33:8:9 | BlockExpr | test.rs:6:9:10:9 | IfExpr | | -| test.rs:7:13:7:13 | d | test.rs:6:33:8:9 | BlockExpr | | -| test.rs:8:16:10:9 | BlockExpr | test.rs:6:9:10:9 | IfExpr | | -| test.rs:9:13:9:17 | false | test.rs:8:16:10:9 | BlockExpr | | -| test.rs:13:5:21:5 | enter test_and_if_let2 | test.rs:13:25:13:25 | a | | -| test.rs:13:5:21:5 | exit test_and_if_let2 (normal) | test.rs:13:5:21:5 | exit test_and_if_let2 | | -| test.rs:13:25:13:25 | a | test.rs:13:25:13:31 | Param | match | -| test.rs:13:25:13:31 | Param | test.rs:13:34:13:34 | b | | -| test.rs:13:34:13:34 | b | test.rs:13:34:13:39 | Param | match | -| test.rs:13:34:13:39 | Param | test.rs:13:42:13:42 | c | | -| test.rs:13:42:13:42 | c | test.rs:13:42:13:48 | Param | match | -| test.rs:13:42:13:48 | Param | test.rs:14:12:14:12 | a | | -| test.rs:13:59:21:5 | BlockExpr | test.rs:13:5:21:5 | exit test_and_if_let2 (normal) | | -| test.rs:14:9:20:9 | IfExpr | test.rs:13:59:21:5 | BlockExpr | | +| test.rs:6:33:8:9 | { ... } | test.rs:6:9:10:9 | if ... {...} else {...} | | +| test.rs:7:13:7:13 | d | test.rs:6:33:8:9 | { ... } | | +| test.rs:8:16:10:9 | { ... } | test.rs:6:9:10:9 | if ... {...} else {...} | | +| test.rs:9:13:9:17 | false | test.rs:8:16:10:9 | { ... } | | +| test.rs:13:5:21:5 | enter fn test_and_if_let2 | test.rs:13:25:13:25 | a | | +| test.rs:13:5:21:5 | exit fn test_and_if_let2 (normal) | test.rs:13:5:21:5 | exit fn test_and_if_let2 | | +| test.rs:13:25:13:25 | a | test.rs:13:25:13:31 | ...: bool | match | +| test.rs:13:25:13:31 | ...: bool | test.rs:13:34:13:34 | b | | +| test.rs:13:34:13:34 | b | test.rs:13:34:13:39 | ...: i64 | match | +| test.rs:13:34:13:39 | ...: i64 | test.rs:13:42:13:42 | c | | +| test.rs:13:42:13:42 | c | test.rs:13:42:13:48 | ...: bool | match | +| test.rs:13:42:13:48 | ...: bool | test.rs:14:12:14:12 | a | | +| test.rs:13:59:21:5 | { ... } | test.rs:13:5:21:5 | exit fn test_and_if_let2 (normal) | | +| test.rs:14:9:20:9 | if ... {...} else {...} | test.rs:13:59:21:5 | { ... } | | | test.rs:14:12:14:12 | a | test.rs:14:12:14:25 | [boolean(false)] ... && ... | false | -| test.rs:14:12:14:12 | a | test.rs:14:17:14:25 | LetExpr | true | +| test.rs:14:12:14:12 | a | test.rs:14:17:14:25 | let ... = b | true | | test.rs:14:12:14:25 | [boolean(false)] ... && ... | test.rs:14:12:15:16 | [boolean(false)] ... && ... | false | | test.rs:14:12:14:25 | [boolean(true)] ... && ... | test.rs:15:16:15:16 | c | true | | test.rs:14:12:15:16 | [boolean(false)] ... && ... | test.rs:19:13:19:17 | false | false | | test.rs:14:12:15:16 | [boolean(true)] ... && ... | test.rs:17:13:17:13 | d | true | -| test.rs:14:17:14:25 | LetExpr | test.rs:14:25:14:25 | b | | +| test.rs:14:17:14:25 | let ... = b | test.rs:14:25:14:25 | b | | | test.rs:14:21:14:21 | d | test.rs:14:12:14:25 | [boolean(true)] ... && ... | match | | test.rs:14:25:14:25 | b | test.rs:14:21:14:21 | d | | | test.rs:15:16:15:16 | c | test.rs:14:12:15:16 | [boolean(false)] ... && ... | false | | test.rs:15:16:15:16 | c | test.rs:14:12:15:16 | [boolean(true)] ... && ... | true | -| test.rs:16:9:18:9 | BlockExpr | test.rs:14:9:20:9 | IfExpr | | +| test.rs:16:9:18:9 | { ... } | test.rs:14:9:20:9 | if ... {...} else {...} | | | test.rs:17:13:17:13 | d | test.rs:17:17:17:17 | 0 | | -| test.rs:17:13:17:17 | ... > ... | test.rs:16:9:18:9 | BlockExpr | | +| test.rs:17:13:17:17 | ... > ... | test.rs:16:9:18:9 | { ... } | | | test.rs:17:17:17:17 | 0 | test.rs:17:13:17:17 | ... > ... | | -| test.rs:18:16:20:9 | BlockExpr | test.rs:14:9:20:9 | IfExpr | | -| test.rs:19:13:19:17 | false | test.rs:18:16:20:9 | BlockExpr | | +| test.rs:18:16:20:9 | { ... } | test.rs:14:9:20:9 | if ... {...} else {...} | | +| test.rs:19:13:19:17 | false | test.rs:18:16:20:9 | { ... } | | breakTarget continueTarget diff --git a/rust/ql/test/library-tests/controlflow/Cfg.expected b/rust/ql/test/library-tests/controlflow/Cfg.expected index 93022fe371d4..5137e2f8b89c 100644 --- a/rust/ql/test/library-tests/controlflow/Cfg.expected +++ b/rust/ql/test/library-tests/controlflow/Cfg.expected @@ -1,479 +1,479 @@ edges -| test.rs:5:5:8:5 | enter function_call | test.rs:6:9:6:64 | ExprStmt | | -| test.rs:5:5:8:5 | exit function_call (normal) | test.rs:5:5:8:5 | exit function_call | | -| test.rs:5:24:8:5 | BlockExpr | test.rs:5:5:8:5 | exit function_call (normal) | | -| test.rs:6:9:6:44 | logical_operators::test_and_operator | test.rs:6:46:6:49 | true | | -| test.rs:6:9:6:63 | CallExpr | test.rs:7:9:7:22 | ExprStmt | | -| test.rs:6:9:6:64 | ExprStmt | test.rs:6:9:6:44 | logical_operators::test_and_operator | | +| test.rs:5:5:8:5 | enter fn function_call | test.rs:6:9:6:64 | ExprStmt | | +| test.rs:5:5:8:5 | exit fn function_call (normal) | test.rs:5:5:8:5 | exit fn function_call | | +| test.rs:5:24:8:5 | { ... } | test.rs:5:5:8:5 | exit fn function_call (normal) | | +| test.rs:6:9:6:44 | ...::test_and_operator | test.rs:6:46:6:49 | true | | +| test.rs:6:9:6:63 | ...::test_and_operator(...) | test.rs:7:9:7:22 | ExprStmt | | +| test.rs:6:9:6:64 | ExprStmt | test.rs:6:9:6:44 | ...::test_and_operator | | | test.rs:6:46:6:49 | true | test.rs:6:52:6:56 | false | | | test.rs:6:52:6:56 | false | test.rs:6:59:6:62 | true | | -| test.rs:6:59:6:62 | true | test.rs:6:9:6:63 | CallExpr | | -| test.rs:7:9:7:19 | method_call | test.rs:7:9:7:21 | CallExpr | | -| test.rs:7:9:7:21 | CallExpr | test.rs:5:24:8:5 | BlockExpr | | +| test.rs:6:59:6:62 | true | test.rs:6:9:6:63 | ...::test_and_operator(...) | | +| test.rs:7:9:7:19 | method_call | test.rs:7:9:7:21 | method_call(...) | | +| test.rs:7:9:7:21 | method_call(...) | test.rs:5:24:8:5 | { ... } | | | test.rs:7:9:7:22 | ExprStmt | test.rs:7:9:7:19 | method_call | | -| test.rs:10:5:13:5 | enter method_call | test.rs:11:9:11:37 | LetStmt | | -| test.rs:10:5:13:5 | exit method_call (normal) | test.rs:10:5:13:5 | exit method_call | | -| test.rs:10:22:13:5 | BlockExpr | test.rs:10:5:13:5 | exit method_call (normal) | | -| test.rs:11:9:11:37 | LetStmt | test.rs:11:23:11:34 | HashMap::new | | +| test.rs:10:5:13:5 | enter fn method_call | test.rs:11:9:11:37 | let ... = ... | | +| test.rs:10:5:13:5 | exit fn method_call (normal) | test.rs:10:5:13:5 | exit fn method_call | | +| test.rs:10:22:13:5 | { ... } | test.rs:10:5:13:5 | exit fn method_call (normal) | | +| test.rs:11:9:11:37 | let ... = ... | test.rs:11:23:11:34 | ...::new | | | test.rs:11:13:11:19 | map | test.rs:12:9:12:28 | ExprStmt | match | -| test.rs:11:23:11:34 | HashMap::new | test.rs:11:23:11:36 | CallExpr | | -| test.rs:11:23:11:36 | CallExpr | test.rs:11:13:11:19 | map | | +| test.rs:11:23:11:34 | ...::new | test.rs:11:23:11:36 | ...::new(...) | | +| test.rs:11:23:11:36 | ...::new(...) | test.rs:11:13:11:19 | map | | | test.rs:12:9:12:11 | map | test.rs:12:20:12:21 | 37 | | -| test.rs:12:9:12:27 | ... .insert(...) | test.rs:10:22:13:5 | BlockExpr | | +| test.rs:12:9:12:27 | ... .insert(...) | test.rs:10:22:13:5 | { ... } | | | test.rs:12:9:12:28 | ExprStmt | test.rs:12:9:12:11 | map | | | test.rs:12:20:12:21 | 37 | test.rs:12:24:12:26 | "a" | | | test.rs:12:24:12:26 | "a" | test.rs:12:9:12:27 | ... .insert(...) | | -| test.rs:18:5:24:5 | enter next | test.rs:18:13:18:13 | n | | -| test.rs:18:5:24:5 | exit next (normal) | test.rs:18:5:24:5 | exit next | | -| test.rs:18:13:18:13 | n | test.rs:18:13:18:18 | Param | match | -| test.rs:18:13:18:18 | Param | test.rs:19:12:19:12 | n | | -| test.rs:18:28:24:5 | BlockExpr | test.rs:18:5:24:5 | exit next (normal) | | -| test.rs:19:9:23:9 | IfExpr | test.rs:18:28:24:5 | BlockExpr | | +| test.rs:18:5:24:5 | enter fn next | test.rs:18:13:18:13 | n | | +| test.rs:18:5:24:5 | exit fn next (normal) | test.rs:18:5:24:5 | exit fn next | | +| test.rs:18:13:18:13 | n | test.rs:18:13:18:18 | ...: i64 | match | +| test.rs:18:13:18:18 | ...: i64 | test.rs:19:12:19:12 | n | | +| test.rs:18:28:24:5 | { ... } | test.rs:18:5:24:5 | exit fn next (normal) | | +| test.rs:19:9:23:9 | if ... {...} else {...} | test.rs:18:28:24:5 | { ... } | | | test.rs:19:12:19:12 | n | test.rs:19:16:19:16 | 2 | | | test.rs:19:12:19:16 | ... % ... | test.rs:19:21:19:21 | 0 | | | test.rs:19:12:19:21 | ... == ... | test.rs:20:13:20:13 | n | true | | test.rs:19:12:19:21 | ... == ... | test.rs:22:13:22:13 | 3 | false | | test.rs:19:16:19:16 | 2 | test.rs:19:12:19:16 | ... % ... | | | test.rs:19:21:19:21 | 0 | test.rs:19:12:19:21 | ... == ... | | -| test.rs:19:23:21:9 | BlockExpr | test.rs:19:9:23:9 | IfExpr | | +| test.rs:19:23:21:9 | { ... } | test.rs:19:9:23:9 | if ... {...} else {...} | | | test.rs:20:13:20:13 | n | test.rs:20:17:20:17 | 2 | | -| test.rs:20:13:20:17 | ... / ... | test.rs:19:23:21:9 | BlockExpr | | +| test.rs:20:13:20:17 | ... / ... | test.rs:19:23:21:9 | { ... } | | | test.rs:20:17:20:17 | 2 | test.rs:20:13:20:17 | ... / ... | | -| test.rs:21:16:23:9 | BlockExpr | test.rs:19:9:23:9 | IfExpr | | +| test.rs:21:16:23:9 | { ... } | test.rs:19:9:23:9 | if ... {...} else {...} | | | test.rs:22:13:22:13 | 3 | test.rs:22:17:22:17 | n | | | test.rs:22:13:22:17 | ... * ... | test.rs:22:21:22:21 | 1 | | -| test.rs:22:13:22:21 | ... + ... | test.rs:21:16:23:9 | BlockExpr | | +| test.rs:22:13:22:21 | ... + ... | test.rs:21:16:23:9 | { ... } | | | test.rs:22:17:22:17 | n | test.rs:22:13:22:17 | ... * ... | | | test.rs:22:21:22:21 | 1 | test.rs:22:13:22:21 | ... + ... | | -| test.rs:26:5:42:5 | enter test_break_and_continue | test.rs:26:32:26:32 | n | | -| test.rs:26:5:42:5 | exit test_break_and_continue (normal) | test.rs:26:5:42:5 | exit test_break_and_continue | | -| test.rs:26:32:26:32 | n | test.rs:26:32:26:37 | Param | match | -| test.rs:26:32:26:37 | Param | test.rs:27:9:27:22 | LetStmt | | -| test.rs:27:9:27:22 | LetStmt | test.rs:27:21:27:21 | n | | +| test.rs:26:5:42:5 | enter fn test_break_and_continue | test.rs:26:32:26:32 | n | | +| test.rs:26:5:42:5 | exit fn test_break_and_continue (normal) | test.rs:26:5:42:5 | exit fn test_break_and_continue | | +| test.rs:26:32:26:32 | n | test.rs:26:32:26:37 | ...: i64 | match | +| test.rs:26:32:26:37 | ...: i64 | test.rs:27:9:27:22 | let ... = n | | +| test.rs:27:9:27:22 | let ... = n | test.rs:27:21:27:21 | n | | | test.rs:27:13:27:17 | i | test.rs:28:9:40:9 | ExprStmt | match | | test.rs:27:21:27:21 | n | test.rs:27:13:27:17 | i | | | test.rs:28:9:40:9 | ExprStmt | test.rs:29:13:29:24 | ExprStmt | | -| test.rs:28:9:40:9 | LoopExpr | test.rs:41:9:41:20 | ExprStmt | | -| test.rs:28:14:40:9 | BlockExpr | test.rs:29:13:29:24 | ExprStmt | | +| test.rs:28:9:40:9 | loop { ... } | test.rs:41:9:41:20 | ExprStmt | | +| test.rs:28:14:40:9 | { ... } | test.rs:29:13:29:24 | ExprStmt | | | test.rs:29:13:29:13 | i | test.rs:29:17:29:20 | next | | | test.rs:29:13:29:23 | ... = ... | test.rs:30:13:32:13 | ExprStmt | | | test.rs:29:13:29:24 | ExprStmt | test.rs:29:13:29:13 | i | | | test.rs:29:17:29:20 | next | test.rs:29:22:29:22 | i | | -| test.rs:29:17:29:23 | CallExpr | test.rs:29:13:29:23 | ... = ... | | -| test.rs:29:22:29:22 | i | test.rs:29:17:29:23 | CallExpr | | +| test.rs:29:17:29:23 | next(...) | test.rs:29:13:29:23 | ... = ... | | +| test.rs:29:22:29:22 | i | test.rs:29:17:29:23 | next(...) | | | test.rs:30:13:32:13 | ExprStmt | test.rs:30:16:30:16 | i | | -| test.rs:30:13:32:13 | IfExpr | test.rs:33:13:35:13 | ExprStmt | | +| test.rs:30:13:32:13 | if ... {...} | test.rs:33:13:35:13 | ExprStmt | | | test.rs:30:16:30:16 | i | test.rs:30:20:30:24 | 10000 | | -| test.rs:30:16:30:24 | ... > ... | test.rs:30:13:32:13 | IfExpr | false | +| test.rs:30:16:30:24 | ... > ... | test.rs:30:13:32:13 | if ... {...} | false | | test.rs:30:16:30:24 | ... > ... | test.rs:31:17:31:29 | ExprStmt | true | | test.rs:30:20:30:24 | 10000 | test.rs:30:16:30:24 | ... > ... | | -| test.rs:31:17:31:28 | ReturnExpr | test.rs:26:5:42:5 | exit test_break_and_continue (normal) | return | +| test.rs:31:17:31:28 | return false | test.rs:26:5:42:5 | exit fn test_break_and_continue (normal) | return | | test.rs:31:17:31:29 | ExprStmt | test.rs:31:24:31:28 | false | | -| test.rs:31:24:31:28 | false | test.rs:31:17:31:28 | ReturnExpr | | +| test.rs:31:24:31:28 | false | test.rs:31:17:31:28 | return false | | | test.rs:33:13:35:13 | ExprStmt | test.rs:33:16:33:16 | i | | -| test.rs:33:13:35:13 | IfExpr | test.rs:36:13:38:13 | ExprStmt | | +| test.rs:33:13:35:13 | if ... {...} | test.rs:36:13:38:13 | ExprStmt | | | test.rs:33:16:33:16 | i | test.rs:33:21:33:21 | 1 | | -| test.rs:33:16:33:21 | ... == ... | test.rs:33:13:35:13 | IfExpr | false | +| test.rs:33:16:33:21 | ... == ... | test.rs:33:13:35:13 | if ... {...} | false | | test.rs:33:16:33:21 | ... == ... | test.rs:34:17:34:22 | ExprStmt | true | | test.rs:33:21:33:21 | 1 | test.rs:33:16:33:21 | ... == ... | | -| test.rs:34:17:34:21 | BreakExpr | test.rs:28:9:40:9 | LoopExpr | break | -| test.rs:34:17:34:22 | ExprStmt | test.rs:34:17:34:21 | BreakExpr | | +| test.rs:34:17:34:21 | break | test.rs:28:9:40:9 | loop { ... } | break | +| test.rs:34:17:34:22 | ExprStmt | test.rs:34:17:34:21 | break | | | test.rs:36:13:38:13 | ExprStmt | test.rs:36:16:36:16 | i | | -| test.rs:36:13:38:13 | IfExpr | test.rs:39:13:39:13 | i | | +| test.rs:36:13:38:13 | if ... {...} | test.rs:39:13:39:13 | i | | | test.rs:36:16:36:16 | i | test.rs:36:20:36:20 | 2 | | | test.rs:36:16:36:20 | ... % ... | test.rs:36:25:36:25 | 0 | | -| test.rs:36:16:36:25 | ... != ... | test.rs:36:13:38:13 | IfExpr | false | +| test.rs:36:16:36:25 | ... != ... | test.rs:36:13:38:13 | if ... {...} | false | | test.rs:36:16:36:25 | ... != ... | test.rs:37:17:37:25 | ExprStmt | true | | test.rs:36:20:36:20 | 2 | test.rs:36:16:36:20 | ... % ... | | | test.rs:36:25:36:25 | 0 | test.rs:36:16:36:25 | ... != ... | | -| test.rs:37:17:37:24 | ContinueExpr | test.rs:29:13:29:24 | ExprStmt | continue | -| test.rs:37:17:37:25 | ExprStmt | test.rs:37:17:37:24 | ContinueExpr | | +| test.rs:37:17:37:24 | continue | test.rs:29:13:29:24 | ExprStmt | continue | +| test.rs:37:17:37:25 | ExprStmt | test.rs:37:17:37:24 | continue | | | test.rs:39:13:39:13 | i | test.rs:39:17:39:17 | i | | -| test.rs:39:13:39:21 | ... = ... | test.rs:28:14:40:9 | BlockExpr | | +| test.rs:39:13:39:21 | ... = ... | test.rs:28:14:40:9 | { ... } | | | test.rs:39:17:39:17 | i | test.rs:39:21:39:21 | 2 | | | test.rs:39:17:39:21 | ... / ... | test.rs:39:13:39:21 | ... = ... | | | test.rs:39:21:39:21 | 2 | test.rs:39:17:39:21 | ... / ... | | -| test.rs:41:9:41:19 | ReturnExpr | test.rs:26:5:42:5 | exit test_break_and_continue (normal) | return | +| test.rs:41:9:41:19 | return true | test.rs:26:5:42:5 | exit fn test_break_and_continue (normal) | return | | test.rs:41:9:41:20 | ExprStmt | test.rs:41:16:41:19 | true | | -| test.rs:41:16:41:19 | true | test.rs:41:9:41:19 | ReturnExpr | | -| test.rs:44:5:56:5 | enter test_break_with_labels | test.rs:44:31:44:31 | b | | -| test.rs:44:5:56:5 | exit test_break_with_labels (normal) | test.rs:44:5:56:5 | exit test_break_with_labels | | -| test.rs:44:31:44:31 | b | test.rs:44:31:44:37 | Param | match | -| test.rs:44:31:44:37 | Param | test.rs:45:9:54:9 | ExprStmt | | -| test.rs:44:48:56:5 | BlockExpr | test.rs:44:5:56:5 | exit test_break_with_labels (normal) | | +| test.rs:41:16:41:19 | true | test.rs:41:9:41:19 | return true | | +| test.rs:44:5:56:5 | enter fn test_break_with_labels | test.rs:44:31:44:31 | b | | +| test.rs:44:5:56:5 | exit fn test_break_with_labels (normal) | test.rs:44:5:56:5 | exit fn test_break_with_labels | | +| test.rs:44:31:44:31 | b | test.rs:44:31:44:37 | ...: bool | match | +| test.rs:44:31:44:37 | ...: bool | test.rs:45:9:54:9 | ExprStmt | | +| test.rs:44:48:56:5 | { ... } | test.rs:44:5:56:5 | exit fn test_break_with_labels (normal) | | +| test.rs:45:9:54:9 | 'outer: loop { ... } | test.rs:55:9:55:12 | true | | | test.rs:45:9:54:9 | ExprStmt | test.rs:47:17:51:17 | ExprStmt | | -| test.rs:45:9:54:9 | LoopExpr | test.rs:55:9:55:12 | true | | -| test.rs:45:22:54:9 | BlockExpr | test.rs:47:17:51:17 | ExprStmt | | -| test.rs:46:13:53:13 | LoopExpr | test.rs:45:22:54:9 | BlockExpr | | +| test.rs:45:22:54:9 | { ... } | test.rs:47:17:51:17 | ExprStmt | | +| test.rs:46:13:53:13 | 'inner: loop { ... } | test.rs:45:22:54:9 | { ... } | | | test.rs:47:17:51:17 | ExprStmt | test.rs:47:20:47:20 | b | | -| test.rs:47:17:51:17 | IfExpr | test.rs:52:17:52:29 | ExprStmt | | +| test.rs:47:17:51:17 | if b {...} else {...} | test.rs:52:17:52:29 | ExprStmt | | | test.rs:47:20:47:20 | b | test.rs:48:21:48:26 | ExprStmt | true | | test.rs:47:20:47:20 | b | test.rs:49:27:49:27 | b | false | -| test.rs:48:21:48:25 | BreakExpr | test.rs:46:13:53:13 | LoopExpr | break | -| test.rs:48:21:48:26 | ExprStmt | test.rs:48:21:48:25 | BreakExpr | | -| test.rs:49:24:51:17 | IfExpr | test.rs:47:17:51:17 | IfExpr | | -| test.rs:49:27:49:27 | b | test.rs:49:24:51:17 | IfExpr | false | +| test.rs:48:21:48:25 | break | test.rs:46:13:53:13 | 'inner: loop { ... } | break | +| test.rs:48:21:48:26 | ExprStmt | test.rs:48:21:48:25 | break | | +| test.rs:49:24:51:17 | if b {...} | test.rs:47:17:51:17 | if b {...} else {...} | | +| test.rs:49:27:49:27 | b | test.rs:49:24:51:17 | if b {...} | false | | test.rs:49:27:49:27 | b | test.rs:50:21:50:33 | ExprStmt | true | -| test.rs:50:21:50:32 | BreakExpr | test.rs:45:9:54:9 | LoopExpr | break | -| test.rs:50:21:50:33 | ExprStmt | test.rs:50:21:50:32 | BreakExpr | | -| test.rs:52:17:52:28 | BreakExpr | test.rs:46:13:53:13 | LoopExpr | break | -| test.rs:52:17:52:29 | ExprStmt | test.rs:52:17:52:28 | BreakExpr | | -| test.rs:55:9:55:12 | true | test.rs:44:48:56:5 | BlockExpr | | -| test.rs:58:5:70:5 | enter test_continue_with_labels | test.rs:58:34:58:34 | b | | -| test.rs:58:34:58:34 | b | test.rs:58:34:58:40 | Param | match | -| test.rs:58:34:58:40 | Param | test.rs:60:13:60:14 | ExprStmt | | +| test.rs:50:21:50:32 | break ''outer | test.rs:45:9:54:9 | 'outer: loop { ... } | break | +| test.rs:50:21:50:33 | ExprStmt | test.rs:50:21:50:32 | break ''outer | | +| test.rs:52:17:52:28 | break ''inner | test.rs:46:13:53:13 | 'inner: loop { ... } | break | +| test.rs:52:17:52:29 | ExprStmt | test.rs:52:17:52:28 | break ''inner | | +| test.rs:55:9:55:12 | true | test.rs:44:48:56:5 | { ... } | | +| test.rs:58:5:70:5 | enter fn test_continue_with_labels | test.rs:58:34:58:34 | b | | +| test.rs:58:34:58:34 | b | test.rs:58:34:58:40 | ...: bool | match | +| test.rs:58:34:58:40 | ...: bool | test.rs:60:13:60:14 | ExprStmt | | | test.rs:60:13:60:13 | 1 | test.rs:62:17:66:17 | ExprStmt | | | test.rs:60:13:60:14 | ExprStmt | test.rs:60:13:60:13 | 1 | | | test.rs:62:17:66:17 | ExprStmt | test.rs:62:20:62:20 | b | | -| test.rs:62:17:66:17 | IfExpr | test.rs:67:17:67:32 | ExprStmt | | +| test.rs:62:17:66:17 | if b {...} else {...} | test.rs:67:17:67:32 | ExprStmt | | | test.rs:62:20:62:20 | b | test.rs:63:21:63:29 | ExprStmt | true | | test.rs:62:20:62:20 | b | test.rs:64:27:64:27 | b | false | -| test.rs:63:21:63:28 | ContinueExpr | test.rs:62:17:66:17 | ExprStmt | continue | -| test.rs:63:21:63:29 | ExprStmt | test.rs:63:21:63:28 | ContinueExpr | | -| test.rs:64:24:66:17 | IfExpr | test.rs:62:17:66:17 | IfExpr | | -| test.rs:64:27:64:27 | b | test.rs:64:24:66:17 | IfExpr | false | +| test.rs:63:21:63:28 | continue | test.rs:62:17:66:17 | ExprStmt | continue | +| test.rs:63:21:63:29 | ExprStmt | test.rs:63:21:63:28 | continue | | +| test.rs:64:24:66:17 | if b {...} | test.rs:62:17:66:17 | if b {...} else {...} | | +| test.rs:64:27:64:27 | b | test.rs:64:24:66:17 | if b {...} | false | | test.rs:64:27:64:27 | b | test.rs:65:21:65:36 | ExprStmt | true | -| test.rs:65:21:65:35 | ContinueExpr | test.rs:60:13:60:14 | ExprStmt | continue | -| test.rs:65:21:65:36 | ExprStmt | test.rs:65:21:65:35 | ContinueExpr | | -| test.rs:67:17:67:31 | ContinueExpr | test.rs:62:17:66:17 | ExprStmt | continue | -| test.rs:67:17:67:32 | ExprStmt | test.rs:67:17:67:31 | ContinueExpr | | -| test.rs:72:5:84:5 | enter test_loop_label_shadowing | test.rs:72:34:72:34 | b | | -| test.rs:72:34:72:34 | b | test.rs:72:34:72:40 | Param | match | -| test.rs:72:34:72:40 | Param | test.rs:74:13:74:14 | ExprStmt | | +| test.rs:65:21:65:35 | continue 'outer | test.rs:60:13:60:14 | ExprStmt | continue | +| test.rs:65:21:65:36 | ExprStmt | test.rs:65:21:65:35 | continue 'outer | | +| test.rs:67:17:67:31 | continue 'inner | test.rs:62:17:66:17 | ExprStmt | continue | +| test.rs:67:17:67:32 | ExprStmt | test.rs:67:17:67:31 | continue 'inner | | +| test.rs:72:5:84:5 | enter fn test_loop_label_shadowing | test.rs:72:34:72:34 | b | | +| test.rs:72:34:72:34 | b | test.rs:72:34:72:40 | ...: bool | match | +| test.rs:72:34:72:40 | ...: bool | test.rs:74:13:74:14 | ExprStmt | | | test.rs:74:13:74:13 | 1 | test.rs:76:17:80:17 | ExprStmt | | | test.rs:74:13:74:14 | ExprStmt | test.rs:74:13:74:13 | 1 | | | test.rs:76:17:80:17 | ExprStmt | test.rs:76:20:76:20 | b | | -| test.rs:76:17:80:17 | IfExpr | test.rs:81:17:81:32 | ExprStmt | | +| test.rs:76:17:80:17 | if b {...} else {...} | test.rs:81:17:81:32 | ExprStmt | | | test.rs:76:20:76:20 | b | test.rs:77:21:77:29 | ExprStmt | true | | test.rs:76:20:76:20 | b | test.rs:78:27:78:27 | b | false | -| test.rs:77:21:77:28 | ContinueExpr | test.rs:76:17:80:17 | ExprStmt | continue | -| test.rs:77:21:77:29 | ExprStmt | test.rs:77:21:77:28 | ContinueExpr | | -| test.rs:78:24:80:17 | IfExpr | test.rs:76:17:80:17 | IfExpr | | -| test.rs:78:27:78:27 | b | test.rs:78:24:80:17 | IfExpr | false | +| test.rs:77:21:77:28 | continue | test.rs:76:17:80:17 | ExprStmt | continue | +| test.rs:77:21:77:29 | ExprStmt | test.rs:77:21:77:28 | continue | | +| test.rs:78:24:80:17 | if b {...} | test.rs:76:17:80:17 | if b {...} else {...} | | +| test.rs:78:27:78:27 | b | test.rs:78:24:80:17 | if b {...} | false | | test.rs:78:27:78:27 | b | test.rs:79:21:79:36 | ExprStmt | true | -| test.rs:79:21:79:35 | ContinueExpr | test.rs:76:17:80:17 | ExprStmt | continue | -| test.rs:79:21:79:36 | ExprStmt | test.rs:79:21:79:35 | ContinueExpr | | -| test.rs:81:17:81:31 | ContinueExpr | test.rs:76:17:80:17 | ExprStmt | continue | -| test.rs:81:17:81:32 | ExprStmt | test.rs:81:17:81:31 | ContinueExpr | | -| test.rs:86:5:95:5 | enter test_while | test.rs:86:19:86:19 | i | | -| test.rs:86:5:95:5 | exit test_while (normal) | test.rs:86:5:95:5 | exit test_while | | -| test.rs:86:19:86:19 | i | test.rs:86:19:86:24 | Param | match | -| test.rs:86:19:86:24 | Param | test.rs:87:9:87:25 | LetStmt | | -| test.rs:86:27:95:5 | BlockExpr | test.rs:86:5:95:5 | exit test_while (normal) | | -| test.rs:87:9:87:25 | LetStmt | test.rs:87:21:87:24 | true | | +| test.rs:79:21:79:35 | continue 'label | test.rs:76:17:80:17 | ExprStmt | continue | +| test.rs:79:21:79:36 | ExprStmt | test.rs:79:21:79:35 | continue 'label | | +| test.rs:81:17:81:31 | continue 'label | test.rs:76:17:80:17 | ExprStmt | continue | +| test.rs:81:17:81:32 | ExprStmt | test.rs:81:17:81:31 | continue 'label | | +| test.rs:86:5:95:5 | enter fn test_while | test.rs:86:19:86:19 | i | | +| test.rs:86:5:95:5 | exit fn test_while (normal) | test.rs:86:5:95:5 | exit fn test_while | | +| test.rs:86:19:86:19 | i | test.rs:86:19:86:24 | ...: i64 | match | +| test.rs:86:19:86:24 | ...: i64 | test.rs:87:9:87:25 | let ... = true | | +| test.rs:86:27:95:5 | { ... } | test.rs:86:5:95:5 | exit fn test_while (normal) | | +| test.rs:87:9:87:25 | let ... = true | test.rs:87:21:87:24 | true | | | test.rs:87:13:87:17 | b | test.rs:88:15:88:15 | b | match | | test.rs:87:21:87:24 | true | test.rs:87:13:87:17 | b | | -| test.rs:88:9:94:9 | WhileExpr | test.rs:86:27:95:5 | BlockExpr | | -| test.rs:88:15:88:15 | b | test.rs:88:9:94:9 | WhileExpr | false | +| test.rs:88:9:94:9 | while b { ... } | test.rs:86:27:95:5 | { ... } | | +| test.rs:88:15:88:15 | b | test.rs:88:9:94:9 | while b { ... } | false | | test.rs:88:15:88:15 | b | test.rs:89:13:89:14 | ExprStmt | true | -| test.rs:88:17:94:9 | BlockExpr | test.rs:88:15:88:15 | b | | +| test.rs:88:17:94:9 | { ... } | test.rs:88:15:88:15 | b | | | test.rs:89:13:89:13 | 1 | test.rs:90:13:92:13 | ExprStmt | | | test.rs:89:13:89:14 | ExprStmt | test.rs:89:13:89:13 | 1 | | | test.rs:90:13:92:13 | ExprStmt | test.rs:90:17:90:17 | i | | -| test.rs:90:13:92:13 | IfExpr | test.rs:93:13:93:22 | ExprStmt | | +| test.rs:90:13:92:13 | if ... {...} | test.rs:93:13:93:22 | ExprStmt | | | test.rs:90:17:90:17 | i | test.rs:90:21:90:21 | 0 | | -| test.rs:90:17:90:21 | ... > ... | test.rs:90:13:92:13 | IfExpr | false | +| test.rs:90:17:90:21 | ... > ... | test.rs:90:13:92:13 | if ... {...} | false | | test.rs:90:17:90:21 | ... > ... | test.rs:91:17:91:22 | ExprStmt | true | | test.rs:90:21:90:21 | 0 | test.rs:90:17:90:21 | ... > ... | | -| test.rs:91:17:91:21 | BreakExpr | test.rs:88:9:94:9 | WhileExpr | break | -| test.rs:91:17:91:22 | ExprStmt | test.rs:91:17:91:21 | BreakExpr | | +| test.rs:91:17:91:21 | break | test.rs:88:9:94:9 | while b { ... } | break | +| test.rs:91:17:91:22 | ExprStmt | test.rs:91:17:91:21 | break | | | test.rs:93:13:93:13 | b | test.rs:93:17:93:21 | false | | -| test.rs:93:13:93:21 | ... = ... | test.rs:88:17:94:9 | BlockExpr | | +| test.rs:93:13:93:21 | ... = ... | test.rs:88:17:94:9 | { ... } | | | test.rs:93:13:93:22 | ExprStmt | test.rs:93:13:93:13 | b | | | test.rs:93:17:93:21 | false | test.rs:93:13:93:21 | ... = ... | | -| test.rs:97:5:104:5 | enter test_while_let | test.rs:98:9:98:29 | LetStmt | | -| test.rs:97:5:104:5 | exit test_while_let (normal) | test.rs:97:5:104:5 | exit test_while_let | | -| test.rs:97:25:104:5 | BlockExpr | test.rs:97:5:104:5 | exit test_while_let (normal) | | -| test.rs:98:9:98:29 | LetStmt | test.rs:98:24:98:24 | 1 | | -| test.rs:98:13:98:20 | iter | test.rs:99:15:99:39 | LetExpr | match | +| test.rs:97:5:104:5 | enter fn test_while_let | test.rs:98:9:98:29 | let ... = ... | | +| test.rs:97:5:104:5 | exit fn test_while_let (normal) | test.rs:97:5:104:5 | exit fn test_while_let | | +| test.rs:97:25:104:5 | { ... } | test.rs:97:5:104:5 | exit fn test_while_let (normal) | | +| test.rs:98:9:98:29 | let ... = ... | test.rs:98:24:98:24 | 1 | | +| test.rs:98:13:98:20 | iter | test.rs:99:15:99:39 | let ... = ... | match | | test.rs:98:24:98:24 | 1 | test.rs:98:27:98:28 | 10 | | -| test.rs:98:24:98:28 | RangeExpr | test.rs:98:13:98:20 | iter | | -| test.rs:98:27:98:28 | 10 | test.rs:98:24:98:28 | RangeExpr | | -| test.rs:99:9:103:9 | WhileExpr | test.rs:97:25:104:5 | BlockExpr | | -| test.rs:99:15:99:39 | LetExpr | test.rs:99:29:99:32 | iter | | -| test.rs:99:19:99:25 | TupleStructPat | test.rs:99:9:103:9 | WhileExpr | no-match | +| test.rs:98:24:98:28 | 1..10 | test.rs:98:13:98:20 | iter | | +| test.rs:98:27:98:28 | 10 | test.rs:98:24:98:28 | 1..10 | | +| test.rs:99:9:103:9 | while ... { ... } | test.rs:97:25:104:5 | { ... } | | +| test.rs:99:15:99:39 | let ... = ... | test.rs:99:29:99:32 | iter | | +| test.rs:99:19:99:25 | TupleStructPat | test.rs:99:9:103:9 | while ... { ... } | no-match | | test.rs:99:19:99:25 | TupleStructPat | test.rs:99:24:99:24 | x | match | | test.rs:99:24:99:24 | x | test.rs:100:17:100:17 | x | match | | test.rs:99:29:99:32 | iter | test.rs:99:29:99:39 | ... .next(...) | | | test.rs:99:29:99:39 | ... .next(...) | test.rs:99:19:99:25 | TupleStructPat | | -| test.rs:99:41:103:9 | BlockExpr | test.rs:99:15:99:39 | LetExpr | | -| test.rs:100:13:102:13 | IfExpr | test.rs:99:41:103:9 | BlockExpr | | +| test.rs:99:41:103:9 | { ... } | test.rs:99:15:99:39 | let ... = ... | | +| test.rs:100:13:102:13 | if ... {...} | test.rs:99:41:103:9 | { ... } | | | test.rs:100:17:100:17 | x | test.rs:100:22:100:22 | 5 | | -| test.rs:100:17:100:22 | ... == ... | test.rs:100:13:102:13 | IfExpr | false | +| test.rs:100:17:100:22 | ... == ... | test.rs:100:13:102:13 | if ... {...} | false | | test.rs:100:17:100:22 | ... == ... | test.rs:101:17:101:22 | ExprStmt | true | | test.rs:100:22:100:22 | 5 | test.rs:100:17:100:22 | ... == ... | | -| test.rs:101:17:101:21 | BreakExpr | test.rs:99:9:103:9 | WhileExpr | break | -| test.rs:101:17:101:22 | ExprStmt | test.rs:101:17:101:21 | BreakExpr | | -| test.rs:106:5:113:5 | enter test_for | test.rs:106:17:106:17 | j | | -| test.rs:106:5:113:5 | exit test_for (normal) | test.rs:106:5:113:5 | exit test_for | | -| test.rs:106:17:106:17 | j | test.rs:106:17:106:22 | Param | match | -| test.rs:106:17:106:22 | Param | test.rs:107:18:107:18 | 0 | | -| test.rs:106:25:113:5 | BlockExpr | test.rs:106:5:113:5 | exit test_for (normal) | | -| test.rs:107:9:112:9 | ForExpr | test.rs:106:25:113:5 | BlockExpr | | -| test.rs:107:13:107:13 | i | test.rs:107:9:112:9 | ForExpr | no-match | +| test.rs:101:17:101:21 | break | test.rs:99:9:103:9 | while ... { ... } | break | +| test.rs:101:17:101:22 | ExprStmt | test.rs:101:17:101:21 | break | | +| test.rs:106:5:113:5 | enter fn test_for | test.rs:106:17:106:17 | j | | +| test.rs:106:5:113:5 | exit fn test_for (normal) | test.rs:106:5:113:5 | exit fn test_for | | +| test.rs:106:17:106:17 | j | test.rs:106:17:106:22 | ...: i64 | match | +| test.rs:106:17:106:22 | ...: i64 | test.rs:107:18:107:18 | 0 | | +| test.rs:106:25:113:5 | { ... } | test.rs:106:5:113:5 | exit fn test_for (normal) | | +| test.rs:107:9:112:9 | for ... in ... { ... } | test.rs:106:25:113:5 | { ... } | | +| test.rs:107:13:107:13 | i | test.rs:107:9:112:9 | for ... in ... { ... } | no-match | | test.rs:107:13:107:13 | i | test.rs:108:13:110:13 | ExprStmt | match | | test.rs:107:18:107:18 | 0 | test.rs:107:21:107:22 | 10 | | -| test.rs:107:18:107:22 | RangeExpr | test.rs:107:13:107:13 | i | | -| test.rs:107:21:107:22 | 10 | test.rs:107:18:107:22 | RangeExpr | | -| test.rs:107:24:112:9 | BlockExpr | test.rs:107:13:107:13 | i | | +| test.rs:107:18:107:22 | 0..10 | test.rs:107:13:107:13 | i | | +| test.rs:107:21:107:22 | 10 | test.rs:107:18:107:22 | 0..10 | | +| test.rs:107:24:112:9 | { ... } | test.rs:107:13:107:13 | i | | | test.rs:108:13:110:13 | ExprStmt | test.rs:108:17:108:17 | i | | -| test.rs:108:13:110:13 | IfExpr | test.rs:111:13:111:14 | ExprStmt | | +| test.rs:108:13:110:13 | if ... {...} | test.rs:111:13:111:14 | ExprStmt | | | test.rs:108:17:108:17 | i | test.rs:108:22:108:22 | j | | -| test.rs:108:17:108:22 | ... == ... | test.rs:108:13:110:13 | IfExpr | false | +| test.rs:108:17:108:22 | ... == ... | test.rs:108:13:110:13 | if ... {...} | false | | test.rs:108:17:108:22 | ... == ... | test.rs:109:17:109:22 | ExprStmt | true | | test.rs:108:22:108:22 | j | test.rs:108:17:108:22 | ... == ... | | -| test.rs:109:17:109:21 | BreakExpr | test.rs:107:9:112:9 | ForExpr | break | -| test.rs:109:17:109:22 | ExprStmt | test.rs:109:17:109:21 | BreakExpr | | -| test.rs:111:13:111:13 | 1 | test.rs:107:24:112:9 | BlockExpr | | +| test.rs:109:17:109:21 | break | test.rs:107:9:112:9 | for ... in ... { ... } | break | +| test.rs:109:17:109:22 | ExprStmt | test.rs:109:17:109:21 | break | | +| test.rs:111:13:111:13 | 1 | test.rs:107:24:112:9 | { ... } | | | test.rs:111:13:111:14 | ExprStmt | test.rs:111:13:111:13 | 1 | | -| test.rs:115:5:119:5 | enter break_with_return | test.rs:117:13:117:27 | ExprStmt | | -| test.rs:115:5:119:5 | exit break_with_return (normal) | test.rs:115:5:119:5 | exit break_with_return | | +| test.rs:115:5:119:5 | enter fn break_with_return | test.rs:117:13:117:27 | ExprStmt | | +| test.rs:115:5:119:5 | exit fn break_with_return (normal) | test.rs:115:5:119:5 | exit fn break_with_return | | | test.rs:117:13:117:27 | ExprStmt | test.rs:117:26:117:26 | 1 | | -| test.rs:117:19:117:26 | ReturnExpr | test.rs:115:5:119:5 | exit break_with_return (normal) | return | -| test.rs:117:26:117:26 | 1 | test.rs:117:19:117:26 | ReturnExpr | | -| test.rs:122:1:125:1 | enter test_nested_function | test.rs:122:25:122:25 | n | | -| test.rs:122:1:125:1 | exit test_nested_function (normal) | test.rs:122:1:125:1 | exit test_nested_function | | -| test.rs:122:25:122:25 | n | test.rs:122:25:122:30 | Param | match | -| test.rs:122:25:122:30 | Param | test.rs:123:5:123:28 | LetStmt | | -| test.rs:122:40:125:1 | BlockExpr | test.rs:122:1:125:1 | exit test_nested_function (normal) | | -| test.rs:123:5:123:28 | LetStmt | test.rs:123:19:123:27 | ClosureExpr | | +| test.rs:117:19:117:26 | return 1 | test.rs:115:5:119:5 | exit fn break_with_return (normal) | return | +| test.rs:117:26:117:26 | 1 | test.rs:117:19:117:26 | return 1 | | +| test.rs:122:1:125:1 | enter fn test_nested_function | test.rs:122:25:122:25 | n | | +| test.rs:122:1:125:1 | exit fn test_nested_function (normal) | test.rs:122:1:125:1 | exit fn test_nested_function | | +| test.rs:122:25:122:25 | n | test.rs:122:25:122:30 | ...: i64 | match | +| test.rs:122:25:122:30 | ...: i64 | test.rs:123:5:123:28 | let ... = ... | | +| test.rs:122:40:125:1 | { ... } | test.rs:122:1:125:1 | exit fn test_nested_function (normal) | | +| test.rs:123:5:123:28 | let ... = ... | test.rs:123:19:123:27 | \|...\| ... | | | test.rs:123:9:123:15 | add_one | test.rs:124:5:124:11 | add_one | match | -| test.rs:123:19:123:27 | ClosureExpr | test.rs:123:9:123:15 | add_one | | -| test.rs:123:19:123:27 | enter ClosureExpr | test.rs:123:20:123:20 | i | | -| test.rs:123:19:123:27 | exit ClosureExpr (normal) | test.rs:123:19:123:27 | exit ClosureExpr | | -| test.rs:123:20:123:20 | Param | test.rs:123:23:123:23 | i | | -| test.rs:123:20:123:20 | i | test.rs:123:20:123:20 | Param | match | +| test.rs:123:19:123:27 | \|...\| ... | test.rs:123:9:123:15 | add_one | | +| test.rs:123:19:123:27 | enter \|...\| ... | test.rs:123:20:123:20 | i | | +| test.rs:123:19:123:27 | exit \|...\| ... (normal) | test.rs:123:19:123:27 | exit \|...\| ... | | +| test.rs:123:20:123:20 | ... | test.rs:123:23:123:23 | i | | +| test.rs:123:20:123:20 | i | test.rs:123:20:123:20 | ... | match | | test.rs:123:23:123:23 | i | test.rs:123:27:123:27 | 1 | | -| test.rs:123:23:123:27 | ... + ... | test.rs:123:19:123:27 | exit ClosureExpr (normal) | | +| test.rs:123:23:123:27 | ... + ... | test.rs:123:19:123:27 | exit \|...\| ... (normal) | | | test.rs:123:27:123:27 | 1 | test.rs:123:23:123:27 | ... + ... | | | test.rs:124:5:124:11 | add_one | test.rs:124:13:124:19 | add_one | | -| test.rs:124:5:124:23 | CallExpr | test.rs:122:40:125:1 | BlockExpr | | +| test.rs:124:5:124:23 | add_one(...) | test.rs:122:40:125:1 | { ... } | | | test.rs:124:13:124:19 | add_one | test.rs:124:21:124:21 | n | | -| test.rs:124:13:124:22 | CallExpr | test.rs:124:5:124:23 | CallExpr | | -| test.rs:124:21:124:21 | n | test.rs:124:13:124:22 | CallExpr | | -| test.rs:129:5:135:5 | enter test_if_else | test.rs:129:21:129:21 | n | | -| test.rs:129:5:135:5 | exit test_if_else (normal) | test.rs:129:5:135:5 | exit test_if_else | | -| test.rs:129:21:129:21 | n | test.rs:129:21:129:26 | Param | match | -| test.rs:129:21:129:26 | Param | test.rs:130:12:130:12 | n | | -| test.rs:129:36:135:5 | BlockExpr | test.rs:129:5:135:5 | exit test_if_else (normal) | | -| test.rs:130:9:134:9 | IfExpr | test.rs:129:36:135:5 | BlockExpr | | +| test.rs:124:13:124:22 | add_one(...) | test.rs:124:5:124:23 | add_one(...) | | +| test.rs:124:21:124:21 | n | test.rs:124:13:124:22 | add_one(...) | | +| test.rs:129:5:135:5 | enter fn test_if_else | test.rs:129:21:129:21 | n | | +| test.rs:129:5:135:5 | exit fn test_if_else (normal) | test.rs:129:5:135:5 | exit fn test_if_else | | +| test.rs:129:21:129:21 | n | test.rs:129:21:129:26 | ...: i64 | match | +| test.rs:129:21:129:26 | ...: i64 | test.rs:130:12:130:12 | n | | +| test.rs:129:36:135:5 | { ... } | test.rs:129:5:135:5 | exit fn test_if_else (normal) | | +| test.rs:130:9:134:9 | if ... {...} else {...} | test.rs:129:36:135:5 | { ... } | | | test.rs:130:12:130:12 | n | test.rs:130:17:130:17 | 0 | | | test.rs:130:12:130:17 | ... <= ... | test.rs:131:13:131:13 | 0 | true | | test.rs:130:12:130:17 | ... <= ... | test.rs:133:13:133:13 | n | false | | test.rs:130:17:130:17 | 0 | test.rs:130:12:130:17 | ... <= ... | | -| test.rs:130:19:132:9 | BlockExpr | test.rs:130:9:134:9 | IfExpr | | -| test.rs:131:13:131:13 | 0 | test.rs:130:19:132:9 | BlockExpr | | -| test.rs:132:16:134:9 | BlockExpr | test.rs:130:9:134:9 | IfExpr | | +| test.rs:130:19:132:9 | { ... } | test.rs:130:9:134:9 | if ... {...} else {...} | | +| test.rs:131:13:131:13 | 0 | test.rs:130:19:132:9 | { ... } | | +| test.rs:132:16:134:9 | { ... } | test.rs:130:9:134:9 | if ... {...} else {...} | | | test.rs:133:13:133:13 | n | test.rs:133:17:133:17 | 1 | | -| test.rs:133:13:133:17 | ... - ... | test.rs:132:16:134:9 | BlockExpr | | +| test.rs:133:13:133:17 | ... - ... | test.rs:132:16:134:9 | { ... } | | | test.rs:133:17:133:17 | 1 | test.rs:133:13:133:17 | ... - ... | | -| test.rs:137:5:143:5 | enter test_if_let_else | test.rs:137:25:137:25 | a | | -| test.rs:137:5:143:5 | exit test_if_let_else (normal) | test.rs:137:5:143:5 | exit test_if_let_else | | -| test.rs:137:25:137:25 | a | test.rs:137:25:137:38 | Param | match | -| test.rs:137:25:137:38 | Param | test.rs:138:12:138:26 | LetExpr | | -| test.rs:137:48:143:5 | BlockExpr | test.rs:137:5:143:5 | exit test_if_let_else (normal) | | -| test.rs:138:9:142:9 | IfExpr | test.rs:137:48:143:5 | BlockExpr | | -| test.rs:138:12:138:26 | LetExpr | test.rs:138:26:138:26 | a | | +| test.rs:137:5:143:5 | enter fn test_if_let_else | test.rs:137:25:137:25 | a | | +| test.rs:137:5:143:5 | exit fn test_if_let_else (normal) | test.rs:137:5:143:5 | exit fn test_if_let_else | | +| test.rs:137:25:137:25 | a | test.rs:137:25:137:38 | ...: Option::<...> | match | +| test.rs:137:25:137:38 | ...: Option::<...> | test.rs:138:12:138:26 | let ... = a | | +| test.rs:137:48:143:5 | { ... } | test.rs:137:5:143:5 | exit fn test_if_let_else (normal) | | +| test.rs:138:9:142:9 | if ... {...} else {...} | test.rs:137:48:143:5 | { ... } | | +| test.rs:138:12:138:26 | let ... = a | test.rs:138:26:138:26 | a | | | test.rs:138:16:138:22 | TupleStructPat | test.rs:138:21:138:21 | n | match | | test.rs:138:16:138:22 | TupleStructPat | test.rs:141:13:141:13 | 0 | no-match | | test.rs:138:21:138:21 | n | test.rs:139:13:139:13 | n | match | | test.rs:138:26:138:26 | a | test.rs:138:16:138:22 | TupleStructPat | | -| test.rs:138:28:140:9 | BlockExpr | test.rs:138:9:142:9 | IfExpr | | -| test.rs:139:13:139:13 | n | test.rs:138:28:140:9 | BlockExpr | | -| test.rs:140:16:142:9 | BlockExpr | test.rs:138:9:142:9 | IfExpr | | -| test.rs:141:13:141:13 | 0 | test.rs:140:16:142:9 | BlockExpr | | -| test.rs:145:5:150:5 | enter test_if_let | test.rs:145:20:145:20 | a | | -| test.rs:145:5:150:5 | exit test_if_let (normal) | test.rs:145:5:150:5 | exit test_if_let | | -| test.rs:145:20:145:20 | a | test.rs:145:20:145:33 | Param | match | -| test.rs:145:20:145:33 | Param | test.rs:146:9:148:9 | ExprStmt | | -| test.rs:145:43:150:5 | BlockExpr | test.rs:145:5:150:5 | exit test_if_let (normal) | | -| test.rs:146:9:148:9 | ExprStmt | test.rs:146:12:146:26 | LetExpr | | -| test.rs:146:9:148:9 | IfExpr | test.rs:149:9:149:9 | 0 | | -| test.rs:146:12:146:26 | LetExpr | test.rs:146:26:146:26 | a | | -| test.rs:146:16:146:22 | TupleStructPat | test.rs:146:9:148:9 | IfExpr | no-match | +| test.rs:138:28:140:9 | { ... } | test.rs:138:9:142:9 | if ... {...} else {...} | | +| test.rs:139:13:139:13 | n | test.rs:138:28:140:9 | { ... } | | +| test.rs:140:16:142:9 | { ... } | test.rs:138:9:142:9 | if ... {...} else {...} | | +| test.rs:141:13:141:13 | 0 | test.rs:140:16:142:9 | { ... } | | +| test.rs:145:5:150:5 | enter fn test_if_let | test.rs:145:20:145:20 | a | | +| test.rs:145:5:150:5 | exit fn test_if_let (normal) | test.rs:145:5:150:5 | exit fn test_if_let | | +| test.rs:145:20:145:20 | a | test.rs:145:20:145:33 | ...: Option::<...> | match | +| test.rs:145:20:145:33 | ...: Option::<...> | test.rs:146:9:148:9 | ExprStmt | | +| test.rs:145:43:150:5 | { ... } | test.rs:145:5:150:5 | exit fn test_if_let (normal) | | +| test.rs:146:9:148:9 | ExprStmt | test.rs:146:12:146:26 | let ... = a | | +| test.rs:146:9:148:9 | if ... {...} | test.rs:149:9:149:9 | 0 | | +| test.rs:146:12:146:26 | let ... = a | test.rs:146:26:146:26 | a | | +| test.rs:146:16:146:22 | TupleStructPat | test.rs:146:9:148:9 | if ... {...} | no-match | | test.rs:146:16:146:22 | TupleStructPat | test.rs:146:21:146:21 | n | match | | test.rs:146:21:146:21 | n | test.rs:147:13:147:21 | ExprStmt | match | | test.rs:146:26:146:26 | a | test.rs:146:16:146:22 | TupleStructPat | | -| test.rs:147:13:147:20 | ReturnExpr | test.rs:145:5:150:5 | exit test_if_let (normal) | return | +| test.rs:147:13:147:20 | return n | test.rs:145:5:150:5 | exit fn test_if_let (normal) | return | | test.rs:147:13:147:21 | ExprStmt | test.rs:147:20:147:20 | n | | -| test.rs:147:20:147:20 | n | test.rs:147:13:147:20 | ReturnExpr | | -| test.rs:149:9:149:9 | 0 | test.rs:145:43:150:5 | BlockExpr | | -| test.rs:152:5:158:5 | enter test_nested_if | test.rs:152:23:152:23 | a | | -| test.rs:152:5:158:5 | exit test_nested_if (normal) | test.rs:152:5:158:5 | exit test_nested_if | | -| test.rs:152:23:152:23 | a | test.rs:152:23:152:28 | Param | match | -| test.rs:152:23:152:28 | Param | test.rs:153:16:153:16 | a | | -| test.rs:152:38:158:5 | BlockExpr | test.rs:152:5:158:5 | exit test_nested_if (normal) | | -| test.rs:153:9:157:9 | IfExpr | test.rs:152:38:158:5 | BlockExpr | | -| test.rs:153:13:153:48 | [boolean(false)] IfExpr | test.rs:156:13:156:13 | 0 | false | -| test.rs:153:13:153:48 | [boolean(true)] IfExpr | test.rs:154:13:154:13 | 1 | true | +| test.rs:147:20:147:20 | n | test.rs:147:13:147:20 | return n | | +| test.rs:149:9:149:9 | 0 | test.rs:145:43:150:5 | { ... } | | +| test.rs:152:5:158:5 | enter fn test_nested_if | test.rs:152:23:152:23 | a | | +| test.rs:152:5:158:5 | exit fn test_nested_if (normal) | test.rs:152:5:158:5 | exit fn test_nested_if | | +| test.rs:152:23:152:23 | a | test.rs:152:23:152:28 | ...: i64 | match | +| test.rs:152:23:152:28 | ...: i64 | test.rs:153:16:153:16 | a | | +| test.rs:152:38:158:5 | { ... } | test.rs:152:5:158:5 | exit fn test_nested_if (normal) | | +| test.rs:153:9:157:9 | if ... {...} else {...} | test.rs:152:38:158:5 | { ... } | | +| test.rs:153:13:153:48 | [boolean(false)] if ... {...} else {...} | test.rs:156:13:156:13 | 0 | false | +| test.rs:153:13:153:48 | [boolean(true)] if ... {...} else {...} | test.rs:154:13:154:13 | 1 | true | | test.rs:153:16:153:16 | a | test.rs:153:20:153:20 | 0 | | | test.rs:153:16:153:20 | ... < ... | test.rs:153:24:153:24 | a | true | | test.rs:153:16:153:20 | ... < ... | test.rs:153:41:153:41 | a | false | | test.rs:153:20:153:20 | 0 | test.rs:153:16:153:20 | ... < ... | | -| test.rs:153:22:153:32 | [boolean(false)] BlockExpr | test.rs:153:13:153:48 | [boolean(false)] IfExpr | false | -| test.rs:153:22:153:32 | [boolean(true)] BlockExpr | test.rs:153:13:153:48 | [boolean(true)] IfExpr | true | +| test.rs:153:22:153:32 | [boolean(false)] { ... } | test.rs:153:13:153:48 | [boolean(false)] if ... {...} else {...} | false | +| test.rs:153:22:153:32 | [boolean(true)] { ... } | test.rs:153:13:153:48 | [boolean(true)] if ... {...} else {...} | true | | test.rs:153:24:153:24 | a | test.rs:153:29:153:30 | 10 | | -| test.rs:153:24:153:30 | ... < ... | test.rs:153:22:153:32 | [boolean(false)] BlockExpr | false | -| test.rs:153:24:153:30 | ... < ... | test.rs:153:22:153:32 | [boolean(true)] BlockExpr | true | +| test.rs:153:24:153:30 | ... < ... | test.rs:153:22:153:32 | [boolean(false)] { ... } | false | +| test.rs:153:24:153:30 | ... < ... | test.rs:153:22:153:32 | [boolean(true)] { ... } | true | | test.rs:153:28:153:30 | - ... | test.rs:153:24:153:30 | ... < ... | | | test.rs:153:29:153:30 | 10 | test.rs:153:28:153:30 | - ... | | -| test.rs:153:39:153:48 | [boolean(false)] BlockExpr | test.rs:153:13:153:48 | [boolean(false)] IfExpr | false | -| test.rs:153:39:153:48 | [boolean(true)] BlockExpr | test.rs:153:13:153:48 | [boolean(true)] IfExpr | true | +| test.rs:153:39:153:48 | [boolean(false)] { ... } | test.rs:153:13:153:48 | [boolean(false)] if ... {...} else {...} | false | +| test.rs:153:39:153:48 | [boolean(true)] { ... } | test.rs:153:13:153:48 | [boolean(true)] if ... {...} else {...} | true | | test.rs:153:41:153:41 | a | test.rs:153:45:153:46 | 10 | | -| test.rs:153:41:153:46 | ... > ... | test.rs:153:39:153:48 | [boolean(false)] BlockExpr | false | -| test.rs:153:41:153:46 | ... > ... | test.rs:153:39:153:48 | [boolean(true)] BlockExpr | true | +| test.rs:153:41:153:46 | ... > ... | test.rs:153:39:153:48 | [boolean(false)] { ... } | false | +| test.rs:153:41:153:46 | ... > ... | test.rs:153:39:153:48 | [boolean(true)] { ... } | true | | test.rs:153:45:153:46 | 10 | test.rs:153:41:153:46 | ... > ... | | -| test.rs:153:51:155:9 | BlockExpr | test.rs:153:9:157:9 | IfExpr | | -| test.rs:154:13:154:13 | 1 | test.rs:153:51:155:9 | BlockExpr | | -| test.rs:155:16:157:9 | BlockExpr | test.rs:153:9:157:9 | IfExpr | | -| test.rs:156:13:156:13 | 0 | test.rs:155:16:157:9 | BlockExpr | | -| test.rs:160:5:169:5 | enter test_nested_if_match | test.rs:160:29:160:29 | a | | -| test.rs:160:5:169:5 | exit test_nested_if_match (normal) | test.rs:160:5:169:5 | exit test_nested_if_match | | -| test.rs:160:29:160:29 | a | test.rs:160:29:160:34 | Param | match | -| test.rs:160:29:160:34 | Param | test.rs:161:19:161:19 | a | | -| test.rs:160:44:169:5 | BlockExpr | test.rs:160:5:169:5 | exit test_nested_if_match (normal) | | -| test.rs:161:9:168:9 | IfExpr | test.rs:160:44:169:5 | BlockExpr | | -| test.rs:161:13:164:9 | [boolean(false)] MatchExpr | test.rs:167:13:167:13 | 0 | false | -| test.rs:161:13:164:9 | [boolean(true)] MatchExpr | test.rs:165:13:165:13 | 1 | true | +| test.rs:153:51:155:9 | { ... } | test.rs:153:9:157:9 | if ... {...} else {...} | | +| test.rs:154:13:154:13 | 1 | test.rs:153:51:155:9 | { ... } | | +| test.rs:155:16:157:9 | { ... } | test.rs:153:9:157:9 | if ... {...} else {...} | | +| test.rs:156:13:156:13 | 0 | test.rs:155:16:157:9 | { ... } | | +| test.rs:160:5:169:5 | enter fn test_nested_if_match | test.rs:160:29:160:29 | a | | +| test.rs:160:5:169:5 | exit fn test_nested_if_match (normal) | test.rs:160:5:169:5 | exit fn test_nested_if_match | | +| test.rs:160:29:160:29 | a | test.rs:160:29:160:34 | ...: i64 | match | +| test.rs:160:29:160:34 | ...: i64 | test.rs:161:19:161:19 | a | | +| test.rs:160:44:169:5 | { ... } | test.rs:160:5:169:5 | exit fn test_nested_if_match (normal) | | +| test.rs:161:9:168:9 | if ... {...} else {...} | test.rs:160:44:169:5 | { ... } | | +| test.rs:161:13:164:9 | [boolean(false)] match a { ... } | test.rs:167:13:167:13 | 0 | false | +| test.rs:161:13:164:9 | [boolean(true)] match a { ... } | test.rs:165:13:165:13 | 1 | true | | test.rs:161:19:161:19 | a | test.rs:162:13:162:13 | 0 | | -| test.rs:162:13:162:13 | 0 | test.rs:162:13:162:13 | LiteralPat | | -| test.rs:162:13:162:13 | LiteralPat | test.rs:162:18:162:21 | true | match | -| test.rs:162:13:162:13 | LiteralPat | test.rs:163:13:163:13 | WildcardPat | no-match | -| test.rs:162:18:162:21 | true | test.rs:161:13:164:9 | [boolean(true)] MatchExpr | true | -| test.rs:163:13:163:13 | WildcardPat | test.rs:163:18:163:22 | false | match | -| test.rs:163:18:163:22 | false | test.rs:161:13:164:9 | [boolean(false)] MatchExpr | false | -| test.rs:164:12:166:9 | BlockExpr | test.rs:161:9:168:9 | IfExpr | | -| test.rs:165:13:165:13 | 1 | test.rs:164:12:166:9 | BlockExpr | | -| test.rs:166:16:168:9 | BlockExpr | test.rs:161:9:168:9 | IfExpr | | -| test.rs:167:13:167:13 | 0 | test.rs:166:16:168:9 | BlockExpr | | -| test.rs:171:5:180:5 | enter test_nested_if_block | test.rs:171:29:171:29 | a | | -| test.rs:171:5:180:5 | exit test_nested_if_block (normal) | test.rs:171:5:180:5 | exit test_nested_if_block | | -| test.rs:171:29:171:29 | a | test.rs:171:29:171:34 | Param | match | -| test.rs:171:29:171:34 | Param | test.rs:173:13:173:15 | ExprStmt | | -| test.rs:171:44:180:5 | BlockExpr | test.rs:171:5:180:5 | exit test_nested_if_block (normal) | | -| test.rs:172:9:179:9 | IfExpr | test.rs:171:44:180:5 | BlockExpr | | -| test.rs:172:12:175:9 | [boolean(false)] BlockExpr | test.rs:178:13:178:13 | 0 | false | -| test.rs:172:12:175:9 | [boolean(true)] BlockExpr | test.rs:176:13:176:13 | 1 | true | +| test.rs:162:13:162:13 | 0 | test.rs:162:13:162:13 | 0 | | +| test.rs:162:13:162:13 | 0 | test.rs:162:18:162:21 | true | match | +| test.rs:162:13:162:13 | 0 | test.rs:163:13:163:13 | _ | no-match | +| test.rs:162:18:162:21 | true | test.rs:161:13:164:9 | [boolean(true)] match a { ... } | true | +| test.rs:163:13:163:13 | _ | test.rs:163:18:163:22 | false | match | +| test.rs:163:18:163:22 | false | test.rs:161:13:164:9 | [boolean(false)] match a { ... } | false | +| test.rs:164:12:166:9 | { ... } | test.rs:161:9:168:9 | if ... {...} else {...} | | +| test.rs:165:13:165:13 | 1 | test.rs:164:12:166:9 | { ... } | | +| test.rs:166:16:168:9 | { ... } | test.rs:161:9:168:9 | if ... {...} else {...} | | +| test.rs:167:13:167:13 | 0 | test.rs:166:16:168:9 | { ... } | | +| test.rs:171:5:180:5 | enter fn test_nested_if_block | test.rs:171:29:171:29 | a | | +| test.rs:171:5:180:5 | exit fn test_nested_if_block (normal) | test.rs:171:5:180:5 | exit fn test_nested_if_block | | +| test.rs:171:29:171:29 | a | test.rs:171:29:171:34 | ...: i64 | match | +| test.rs:171:29:171:34 | ...: i64 | test.rs:173:13:173:15 | ExprStmt | | +| test.rs:171:44:180:5 | { ... } | test.rs:171:5:180:5 | exit fn test_nested_if_block (normal) | | +| test.rs:172:9:179:9 | if ... {...} else {...} | test.rs:171:44:180:5 | { ... } | | +| test.rs:172:12:175:9 | [boolean(false)] { ... } | test.rs:178:13:178:13 | 0 | false | +| test.rs:172:12:175:9 | [boolean(true)] { ... } | test.rs:176:13:176:13 | 1 | true | | test.rs:173:13:173:14 | TupleExpr | test.rs:174:13:174:13 | a | | | test.rs:173:13:173:15 | ExprStmt | test.rs:173:13:173:14 | TupleExpr | | | test.rs:174:13:174:13 | a | test.rs:174:17:174:17 | 0 | | -| test.rs:174:13:174:17 | ... > ... | test.rs:172:12:175:9 | [boolean(false)] BlockExpr | false | -| test.rs:174:13:174:17 | ... > ... | test.rs:172:12:175:9 | [boolean(true)] BlockExpr | true | +| test.rs:174:13:174:17 | ... > ... | test.rs:172:12:175:9 | [boolean(false)] { ... } | false | +| test.rs:174:13:174:17 | ... > ... | test.rs:172:12:175:9 | [boolean(true)] { ... } | true | | test.rs:174:17:174:17 | 0 | test.rs:174:13:174:17 | ... > ... | | -| test.rs:175:11:177:9 | BlockExpr | test.rs:172:9:179:9 | IfExpr | | -| test.rs:176:13:176:13 | 1 | test.rs:175:11:177:9 | BlockExpr | | -| test.rs:177:16:179:9 | BlockExpr | test.rs:172:9:179:9 | IfExpr | | -| test.rs:178:13:178:13 | 0 | test.rs:177:16:179:9 | BlockExpr | | -| test.rs:182:5:192:5 | enter test_if_assignment | test.rs:182:27:182:27 | a | | -| test.rs:182:5:192:5 | exit test_if_assignment (normal) | test.rs:182:5:192:5 | exit test_if_assignment | | -| test.rs:182:27:182:27 | a | test.rs:182:27:182:32 | Param | match | -| test.rs:182:27:182:32 | Param | test.rs:183:9:183:26 | LetStmt | | -| test.rs:182:42:192:5 | BlockExpr | test.rs:182:5:192:5 | exit test_if_assignment (normal) | | -| test.rs:183:9:183:26 | LetStmt | test.rs:183:21:183:25 | false | | +| test.rs:175:11:177:9 | { ... } | test.rs:172:9:179:9 | if ... {...} else {...} | | +| test.rs:176:13:176:13 | 1 | test.rs:175:11:177:9 | { ... } | | +| test.rs:177:16:179:9 | { ... } | test.rs:172:9:179:9 | if ... {...} else {...} | | +| test.rs:178:13:178:13 | 0 | test.rs:177:16:179:9 | { ... } | | +| test.rs:182:5:192:5 | enter fn test_if_assignment | test.rs:182:27:182:27 | a | | +| test.rs:182:5:192:5 | exit fn test_if_assignment (normal) | test.rs:182:5:192:5 | exit fn test_if_assignment | | +| test.rs:182:27:182:27 | a | test.rs:182:27:182:32 | ...: i64 | match | +| test.rs:182:27:182:32 | ...: i64 | test.rs:183:9:183:26 | let ... = false | | +| test.rs:182:42:192:5 | { ... } | test.rs:182:5:192:5 | exit fn test_if_assignment (normal) | | +| test.rs:183:9:183:26 | let ... = false | test.rs:183:21:183:25 | false | | | test.rs:183:13:183:17 | x | test.rs:185:13:185:21 | ExprStmt | match | | test.rs:183:21:183:25 | false | test.rs:183:13:183:17 | x | | -| test.rs:184:9:191:9 | IfExpr | test.rs:182:42:192:5 | BlockExpr | | -| test.rs:184:12:187:9 | [boolean(false)] BlockExpr | test.rs:190:13:190:13 | 0 | false | -| test.rs:184:12:187:9 | [boolean(true)] BlockExpr | test.rs:188:13:188:13 | 1 | true | +| test.rs:184:9:191:9 | if ... {...} else {...} | test.rs:182:42:192:5 | { ... } | | +| test.rs:184:12:187:9 | [boolean(false)] { ... } | test.rs:190:13:190:13 | 0 | false | +| test.rs:184:12:187:9 | [boolean(true)] { ... } | test.rs:188:13:188:13 | 1 | true | | test.rs:185:13:185:13 | x | test.rs:185:17:185:20 | true | | | test.rs:185:13:185:20 | ... = ... | test.rs:186:13:186:13 | x | | | test.rs:185:13:185:21 | ExprStmt | test.rs:185:13:185:13 | x | | | test.rs:185:17:185:20 | true | test.rs:185:13:185:20 | ... = ... | | -| test.rs:186:13:186:13 | x | test.rs:184:12:187:9 | [boolean(false)] BlockExpr | false | -| test.rs:186:13:186:13 | x | test.rs:184:12:187:9 | [boolean(true)] BlockExpr | true | -| test.rs:187:11:189:9 | BlockExpr | test.rs:184:9:191:9 | IfExpr | | -| test.rs:188:13:188:13 | 1 | test.rs:187:11:189:9 | BlockExpr | | -| test.rs:189:16:191:9 | BlockExpr | test.rs:184:9:191:9 | IfExpr | | -| test.rs:190:13:190:13 | 0 | test.rs:189:16:191:9 | BlockExpr | | -| test.rs:194:5:205:5 | enter test_if_loop1 | test.rs:194:22:194:22 | a | | -| test.rs:194:5:205:5 | exit test_if_loop1 (normal) | test.rs:194:5:205:5 | exit test_if_loop1 | | -| test.rs:194:22:194:22 | a | test.rs:194:22:194:27 | Param | match | -| test.rs:194:22:194:27 | Param | test.rs:196:13:198:14 | ExprStmt | | -| test.rs:194:37:205:5 | BlockExpr | test.rs:194:5:205:5 | exit test_if_loop1 (normal) | | -| test.rs:195:9:204:9 | IfExpr | test.rs:194:37:205:5 | BlockExpr | | -| test.rs:195:13:200:9 | [boolean(false)] LoopExpr | test.rs:203:13:203:13 | 0 | false | -| test.rs:195:13:200:9 | [boolean(true)] LoopExpr | test.rs:201:13:201:13 | 1 | true | -| test.rs:195:18:200:9 | BlockExpr | test.rs:196:13:198:14 | ExprStmt | | -| test.rs:196:13:198:13 | IfExpr | test.rs:199:13:199:19 | ExprStmt | | +| test.rs:186:13:186:13 | x | test.rs:184:12:187:9 | [boolean(false)] { ... } | false | +| test.rs:186:13:186:13 | x | test.rs:184:12:187:9 | [boolean(true)] { ... } | true | +| test.rs:187:11:189:9 | { ... } | test.rs:184:9:191:9 | if ... {...} else {...} | | +| test.rs:188:13:188:13 | 1 | test.rs:187:11:189:9 | { ... } | | +| test.rs:189:16:191:9 | { ... } | test.rs:184:9:191:9 | if ... {...} else {...} | | +| test.rs:190:13:190:13 | 0 | test.rs:189:16:191:9 | { ... } | | +| test.rs:194:5:205:5 | enter fn test_if_loop1 | test.rs:194:22:194:22 | a | | +| test.rs:194:5:205:5 | exit fn test_if_loop1 (normal) | test.rs:194:5:205:5 | exit fn test_if_loop1 | | +| test.rs:194:22:194:22 | a | test.rs:194:22:194:27 | ...: i64 | match | +| test.rs:194:22:194:27 | ...: i64 | test.rs:196:13:198:14 | ExprStmt | | +| test.rs:194:37:205:5 | { ... } | test.rs:194:5:205:5 | exit fn test_if_loop1 (normal) | | +| test.rs:195:9:204:9 | if ... {...} else {...} | test.rs:194:37:205:5 | { ... } | | +| test.rs:195:13:200:9 | [boolean(false)] loop { ... } | test.rs:203:13:203:13 | 0 | false | +| test.rs:195:13:200:9 | [boolean(true)] loop { ... } | test.rs:201:13:201:13 | 1 | true | +| test.rs:195:18:200:9 | { ... } | test.rs:196:13:198:14 | ExprStmt | | +| test.rs:196:13:198:13 | if ... {...} | test.rs:199:13:199:19 | ExprStmt | | | test.rs:196:13:198:14 | ExprStmt | test.rs:196:16:196:16 | a | | | test.rs:196:16:196:16 | a | test.rs:196:20:196:20 | 0 | | -| test.rs:196:16:196:20 | ... > ... | test.rs:196:13:198:13 | IfExpr | false | +| test.rs:196:16:196:20 | ... > ... | test.rs:196:13:198:13 | if ... {...} | false | | test.rs:196:16:196:20 | ... > ... | test.rs:197:17:197:29 | ExprStmt | true | | test.rs:196:20:196:20 | 0 | test.rs:196:16:196:20 | ... > ... | | -| test.rs:197:17:197:28 | [boolean(false)] BreakExpr | test.rs:195:13:200:9 | [boolean(false)] LoopExpr | break | -| test.rs:197:17:197:28 | [boolean(true)] BreakExpr | test.rs:195:13:200:9 | [boolean(true)] LoopExpr | break | +| test.rs:197:17:197:28 | [boolean(false)] break ... | test.rs:195:13:200:9 | [boolean(false)] loop { ... } | break | +| test.rs:197:17:197:28 | [boolean(true)] break ... | test.rs:195:13:200:9 | [boolean(true)] loop { ... } | break | | test.rs:197:17:197:29 | ExprStmt | test.rs:197:23:197:23 | a | | | test.rs:197:23:197:23 | a | test.rs:197:27:197:28 | 10 | | -| test.rs:197:23:197:28 | ... > ... | test.rs:197:17:197:28 | [boolean(false)] BreakExpr | false | -| test.rs:197:23:197:28 | ... > ... | test.rs:197:17:197:28 | [boolean(true)] BreakExpr | true | +| test.rs:197:23:197:28 | ... > ... | test.rs:197:17:197:28 | [boolean(false)] break ... | false | +| test.rs:197:23:197:28 | ... > ... | test.rs:197:17:197:28 | [boolean(true)] break ... | true | | test.rs:197:27:197:28 | 10 | test.rs:197:23:197:28 | ... > ... | | | test.rs:199:13:199:13 | a | test.rs:199:17:199:18 | 10 | | -| test.rs:199:13:199:18 | ... < ... | test.rs:195:18:200:9 | BlockExpr | | +| test.rs:199:13:199:18 | ... < ... | test.rs:195:18:200:9 | { ... } | | | test.rs:199:13:199:19 | ExprStmt | test.rs:199:13:199:13 | a | | | test.rs:199:17:199:18 | 10 | test.rs:199:13:199:18 | ... < ... | | -| test.rs:200:12:202:9 | BlockExpr | test.rs:195:9:204:9 | IfExpr | | -| test.rs:201:13:201:13 | 1 | test.rs:200:12:202:9 | BlockExpr | | -| test.rs:202:16:204:9 | BlockExpr | test.rs:195:9:204:9 | IfExpr | | -| test.rs:203:13:203:13 | 0 | test.rs:202:16:204:9 | BlockExpr | | -| test.rs:207:5:218:5 | enter test_if_loop2 | test.rs:207:22:207:22 | a | | -| test.rs:207:5:218:5 | exit test_if_loop2 (normal) | test.rs:207:5:218:5 | exit test_if_loop2 | | -| test.rs:207:22:207:22 | a | test.rs:207:22:207:27 | Param | match | -| test.rs:207:22:207:27 | Param | test.rs:209:13:211:14 | ExprStmt | | -| test.rs:207:37:218:5 | BlockExpr | test.rs:207:5:218:5 | exit test_if_loop2 (normal) | | -| test.rs:208:9:217:9 | IfExpr | test.rs:207:37:218:5 | BlockExpr | | -| test.rs:208:13:213:9 | [boolean(false)] LoopExpr | test.rs:216:13:216:13 | 0 | false | -| test.rs:208:13:213:9 | [boolean(true)] LoopExpr | test.rs:214:13:214:13 | 1 | true | -| test.rs:208:26:213:9 | BlockExpr | test.rs:209:13:211:14 | ExprStmt | | -| test.rs:209:13:211:13 | IfExpr | test.rs:212:13:212:19 | ExprStmt | | +| test.rs:200:12:202:9 | { ... } | test.rs:195:9:204:9 | if ... {...} else {...} | | +| test.rs:201:13:201:13 | 1 | test.rs:200:12:202:9 | { ... } | | +| test.rs:202:16:204:9 | { ... } | test.rs:195:9:204:9 | if ... {...} else {...} | | +| test.rs:203:13:203:13 | 0 | test.rs:202:16:204:9 | { ... } | | +| test.rs:207:5:218:5 | enter fn test_if_loop2 | test.rs:207:22:207:22 | a | | +| test.rs:207:5:218:5 | exit fn test_if_loop2 (normal) | test.rs:207:5:218:5 | exit fn test_if_loop2 | | +| test.rs:207:22:207:22 | a | test.rs:207:22:207:27 | ...: i64 | match | +| test.rs:207:22:207:27 | ...: i64 | test.rs:209:13:211:14 | ExprStmt | | +| test.rs:207:37:218:5 | { ... } | test.rs:207:5:218:5 | exit fn test_if_loop2 (normal) | | +| test.rs:208:9:217:9 | if ... {...} else {...} | test.rs:207:37:218:5 | { ... } | | +| test.rs:208:13:213:9 | [boolean(false)] 'label: loop { ... } | test.rs:216:13:216:13 | 0 | false | +| test.rs:208:13:213:9 | [boolean(true)] 'label: loop { ... } | test.rs:214:13:214:13 | 1 | true | +| test.rs:208:26:213:9 | { ... } | test.rs:209:13:211:14 | ExprStmt | | +| test.rs:209:13:211:13 | if ... {...} | test.rs:212:13:212:19 | ExprStmt | | | test.rs:209:13:211:14 | ExprStmt | test.rs:209:16:209:16 | a | | | test.rs:209:16:209:16 | a | test.rs:209:20:209:20 | 0 | | -| test.rs:209:16:209:20 | ... > ... | test.rs:209:13:211:13 | IfExpr | false | +| test.rs:209:16:209:20 | ... > ... | test.rs:209:13:211:13 | if ... {...} | false | | test.rs:209:16:209:20 | ... > ... | test.rs:210:17:210:36 | ExprStmt | true | | test.rs:209:20:209:20 | 0 | test.rs:209:16:209:20 | ... > ... | | -| test.rs:210:17:210:35 | [boolean(false)] BreakExpr | test.rs:208:13:213:9 | [boolean(false)] LoopExpr | break | -| test.rs:210:17:210:35 | [boolean(true)] BreakExpr | test.rs:208:13:213:9 | [boolean(true)] LoopExpr | break | +| test.rs:210:17:210:35 | [boolean(false)] break ''label ... | test.rs:208:13:213:9 | [boolean(false)] 'label: loop { ... } | break | +| test.rs:210:17:210:35 | [boolean(true)] break ''label ... | test.rs:208:13:213:9 | [boolean(true)] 'label: loop { ... } | break | | test.rs:210:17:210:36 | ExprStmt | test.rs:210:30:210:30 | a | | | test.rs:210:30:210:30 | a | test.rs:210:34:210:35 | 10 | | -| test.rs:210:30:210:35 | ... > ... | test.rs:210:17:210:35 | [boolean(false)] BreakExpr | false | -| test.rs:210:30:210:35 | ... > ... | test.rs:210:17:210:35 | [boolean(true)] BreakExpr | true | +| test.rs:210:30:210:35 | ... > ... | test.rs:210:17:210:35 | [boolean(false)] break ''label ... | false | +| test.rs:210:30:210:35 | ... > ... | test.rs:210:17:210:35 | [boolean(true)] break ''label ... | true | | test.rs:210:34:210:35 | 10 | test.rs:210:30:210:35 | ... > ... | | | test.rs:212:13:212:13 | a | test.rs:212:17:212:18 | 10 | | -| test.rs:212:13:212:18 | ... < ... | test.rs:208:26:213:9 | BlockExpr | | +| test.rs:212:13:212:18 | ... < ... | test.rs:208:26:213:9 | { ... } | | | test.rs:212:13:212:19 | ExprStmt | test.rs:212:13:212:13 | a | | | test.rs:212:17:212:18 | 10 | test.rs:212:13:212:18 | ... < ... | | -| test.rs:213:12:215:9 | BlockExpr | test.rs:208:9:217:9 | IfExpr | | -| test.rs:214:13:214:13 | 1 | test.rs:213:12:215:9 | BlockExpr | | -| test.rs:215:16:217:9 | BlockExpr | test.rs:208:9:217:9 | IfExpr | | -| test.rs:216:13:216:13 | 0 | test.rs:215:16:217:9 | BlockExpr | | -| test.rs:220:5:228:5 | enter test_labelled_block | test.rs:220:28:220:28 | a | | -| test.rs:220:5:228:5 | exit test_labelled_block (normal) | test.rs:220:5:228:5 | exit test_labelled_block | | -| test.rs:220:28:220:28 | a | test.rs:220:28:220:33 | Param | match | -| test.rs:220:28:220:33 | Param | test.rs:222:13:222:31 | ExprStmt | | -| test.rs:220:43:228:5 | BlockExpr | test.rs:220:5:228:5 | exit test_labelled_block (normal) | | -| test.rs:221:9:227:9 | IfExpr | test.rs:220:43:228:5 | BlockExpr | | -| test.rs:221:13:223:9 | [boolean(false)] BlockExpr | test.rs:226:13:226:13 | 0 | false | -| test.rs:221:13:223:9 | [boolean(true)] BlockExpr | test.rs:224:13:224:13 | 1 | true | -| test.rs:222:13:222:30 | [boolean(false)] BreakExpr | test.rs:221:13:223:9 | [boolean(false)] BlockExpr | break | -| test.rs:222:13:222:30 | [boolean(true)] BreakExpr | test.rs:221:13:223:9 | [boolean(true)] BlockExpr | break | +| test.rs:213:12:215:9 | { ... } | test.rs:208:9:217:9 | if ... {...} else {...} | | +| test.rs:214:13:214:13 | 1 | test.rs:213:12:215:9 | { ... } | | +| test.rs:215:16:217:9 | { ... } | test.rs:208:9:217:9 | if ... {...} else {...} | | +| test.rs:216:13:216:13 | 0 | test.rs:215:16:217:9 | { ... } | | +| test.rs:220:5:228:5 | enter fn test_labelled_block | test.rs:220:28:220:28 | a | | +| test.rs:220:5:228:5 | exit fn test_labelled_block (normal) | test.rs:220:5:228:5 | exit fn test_labelled_block | | +| test.rs:220:28:220:28 | a | test.rs:220:28:220:33 | ...: i64 | match | +| test.rs:220:28:220:33 | ...: i64 | test.rs:222:13:222:31 | ExprStmt | | +| test.rs:220:43:228:5 | { ... } | test.rs:220:5:228:5 | exit fn test_labelled_block (normal) | | +| test.rs:221:9:227:9 | if ... {...} else {...} | test.rs:220:43:228:5 | { ... } | | +| test.rs:221:13:223:9 | [boolean(false)] 'block: { ... } | test.rs:226:13:226:13 | 0 | false | +| test.rs:221:13:223:9 | [boolean(true)] 'block: { ... } | test.rs:224:13:224:13 | 1 | true | +| test.rs:222:13:222:30 | [boolean(false)] break ''block ... | test.rs:221:13:223:9 | [boolean(false)] 'block: { ... } | break | +| test.rs:222:13:222:30 | [boolean(true)] break ''block ... | test.rs:221:13:223:9 | [boolean(true)] 'block: { ... } | break | | test.rs:222:13:222:31 | ExprStmt | test.rs:222:26:222:26 | a | | | test.rs:222:26:222:26 | a | test.rs:222:30:222:30 | 0 | | -| test.rs:222:26:222:30 | ... > ... | test.rs:222:13:222:30 | [boolean(false)] BreakExpr | false | -| test.rs:222:26:222:30 | ... > ... | test.rs:222:13:222:30 | [boolean(true)] BreakExpr | true | +| test.rs:222:26:222:30 | ... > ... | test.rs:222:13:222:30 | [boolean(false)] break ''block ... | false | +| test.rs:222:26:222:30 | ... > ... | test.rs:222:13:222:30 | [boolean(true)] break ''block ... | true | | test.rs:222:30:222:30 | 0 | test.rs:222:26:222:30 | ... > ... | | -| test.rs:223:12:225:9 | BlockExpr | test.rs:221:9:227:9 | IfExpr | | -| test.rs:224:13:224:13 | 1 | test.rs:223:12:225:9 | BlockExpr | | -| test.rs:225:16:227:9 | BlockExpr | test.rs:221:9:227:9 | IfExpr | | -| test.rs:226:13:226:13 | 0 | test.rs:225:16:227:9 | BlockExpr | | -| test.rs:233:5:236:5 | enter test_and_operator | test.rs:233:30:233:30 | a | | -| test.rs:233:5:236:5 | exit test_and_operator (normal) | test.rs:233:5:236:5 | exit test_and_operator | | -| test.rs:233:30:233:30 | a | test.rs:233:30:233:36 | Param | match | -| test.rs:233:30:233:36 | Param | test.rs:233:39:233:39 | b | | -| test.rs:233:39:233:39 | b | test.rs:233:39:233:45 | Param | match | -| test.rs:233:39:233:45 | Param | test.rs:233:48:233:48 | c | | -| test.rs:233:48:233:48 | c | test.rs:233:48:233:54 | Param | match | -| test.rs:233:48:233:54 | Param | test.rs:234:9:234:28 | LetStmt | | -| test.rs:233:65:236:5 | BlockExpr | test.rs:233:5:236:5 | exit test_and_operator (normal) | | -| test.rs:234:9:234:28 | LetStmt | test.rs:234:17:234:17 | a | | +| test.rs:223:12:225:9 | { ... } | test.rs:221:9:227:9 | if ... {...} else {...} | | +| test.rs:224:13:224:13 | 1 | test.rs:223:12:225:9 | { ... } | | +| test.rs:225:16:227:9 | { ... } | test.rs:221:9:227:9 | if ... {...} else {...} | | +| test.rs:226:13:226:13 | 0 | test.rs:225:16:227:9 | { ... } | | +| test.rs:233:5:236:5 | enter fn test_and_operator | test.rs:233:30:233:30 | a | | +| test.rs:233:5:236:5 | exit fn test_and_operator (normal) | test.rs:233:5:236:5 | exit fn test_and_operator | | +| test.rs:233:30:233:30 | a | test.rs:233:30:233:36 | ...: bool | match | +| test.rs:233:30:233:36 | ...: bool | test.rs:233:39:233:39 | b | | +| test.rs:233:39:233:39 | b | test.rs:233:39:233:45 | ...: bool | match | +| test.rs:233:39:233:45 | ...: bool | test.rs:233:48:233:48 | c | | +| test.rs:233:48:233:48 | c | test.rs:233:48:233:54 | ...: bool | match | +| test.rs:233:48:233:54 | ...: bool | test.rs:234:9:234:28 | let ... = ... | | +| test.rs:233:65:236:5 | { ... } | test.rs:233:5:236:5 | exit fn test_and_operator (normal) | | +| test.rs:234:9:234:28 | let ... = ... | test.rs:234:17:234:17 | a | | | test.rs:234:13:234:13 | d | test.rs:235:9:235:9 | d | match | | test.rs:234:17:234:17 | a | test.rs:234:17:234:22 | [boolean(false)] ... && ... | false | | test.rs:234:17:234:17 | a | test.rs:234:22:234:22 | b | true | @@ -483,17 +483,17 @@ edges | test.rs:234:22:234:22 | b | test.rs:234:17:234:22 | [boolean(false)] ... && ... | false | | test.rs:234:22:234:22 | b | test.rs:234:17:234:22 | [boolean(true)] ... && ... | true | | test.rs:234:27:234:27 | c | test.rs:234:17:234:27 | ... && ... | | -| test.rs:235:9:235:9 | d | test.rs:233:65:236:5 | BlockExpr | | -| test.rs:238:5:241:5 | enter test_or_operator | test.rs:238:25:238:25 | a | | -| test.rs:238:5:241:5 | exit test_or_operator (normal) | test.rs:238:5:241:5 | exit test_or_operator | | -| test.rs:238:25:238:25 | a | test.rs:238:25:238:31 | Param | match | -| test.rs:238:25:238:31 | Param | test.rs:238:34:238:34 | b | | -| test.rs:238:34:238:34 | b | test.rs:238:34:238:40 | Param | match | -| test.rs:238:34:238:40 | Param | test.rs:238:43:238:43 | c | | -| test.rs:238:43:238:43 | c | test.rs:238:43:238:49 | Param | match | -| test.rs:238:43:238:49 | Param | test.rs:239:9:239:28 | LetStmt | | -| test.rs:238:60:241:5 | BlockExpr | test.rs:238:5:241:5 | exit test_or_operator (normal) | | -| test.rs:239:9:239:28 | LetStmt | test.rs:239:17:239:17 | a | | +| test.rs:235:9:235:9 | d | test.rs:233:65:236:5 | { ... } | | +| test.rs:238:5:241:5 | enter fn test_or_operator | test.rs:238:25:238:25 | a | | +| test.rs:238:5:241:5 | exit fn test_or_operator (normal) | test.rs:238:5:241:5 | exit fn test_or_operator | | +| test.rs:238:25:238:25 | a | test.rs:238:25:238:31 | ...: bool | match | +| test.rs:238:25:238:31 | ...: bool | test.rs:238:34:238:34 | b | | +| test.rs:238:34:238:34 | b | test.rs:238:34:238:40 | ...: bool | match | +| test.rs:238:34:238:40 | ...: bool | test.rs:238:43:238:43 | c | | +| test.rs:238:43:238:43 | c | test.rs:238:43:238:49 | ...: bool | match | +| test.rs:238:43:238:49 | ...: bool | test.rs:239:9:239:28 | let ... = ... | | +| test.rs:238:60:241:5 | { ... } | test.rs:238:5:241:5 | exit fn test_or_operator (normal) | | +| test.rs:239:9:239:28 | let ... = ... | test.rs:239:17:239:17 | a | | | test.rs:239:13:239:13 | d | test.rs:240:9:240:9 | d | match | | test.rs:239:17:239:17 | a | test.rs:239:17:239:22 | [boolean(true)] ... \|\| ... | true | | test.rs:239:17:239:17 | a | test.rs:239:22:239:22 | b | false | @@ -503,17 +503,17 @@ edges | test.rs:239:22:239:22 | b | test.rs:239:17:239:22 | [boolean(false)] ... \|\| ... | false | | test.rs:239:22:239:22 | b | test.rs:239:17:239:22 | [boolean(true)] ... \|\| ... | true | | test.rs:239:27:239:27 | c | test.rs:239:17:239:27 | ... \|\| ... | | -| test.rs:240:9:240:9 | d | test.rs:238:60:241:5 | BlockExpr | | -| test.rs:243:5:246:5 | enter test_or_operator_2 | test.rs:243:27:243:27 | a | | -| test.rs:243:5:246:5 | exit test_or_operator_2 (normal) | test.rs:243:5:246:5 | exit test_or_operator_2 | | -| test.rs:243:27:243:27 | a | test.rs:243:27:243:33 | Param | match | -| test.rs:243:27:243:33 | Param | test.rs:243:36:243:36 | b | | -| test.rs:243:36:243:36 | b | test.rs:243:36:243:41 | Param | match | -| test.rs:243:36:243:41 | Param | test.rs:243:44:243:44 | c | | -| test.rs:243:44:243:44 | c | test.rs:243:44:243:50 | Param | match | -| test.rs:243:44:243:50 | Param | test.rs:244:9:244:36 | LetStmt | | -| test.rs:243:61:246:5 | BlockExpr | test.rs:243:5:246:5 | exit test_or_operator_2 (normal) | | -| test.rs:244:9:244:36 | LetStmt | test.rs:244:17:244:17 | a | | +| test.rs:240:9:240:9 | d | test.rs:238:60:241:5 | { ... } | | +| test.rs:243:5:246:5 | enter fn test_or_operator_2 | test.rs:243:27:243:27 | a | | +| test.rs:243:5:246:5 | exit fn test_or_operator_2 (normal) | test.rs:243:5:246:5 | exit fn test_or_operator_2 | | +| test.rs:243:27:243:27 | a | test.rs:243:27:243:33 | ...: bool | match | +| test.rs:243:27:243:33 | ...: bool | test.rs:243:36:243:36 | b | | +| test.rs:243:36:243:36 | b | test.rs:243:36:243:41 | ...: i64 | match | +| test.rs:243:36:243:41 | ...: i64 | test.rs:243:44:243:44 | c | | +| test.rs:243:44:243:44 | c | test.rs:243:44:243:50 | ...: bool | match | +| test.rs:243:44:243:50 | ...: bool | test.rs:244:9:244:36 | let ... = ... | | +| test.rs:243:61:246:5 | { ... } | test.rs:243:5:246:5 | exit fn test_or_operator_2 (normal) | | +| test.rs:244:9:244:36 | let ... = ... | test.rs:244:17:244:17 | a | | | test.rs:244:13:244:13 | d | test.rs:245:9:245:9 | d | match | | test.rs:244:17:244:17 | a | test.rs:244:17:244:30 | [boolean(true)] ... \|\| ... | true | | test.rs:244:17:244:17 | a | test.rs:244:23:244:23 | b | false | @@ -525,27 +525,27 @@ edges | test.rs:244:23:244:29 | ... == ... | test.rs:244:17:244:30 | [boolean(true)] ... \|\| ... | true | | test.rs:244:28:244:29 | 28 | test.rs:244:23:244:29 | ... == ... | | | test.rs:244:35:244:35 | c | test.rs:244:17:244:35 | ... \|\| ... | | -| test.rs:245:9:245:9 | d | test.rs:243:61:246:5 | BlockExpr | | -| test.rs:248:5:251:5 | enter test_not_operator | test.rs:248:26:248:26 | a | | -| test.rs:248:5:251:5 | exit test_not_operator (normal) | test.rs:248:5:251:5 | exit test_not_operator | | -| test.rs:248:26:248:26 | a | test.rs:248:26:248:32 | Param | match | -| test.rs:248:26:248:32 | Param | test.rs:249:9:249:19 | LetStmt | | -| test.rs:248:43:251:5 | BlockExpr | test.rs:248:5:251:5 | exit test_not_operator (normal) | | -| test.rs:249:9:249:19 | LetStmt | test.rs:249:18:249:18 | a | | +| test.rs:245:9:245:9 | d | test.rs:243:61:246:5 | { ... } | | +| test.rs:248:5:251:5 | enter fn test_not_operator | test.rs:248:26:248:26 | a | | +| test.rs:248:5:251:5 | exit fn test_not_operator (normal) | test.rs:248:5:251:5 | exit fn test_not_operator | | +| test.rs:248:26:248:26 | a | test.rs:248:26:248:32 | ...: bool | match | +| test.rs:248:26:248:32 | ...: bool | test.rs:249:9:249:19 | let ... = ... | | +| test.rs:248:43:251:5 | { ... } | test.rs:248:5:251:5 | exit fn test_not_operator (normal) | | +| test.rs:249:9:249:19 | let ... = ... | test.rs:249:18:249:18 | a | | | test.rs:249:13:249:13 | d | test.rs:250:9:250:9 | d | match | | test.rs:249:17:249:18 | ! ... | test.rs:249:13:249:13 | d | | | test.rs:249:18:249:18 | a | test.rs:249:17:249:18 | ! ... | | -| test.rs:250:9:250:9 | d | test.rs:248:43:251:5 | BlockExpr | | -| test.rs:253:5:259:5 | enter test_if_and_operator | test.rs:253:29:253:29 | a | | -| test.rs:253:5:259:5 | exit test_if_and_operator (normal) | test.rs:253:5:259:5 | exit test_if_and_operator | | -| test.rs:253:29:253:29 | a | test.rs:253:29:253:35 | Param | match | -| test.rs:253:29:253:35 | Param | test.rs:253:38:253:38 | b | | -| test.rs:253:38:253:38 | b | test.rs:253:38:253:44 | Param | match | -| test.rs:253:38:253:44 | Param | test.rs:253:47:253:47 | c | | -| test.rs:253:47:253:47 | c | test.rs:253:47:253:53 | Param | match | -| test.rs:253:47:253:53 | Param | test.rs:254:12:254:12 | a | | -| test.rs:253:64:259:5 | BlockExpr | test.rs:253:5:259:5 | exit test_if_and_operator (normal) | | -| test.rs:254:9:258:9 | IfExpr | test.rs:253:64:259:5 | BlockExpr | | +| test.rs:250:9:250:9 | d | test.rs:248:43:251:5 | { ... } | | +| test.rs:253:5:259:5 | enter fn test_if_and_operator | test.rs:253:29:253:29 | a | | +| test.rs:253:5:259:5 | exit fn test_if_and_operator (normal) | test.rs:253:5:259:5 | exit fn test_if_and_operator | | +| test.rs:253:29:253:29 | a | test.rs:253:29:253:35 | ...: bool | match | +| test.rs:253:29:253:35 | ...: bool | test.rs:253:38:253:38 | b | | +| test.rs:253:38:253:38 | b | test.rs:253:38:253:44 | ...: bool | match | +| test.rs:253:38:253:44 | ...: bool | test.rs:253:47:253:47 | c | | +| test.rs:253:47:253:47 | c | test.rs:253:47:253:53 | ...: bool | match | +| test.rs:253:47:253:53 | ...: bool | test.rs:254:12:254:12 | a | | +| test.rs:253:64:259:5 | { ... } | test.rs:253:5:259:5 | exit fn test_if_and_operator (normal) | | +| test.rs:254:9:258:9 | if ... {...} else {...} | test.rs:253:64:259:5 | { ... } | | | test.rs:254:12:254:12 | a | test.rs:254:12:254:17 | [boolean(false)] ... && ... | false | | test.rs:254:12:254:12 | a | test.rs:254:17:254:17 | b | true | | test.rs:254:12:254:17 | [boolean(false)] ... && ... | test.rs:254:12:254:22 | [boolean(false)] ... && ... | false | @@ -556,20 +556,20 @@ edges | test.rs:254:17:254:17 | b | test.rs:254:12:254:17 | [boolean(true)] ... && ... | true | | test.rs:254:22:254:22 | c | test.rs:254:12:254:22 | [boolean(false)] ... && ... | false | | test.rs:254:22:254:22 | c | test.rs:254:12:254:22 | [boolean(true)] ... && ... | true | -| test.rs:254:24:256:9 | BlockExpr | test.rs:254:9:258:9 | IfExpr | | -| test.rs:255:13:255:16 | true | test.rs:254:24:256:9 | BlockExpr | | -| test.rs:256:16:258:9 | BlockExpr | test.rs:254:9:258:9 | IfExpr | | -| test.rs:257:13:257:17 | false | test.rs:256:16:258:9 | BlockExpr | | -| test.rs:261:5:267:5 | enter test_if_or_operator | test.rs:261:28:261:28 | a | | -| test.rs:261:5:267:5 | exit test_if_or_operator (normal) | test.rs:261:5:267:5 | exit test_if_or_operator | | -| test.rs:261:28:261:28 | a | test.rs:261:28:261:34 | Param | match | -| test.rs:261:28:261:34 | Param | test.rs:261:37:261:37 | b | | -| test.rs:261:37:261:37 | b | test.rs:261:37:261:43 | Param | match | -| test.rs:261:37:261:43 | Param | test.rs:261:46:261:46 | c | | -| test.rs:261:46:261:46 | c | test.rs:261:46:261:52 | Param | match | -| test.rs:261:46:261:52 | Param | test.rs:262:12:262:12 | a | | -| test.rs:261:63:267:5 | BlockExpr | test.rs:261:5:267:5 | exit test_if_or_operator (normal) | | -| test.rs:262:9:266:9 | IfExpr | test.rs:261:63:267:5 | BlockExpr | | +| test.rs:254:24:256:9 | { ... } | test.rs:254:9:258:9 | if ... {...} else {...} | | +| test.rs:255:13:255:16 | true | test.rs:254:24:256:9 | { ... } | | +| test.rs:256:16:258:9 | { ... } | test.rs:254:9:258:9 | if ... {...} else {...} | | +| test.rs:257:13:257:17 | false | test.rs:256:16:258:9 | { ... } | | +| test.rs:261:5:267:5 | enter fn test_if_or_operator | test.rs:261:28:261:28 | a | | +| test.rs:261:5:267:5 | exit fn test_if_or_operator (normal) | test.rs:261:5:267:5 | exit fn test_if_or_operator | | +| test.rs:261:28:261:28 | a | test.rs:261:28:261:34 | ...: bool | match | +| test.rs:261:28:261:34 | ...: bool | test.rs:261:37:261:37 | b | | +| test.rs:261:37:261:37 | b | test.rs:261:37:261:43 | ...: bool | match | +| test.rs:261:37:261:43 | ...: bool | test.rs:261:46:261:46 | c | | +| test.rs:261:46:261:46 | c | test.rs:261:46:261:52 | ...: bool | match | +| test.rs:261:46:261:52 | ...: bool | test.rs:262:12:262:12 | a | | +| test.rs:261:63:267:5 | { ... } | test.rs:261:5:267:5 | exit fn test_if_or_operator (normal) | | +| test.rs:262:9:266:9 | if ... {...} else {...} | test.rs:261:63:267:5 | { ... } | | | test.rs:262:12:262:12 | a | test.rs:262:12:262:17 | [boolean(true)] ... \|\| ... | true | | test.rs:262:12:262:12 | a | test.rs:262:17:262:17 | b | false | | test.rs:262:12:262:17 | [boolean(false)] ... \|\| ... | test.rs:262:22:262:22 | c | false | @@ -580,89 +580,89 @@ edges | test.rs:262:17:262:17 | b | test.rs:262:12:262:17 | [boolean(true)] ... \|\| ... | true | | test.rs:262:22:262:22 | c | test.rs:262:12:262:22 | [boolean(false)] ... \|\| ... | false | | test.rs:262:22:262:22 | c | test.rs:262:12:262:22 | [boolean(true)] ... \|\| ... | true | -| test.rs:262:24:264:9 | BlockExpr | test.rs:262:9:266:9 | IfExpr | | -| test.rs:263:13:263:16 | true | test.rs:262:24:264:9 | BlockExpr | | -| test.rs:264:16:266:9 | BlockExpr | test.rs:262:9:266:9 | IfExpr | | -| test.rs:265:13:265:17 | false | test.rs:264:16:266:9 | BlockExpr | | -| test.rs:269:5:275:5 | enter test_if_not_operator | test.rs:269:29:269:29 | a | | -| test.rs:269:5:275:5 | exit test_if_not_operator (normal) | test.rs:269:5:275:5 | exit test_if_not_operator | | -| test.rs:269:29:269:29 | a | test.rs:269:29:269:35 | Param | match | -| test.rs:269:29:269:35 | Param | test.rs:270:13:270:13 | a | | -| test.rs:269:46:275:5 | BlockExpr | test.rs:269:5:275:5 | exit test_if_not_operator (normal) | | -| test.rs:270:9:274:9 | IfExpr | test.rs:269:46:275:5 | BlockExpr | | +| test.rs:262:24:264:9 | { ... } | test.rs:262:9:266:9 | if ... {...} else {...} | | +| test.rs:263:13:263:16 | true | test.rs:262:24:264:9 | { ... } | | +| test.rs:264:16:266:9 | { ... } | test.rs:262:9:266:9 | if ... {...} else {...} | | +| test.rs:265:13:265:17 | false | test.rs:264:16:266:9 | { ... } | | +| test.rs:269:5:275:5 | enter fn test_if_not_operator | test.rs:269:29:269:29 | a | | +| test.rs:269:5:275:5 | exit fn test_if_not_operator (normal) | test.rs:269:5:275:5 | exit fn test_if_not_operator | | +| test.rs:269:29:269:29 | a | test.rs:269:29:269:35 | ...: bool | match | +| test.rs:269:29:269:35 | ...: bool | test.rs:270:13:270:13 | a | | +| test.rs:269:46:275:5 | { ... } | test.rs:269:5:275:5 | exit fn test_if_not_operator (normal) | | +| test.rs:270:9:274:9 | if ... {...} else {...} | test.rs:269:46:275:5 | { ... } | | | test.rs:270:12:270:13 | [boolean(false)] ! ... | test.rs:273:13:273:17 | false | false | | test.rs:270:12:270:13 | [boolean(true)] ! ... | test.rs:271:13:271:16 | true | true | | test.rs:270:13:270:13 | a | test.rs:270:12:270:13 | [boolean(false)] ! ... | true | | test.rs:270:13:270:13 | a | test.rs:270:12:270:13 | [boolean(true)] ! ... | false | -| test.rs:270:15:272:9 | BlockExpr | test.rs:270:9:274:9 | IfExpr | | -| test.rs:271:13:271:16 | true | test.rs:270:15:272:9 | BlockExpr | | -| test.rs:272:16:274:9 | BlockExpr | test.rs:270:9:274:9 | IfExpr | | -| test.rs:273:13:273:17 | false | test.rs:272:16:274:9 | BlockExpr | | -| test.rs:277:5:279:5 | enter test_and_return | test.rs:277:24:277:24 | a | | -| test.rs:277:5:279:5 | exit test_and_return (normal) | test.rs:277:5:279:5 | exit test_and_return | | -| test.rs:277:24:277:24 | a | test.rs:277:24:277:30 | Param | match | -| test.rs:277:24:277:30 | Param | test.rs:278:9:278:20 | ExprStmt | | -| test.rs:277:33:279:5 | BlockExpr | test.rs:277:5:279:5 | exit test_and_return (normal) | | +| test.rs:270:15:272:9 | { ... } | test.rs:270:9:274:9 | if ... {...} else {...} | | +| test.rs:271:13:271:16 | true | test.rs:270:15:272:9 | { ... } | | +| test.rs:272:16:274:9 | { ... } | test.rs:270:9:274:9 | if ... {...} else {...} | | +| test.rs:273:13:273:17 | false | test.rs:272:16:274:9 | { ... } | | +| test.rs:277:5:279:5 | enter fn test_and_return | test.rs:277:24:277:24 | a | | +| test.rs:277:5:279:5 | exit fn test_and_return (normal) | test.rs:277:5:279:5 | exit fn test_and_return | | +| test.rs:277:24:277:24 | a | test.rs:277:24:277:30 | ...: bool | match | +| test.rs:277:24:277:30 | ...: bool | test.rs:278:9:278:20 | ExprStmt | | +| test.rs:277:33:279:5 | { ... } | test.rs:277:5:279:5 | exit fn test_and_return (normal) | | | test.rs:278:9:278:9 | a | test.rs:278:9:278:19 | ... && ... | false | -| test.rs:278:9:278:9 | a | test.rs:278:14:278:19 | ReturnExpr | true | -| test.rs:278:9:278:19 | ... && ... | test.rs:277:33:279:5 | BlockExpr | | +| test.rs:278:9:278:9 | a | test.rs:278:14:278:19 | return | true | +| test.rs:278:9:278:19 | ... && ... | test.rs:277:33:279:5 | { ... } | | | test.rs:278:9:278:20 | ExprStmt | test.rs:278:9:278:9 | a | | -| test.rs:278:14:278:19 | ReturnExpr | test.rs:277:5:279:5 | exit test_and_return (normal) | return | -| test.rs:281:5:286:5 | enter test_and_true | test.rs:281:22:281:22 | a | | -| test.rs:281:5:286:5 | exit test_and_true (normal) | test.rs:281:5:286:5 | exit test_and_true | | -| test.rs:281:22:281:22 | a | test.rs:281:22:281:28 | Param | match | -| test.rs:281:22:281:28 | Param | test.rs:282:9:284:9 | ExprStmt | | -| test.rs:281:38:286:5 | BlockExpr | test.rs:281:5:286:5 | exit test_and_true (normal) | | +| test.rs:278:14:278:19 | return | test.rs:277:5:279:5 | exit fn test_and_return (normal) | return | +| test.rs:281:5:286:5 | enter fn test_and_true | test.rs:281:22:281:22 | a | | +| test.rs:281:5:286:5 | exit fn test_and_true (normal) | test.rs:281:5:286:5 | exit fn test_and_true | | +| test.rs:281:22:281:22 | a | test.rs:281:22:281:28 | ...: bool | match | +| test.rs:281:22:281:28 | ...: bool | test.rs:282:9:284:9 | ExprStmt | | +| test.rs:281:38:286:5 | { ... } | test.rs:281:5:286:5 | exit fn test_and_true (normal) | | | test.rs:282:9:284:9 | ExprStmt | test.rs:282:13:282:13 | a | | -| test.rs:282:9:284:9 | IfExpr | test.rs:285:9:285:9 | 0 | | +| test.rs:282:9:284:9 | if ... {...} | test.rs:285:9:285:9 | 0 | | | test.rs:282:13:282:13 | a | test.rs:282:13:282:21 | [boolean(false)] ... && ... | false | | test.rs:282:13:282:13 | a | test.rs:282:18:282:21 | true | true | -| test.rs:282:13:282:21 | [boolean(false)] ... && ... | test.rs:282:9:284:9 | IfExpr | false | +| test.rs:282:13:282:21 | [boolean(false)] ... && ... | test.rs:282:9:284:9 | if ... {...} | false | | test.rs:282:13:282:21 | [boolean(true)] ... && ... | test.rs:283:13:283:21 | ExprStmt | true | | test.rs:282:18:282:21 | true | test.rs:282:13:282:21 | [boolean(true)] ... && ... | true | -| test.rs:283:13:283:20 | ReturnExpr | test.rs:281:5:286:5 | exit test_and_true (normal) | return | +| test.rs:283:13:283:20 | return 1 | test.rs:281:5:286:5 | exit fn test_and_true (normal) | return | | test.rs:283:13:283:21 | ExprStmt | test.rs:283:20:283:20 | 1 | | -| test.rs:283:20:283:20 | 1 | test.rs:283:13:283:20 | ReturnExpr | | -| test.rs:285:9:285:9 | 0 | test.rs:281:38:286:5 | BlockExpr | | -| test.rs:292:5:294:5 | enter test_question_mark_operator_1 | test.rs:292:38:292:38 | s | | -| test.rs:292:5:294:5 | exit test_question_mark_operator_1 (normal) | test.rs:292:5:294:5 | exit test_question_mark_operator_1 | | -| test.rs:292:38:292:38 | s | test.rs:292:38:292:44 | Param | match | -| test.rs:292:38:292:44 | Param | test.rs:293:9:293:10 | Ok | | -| test.rs:292:87:294:5 | BlockExpr | test.rs:292:5:294:5 | exit test_question_mark_operator_1 (normal) | | +| test.rs:283:20:283:20 | 1 | test.rs:283:13:283:20 | return 1 | | +| test.rs:285:9:285:9 | 0 | test.rs:281:38:286:5 | { ... } | | +| test.rs:292:5:294:5 | enter fn test_question_mark_operator_1 | test.rs:292:38:292:38 | s | | +| test.rs:292:5:294:5 | exit fn test_question_mark_operator_1 (normal) | test.rs:292:5:294:5 | exit fn test_question_mark_operator_1 | | +| test.rs:292:38:292:38 | s | test.rs:292:38:292:44 | ...: ... | match | +| test.rs:292:38:292:44 | ...: ... | test.rs:293:9:293:10 | Ok | | +| test.rs:292:87:294:5 | { ... } | test.rs:292:5:294:5 | exit fn test_question_mark_operator_1 (normal) | | | test.rs:293:9:293:10 | Ok | test.rs:293:12:293:12 | s | | -| test.rs:293:9:293:33 | CallExpr | test.rs:292:87:294:5 | BlockExpr | | +| test.rs:293:9:293:33 | Ok(...) | test.rs:292:87:294:5 | { ... } | | | test.rs:293:12:293:12 | s | test.rs:293:12:293:27 | ... .parse(...) | | | test.rs:293:12:293:27 | ... .parse(...) | test.rs:293:12:293:28 | TryExpr | | -| test.rs:293:12:293:28 | TryExpr | test.rs:292:5:294:5 | exit test_question_mark_operator_1 (normal) | return | +| test.rs:293:12:293:28 | TryExpr | test.rs:292:5:294:5 | exit fn test_question_mark_operator_1 (normal) | return | | test.rs:293:12:293:28 | TryExpr | test.rs:293:32:293:32 | 4 | match | -| test.rs:293:12:293:32 | ... + ... | test.rs:293:9:293:33 | CallExpr | | +| test.rs:293:12:293:32 | ... + ... | test.rs:293:9:293:33 | Ok(...) | | | test.rs:293:32:293:32 | 4 | test.rs:293:12:293:32 | ... + ... | | -| test.rs:296:5:301:5 | enter test_question_mark_operator_2 | test.rs:296:38:296:38 | b | | -| test.rs:296:5:301:5 | exit test_question_mark_operator_2 (normal) | test.rs:296:5:301:5 | exit test_question_mark_operator_2 | | -| test.rs:296:38:296:38 | b | test.rs:296:38:296:52 | Param | match | -| test.rs:296:38:296:52 | Param | test.rs:297:15:297:15 | b | | -| test.rs:296:71:301:5 | BlockExpr | test.rs:296:5:301:5 | exit test_question_mark_operator_2 (normal) | | -| test.rs:297:9:300:9 | MatchExpr | test.rs:296:71:301:5 | BlockExpr | | +| test.rs:296:5:301:5 | enter fn test_question_mark_operator_2 | test.rs:296:38:296:38 | b | | +| test.rs:296:5:301:5 | exit fn test_question_mark_operator_2 (normal) | test.rs:296:5:301:5 | exit fn test_question_mark_operator_2 | | +| test.rs:296:38:296:38 | b | test.rs:296:38:296:52 | ...: Option::<...> | match | +| test.rs:296:38:296:52 | ...: Option::<...> | test.rs:297:15:297:15 | b | | +| test.rs:296:71:301:5 | { ... } | test.rs:296:5:301:5 | exit fn test_question_mark_operator_2 (normal) | | +| test.rs:297:9:300:9 | match ... { ... } | test.rs:296:71:301:5 | { ... } | | | test.rs:297:15:297:15 | b | test.rs:297:15:297:16 | TryExpr | | -| test.rs:297:15:297:16 | TryExpr | test.rs:296:5:301:5 | exit test_question_mark_operator_2 (normal) | return | +| test.rs:297:15:297:16 | TryExpr | test.rs:296:5:301:5 | exit fn test_question_mark_operator_2 (normal) | return | | test.rs:297:15:297:16 | TryExpr | test.rs:298:13:298:16 | true | match | -| test.rs:298:13:298:16 | LiteralPat | test.rs:298:21:298:24 | Some | match | -| test.rs:298:13:298:16 | LiteralPat | test.rs:299:13:299:17 | false | no-match | -| test.rs:298:13:298:16 | true | test.rs:298:13:298:16 | LiteralPat | | +| test.rs:298:13:298:16 | true | test.rs:298:13:298:16 | true | | +| test.rs:298:13:298:16 | true | test.rs:298:21:298:24 | Some | match | +| test.rs:298:13:298:16 | true | test.rs:299:13:299:17 | false | no-match | | test.rs:298:21:298:24 | Some | test.rs:298:26:298:30 | false | | -| test.rs:298:21:298:31 | CallExpr | test.rs:297:9:300:9 | MatchExpr | | -| test.rs:298:26:298:30 | false | test.rs:298:21:298:31 | CallExpr | | -| test.rs:299:13:299:17 | LiteralPat | test.rs:299:22:299:25 | Some | match | -| test.rs:299:13:299:17 | false | test.rs:299:13:299:17 | LiteralPat | | +| test.rs:298:21:298:31 | Some(...) | test.rs:297:9:300:9 | match ... { ... } | | +| test.rs:298:26:298:30 | false | test.rs:298:21:298:31 | Some(...) | | +| test.rs:299:13:299:17 | false | test.rs:299:13:299:17 | false | | +| test.rs:299:13:299:17 | false | test.rs:299:22:299:25 | Some | match | | test.rs:299:22:299:25 | Some | test.rs:299:27:299:30 | true | | -| test.rs:299:22:299:31 | CallExpr | test.rs:297:9:300:9 | MatchExpr | | -| test.rs:299:27:299:30 | true | test.rs:299:22:299:31 | CallExpr | | -| test.rs:307:5:313:5 | enter test_match | test.rs:307:19:307:29 | maybe_digit | | -| test.rs:307:5:313:5 | exit test_match (normal) | test.rs:307:5:313:5 | exit test_match | | -| test.rs:307:19:307:29 | maybe_digit | test.rs:307:19:307:42 | Param | match | -| test.rs:307:19:307:42 | Param | test.rs:308:15:308:25 | maybe_digit | | -| test.rs:307:52:313:5 | BlockExpr | test.rs:307:5:313:5 | exit test_match (normal) | | -| test.rs:308:9:312:9 | MatchExpr | test.rs:307:52:313:5 | BlockExpr | | +| test.rs:299:22:299:31 | Some(...) | test.rs:297:9:300:9 | match ... { ... } | | +| test.rs:299:27:299:30 | true | test.rs:299:22:299:31 | Some(...) | | +| test.rs:307:5:313:5 | enter fn test_match | test.rs:307:19:307:29 | maybe_digit | | +| test.rs:307:5:313:5 | exit fn test_match (normal) | test.rs:307:5:313:5 | exit fn test_match | | +| test.rs:307:19:307:29 | maybe_digit | test.rs:307:19:307:42 | ...: Option::<...> | match | +| test.rs:307:19:307:42 | ...: Option::<...> | test.rs:308:15:308:25 | maybe_digit | | +| test.rs:307:52:313:5 | { ... } | test.rs:307:5:313:5 | exit fn test_match (normal) | | +| test.rs:308:9:312:9 | match maybe_digit { ... } | test.rs:307:52:313:5 | { ... } | | | test.rs:308:15:308:25 | maybe_digit | test.rs:309:13:309:27 | TupleStructPat | | | test.rs:309:13:309:27 | TupleStructPat | test.rs:309:26:309:26 | x | match | | test.rs:309:13:309:27 | TupleStructPat | test.rs:310:13:310:27 | TupleStructPat | no-match | @@ -672,448 +672,448 @@ edges | test.rs:309:32:309:37 | ... < ... | test.rs:310:13:310:27 | TupleStructPat | false | | test.rs:309:36:309:37 | 10 | test.rs:309:32:309:37 | ... < ... | | | test.rs:309:42:309:42 | x | test.rs:309:46:309:46 | 5 | | -| test.rs:309:42:309:46 | ... + ... | test.rs:308:9:312:9 | MatchExpr | | +| test.rs:309:42:309:46 | ... + ... | test.rs:308:9:312:9 | match maybe_digit { ... } | | | test.rs:309:46:309:46 | 5 | test.rs:309:42:309:46 | ... + ... | | | test.rs:310:13:310:27 | TupleStructPat | test.rs:310:26:310:26 | x | match | -| test.rs:310:13:310:27 | TupleStructPat | test.rs:311:13:311:24 | PathPat | no-match | +| test.rs:310:13:310:27 | TupleStructPat | test.rs:311:13:311:24 | ...::None | no-match | | test.rs:310:26:310:26 | x | test.rs:310:32:310:32 | x | match | -| test.rs:310:32:310:32 | x | test.rs:308:9:312:9 | MatchExpr | | -| test.rs:311:13:311:24 | PathPat | test.rs:311:29:311:29 | 5 | match | -| test.rs:311:29:311:29 | 5 | test.rs:308:9:312:9 | MatchExpr | | -| test.rs:315:5:324:5 | enter test_match_with_return_in_scrutinee | test.rs:315:44:315:54 | maybe_digit | | -| test.rs:315:5:324:5 | exit test_match_with_return_in_scrutinee (normal) | test.rs:315:5:324:5 | exit test_match_with_return_in_scrutinee | | -| test.rs:315:44:315:54 | maybe_digit | test.rs:315:44:315:67 | Param | match | -| test.rs:315:44:315:67 | Param | test.rs:316:19:316:29 | maybe_digit | | -| test.rs:315:77:324:5 | BlockExpr | test.rs:315:5:324:5 | exit test_match_with_return_in_scrutinee (normal) | | -| test.rs:316:9:323:9 | MatchExpr | test.rs:315:77:324:5 | BlockExpr | | -| test.rs:316:16:320:9 | IfExpr | test.rs:321:13:321:27 | TupleStructPat | | +| test.rs:310:32:310:32 | x | test.rs:308:9:312:9 | match maybe_digit { ... } | | +| test.rs:311:13:311:24 | ...::None | test.rs:311:29:311:29 | 5 | match | +| test.rs:311:29:311:29 | 5 | test.rs:308:9:312:9 | match maybe_digit { ... } | | +| test.rs:315:5:324:5 | enter fn test_match_with_return_in_scrutinee | test.rs:315:44:315:54 | maybe_digit | | +| test.rs:315:5:324:5 | exit fn test_match_with_return_in_scrutinee (normal) | test.rs:315:5:324:5 | exit fn test_match_with_return_in_scrutinee | | +| test.rs:315:44:315:54 | maybe_digit | test.rs:315:44:315:67 | ...: Option::<...> | match | +| test.rs:315:44:315:67 | ...: Option::<...> | test.rs:316:19:316:29 | maybe_digit | | +| test.rs:315:77:324:5 | { ... } | test.rs:315:5:324:5 | exit fn test_match_with_return_in_scrutinee (normal) | | +| test.rs:316:9:323:9 | match ... { ... } | test.rs:315:77:324:5 | { ... } | | +| test.rs:316:16:320:9 | if ... {...} else {...} | test.rs:321:13:321:27 | TupleStructPat | | | test.rs:316:19:316:29 | maybe_digit | test.rs:316:34:316:37 | Some | | | test.rs:316:19:316:40 | ... == ... | test.rs:317:13:317:21 | ExprStmt | true | | test.rs:316:19:316:40 | ... == ... | test.rs:319:13:319:23 | maybe_digit | false | | test.rs:316:34:316:37 | Some | test.rs:316:39:316:39 | 3 | | -| test.rs:316:34:316:40 | CallExpr | test.rs:316:19:316:40 | ... == ... | | -| test.rs:316:39:316:39 | 3 | test.rs:316:34:316:40 | CallExpr | | -| test.rs:317:13:317:20 | ReturnExpr | test.rs:315:5:324:5 | exit test_match_with_return_in_scrutinee (normal) | return | +| test.rs:316:34:316:40 | Some(...) | test.rs:316:19:316:40 | ... == ... | | +| test.rs:316:39:316:39 | 3 | test.rs:316:34:316:40 | Some(...) | | +| test.rs:317:13:317:20 | return 3 | test.rs:315:5:324:5 | exit fn test_match_with_return_in_scrutinee (normal) | return | | test.rs:317:13:317:21 | ExprStmt | test.rs:317:20:317:20 | 3 | | -| test.rs:317:20:317:20 | 3 | test.rs:317:13:317:20 | ReturnExpr | | -| test.rs:318:16:320:9 | BlockExpr | test.rs:316:16:320:9 | IfExpr | | -| test.rs:319:13:319:23 | maybe_digit | test.rs:318:16:320:9 | BlockExpr | | +| test.rs:317:20:317:20 | 3 | test.rs:317:13:317:20 | return 3 | | +| test.rs:318:16:320:9 | { ... } | test.rs:316:16:320:9 | if ... {...} else {...} | | +| test.rs:319:13:319:23 | maybe_digit | test.rs:318:16:320:9 | { ... } | | | test.rs:321:13:321:27 | TupleStructPat | test.rs:321:26:321:26 | x | match | -| test.rs:321:13:321:27 | TupleStructPat | test.rs:322:13:322:24 | PathPat | no-match | +| test.rs:321:13:321:27 | TupleStructPat | test.rs:322:13:322:24 | ...::None | no-match | | test.rs:321:26:321:26 | x | test.rs:321:32:321:32 | x | match | | test.rs:321:32:321:32 | x | test.rs:321:36:321:36 | 5 | | -| test.rs:321:32:321:36 | ... + ... | test.rs:316:9:323:9 | MatchExpr | | +| test.rs:321:32:321:36 | ... + ... | test.rs:316:9:323:9 | match ... { ... } | | | test.rs:321:36:321:36 | 5 | test.rs:321:32:321:36 | ... + ... | | -| test.rs:322:13:322:24 | PathPat | test.rs:322:29:322:29 | 5 | match | -| test.rs:322:29:322:29 | 5 | test.rs:316:9:323:9 | MatchExpr | | -| test.rs:326:5:331:5 | enter test_match_and | test.rs:326:23:326:26 | cond | | -| test.rs:326:5:331:5 | exit test_match_and (normal) | test.rs:326:5:331:5 | exit test_match_and | | -| test.rs:326:23:326:26 | cond | test.rs:326:23:326:32 | Param | match | -| test.rs:326:23:326:32 | Param | test.rs:326:35:326:35 | r | | -| test.rs:326:35:326:35 | r | test.rs:326:35:326:49 | Param | match | -| test.rs:326:35:326:49 | Param | test.rs:327:16:327:16 | r | | -| test.rs:326:60:331:5 | BlockExpr | test.rs:326:5:331:5 | exit test_match_and (normal) | | -| test.rs:327:9:330:18 | ... && ... | test.rs:326:60:331:5 | BlockExpr | | -| test.rs:327:10:330:9 | [boolean(false)] MatchExpr | test.rs:327:9:330:18 | ... && ... | false | -| test.rs:327:10:330:9 | [boolean(true)] MatchExpr | test.rs:330:15:330:18 | cond | true | +| test.rs:322:13:322:24 | ...::None | test.rs:322:29:322:29 | 5 | match | +| test.rs:322:29:322:29 | 5 | test.rs:316:9:323:9 | match ... { ... } | | +| test.rs:326:5:331:5 | enter fn test_match_and | test.rs:326:23:326:26 | cond | | +| test.rs:326:5:331:5 | exit fn test_match_and (normal) | test.rs:326:5:331:5 | exit fn test_match_and | | +| test.rs:326:23:326:26 | cond | test.rs:326:23:326:32 | ...: bool | match | +| test.rs:326:23:326:32 | ...: bool | test.rs:326:35:326:35 | r | | +| test.rs:326:35:326:35 | r | test.rs:326:35:326:49 | ...: Option::<...> | match | +| test.rs:326:35:326:49 | ...: Option::<...> | test.rs:327:16:327:16 | r | | +| test.rs:326:60:331:5 | { ... } | test.rs:326:5:331:5 | exit fn test_match_and (normal) | | +| test.rs:327:9:330:18 | ... && ... | test.rs:326:60:331:5 | { ... } | | +| test.rs:327:10:330:9 | [boolean(false)] match r { ... } | test.rs:327:9:330:18 | ... && ... | false | +| test.rs:327:10:330:9 | [boolean(true)] match r { ... } | test.rs:330:15:330:18 | cond | true | | test.rs:327:16:327:16 | r | test.rs:328:13:328:19 | TupleStructPat | | | test.rs:328:13:328:19 | TupleStructPat | test.rs:328:18:328:18 | a | match | -| test.rs:328:13:328:19 | TupleStructPat | test.rs:329:13:329:13 | WildcardPat | no-match | +| test.rs:328:13:328:19 | TupleStructPat | test.rs:329:13:329:13 | _ | no-match | | test.rs:328:18:328:18 | a | test.rs:328:24:328:24 | a | match | -| test.rs:328:24:328:24 | a | test.rs:327:10:330:9 | [boolean(false)] MatchExpr | false | -| test.rs:328:24:328:24 | a | test.rs:327:10:330:9 | [boolean(true)] MatchExpr | true | -| test.rs:329:13:329:13 | WildcardPat | test.rs:329:18:329:22 | false | match | -| test.rs:329:18:329:22 | false | test.rs:327:10:330:9 | [boolean(false)] MatchExpr | false | +| test.rs:328:24:328:24 | a | test.rs:327:10:330:9 | [boolean(false)] match r { ... } | false | +| test.rs:328:24:328:24 | a | test.rs:327:10:330:9 | [boolean(true)] match r { ... } | true | +| test.rs:329:13:329:13 | _ | test.rs:329:18:329:22 | false | match | +| test.rs:329:18:329:22 | false | test.rs:327:10:330:9 | [boolean(false)] match r { ... } | false | | test.rs:330:15:330:18 | cond | test.rs:327:9:330:18 | ... && ... | | -| test.rs:333:5:338:5 | enter test_match_with_no_arms | test.rs:333:35:333:35 | r | | -| test.rs:333:5:338:5 | exit test_match_with_no_arms (normal) | test.rs:333:5:338:5 | exit test_match_with_no_arms | | -| test.rs:333:35:333:35 | r | test.rs:333:35:333:58 | Param | match | -| test.rs:333:35:333:58 | Param | test.rs:334:15:334:15 | r | | -| test.rs:333:66:338:5 | BlockExpr | test.rs:333:5:338:5 | exit test_match_with_no_arms (normal) | | -| test.rs:334:9:337:9 | MatchExpr | test.rs:333:66:338:5 | BlockExpr | | +| test.rs:333:5:338:5 | enter fn test_match_with_no_arms | test.rs:333:35:333:35 | r | | +| test.rs:333:5:338:5 | exit fn test_match_with_no_arms (normal) | test.rs:333:5:338:5 | exit fn test_match_with_no_arms | | +| test.rs:333:35:333:35 | r | test.rs:333:35:333:58 | ...: Result::<...> | match | +| test.rs:333:35:333:58 | ...: Result::<...> | test.rs:334:15:334:15 | r | | +| test.rs:333:66:338:5 | { ... } | test.rs:333:5:338:5 | exit fn test_match_with_no_arms (normal) | | +| test.rs:334:9:337:9 | match r { ... } | test.rs:333:66:338:5 | { ... } | | | test.rs:334:15:334:15 | r | test.rs:335:13:335:21 | TupleStructPat | | | test.rs:335:13:335:21 | TupleStructPat | test.rs:335:16:335:20 | value | match | | test.rs:335:13:335:21 | TupleStructPat | test.rs:336:13:336:22 | TupleStructPat | no-match | | test.rs:335:16:335:20 | value | test.rs:335:26:335:30 | value | match | -| test.rs:335:26:335:30 | value | test.rs:334:9:337:9 | MatchExpr | | +| test.rs:335:26:335:30 | value | test.rs:334:9:337:9 | match r { ... } | | | test.rs:336:13:336:22 | TupleStructPat | test.rs:336:17:336:21 | never | match | | test.rs:336:17:336:21 | never | test.rs:336:33:336:37 | never | match | -| test.rs:336:27:336:40 | MatchExpr | test.rs:334:9:337:9 | MatchExpr | | -| test.rs:336:33:336:37 | never | test.rs:336:27:336:40 | MatchExpr | | -| test.rs:343:5:346:5 | enter test_let_match | test.rs:343:23:343:23 | a | | -| test.rs:343:5:346:5 | exit test_let_match (normal) | test.rs:343:5:346:5 | exit test_let_match | | -| test.rs:343:23:343:23 | a | test.rs:343:23:343:36 | Param | match | -| test.rs:343:23:343:36 | Param | test.rs:344:9:344:57 | LetStmt | | -| test.rs:343:46:346:5 | BlockExpr | test.rs:343:5:346:5 | exit test_let_match (normal) | | -| test.rs:344:9:344:57 | LetStmt | test.rs:344:23:344:23 | a | | +| test.rs:336:27:336:40 | match never { ... } | test.rs:334:9:337:9 | match r { ... } | | +| test.rs:336:33:336:37 | never | test.rs:336:27:336:40 | match never { ... } | | +| test.rs:343:5:346:5 | enter fn test_let_match | test.rs:343:23:343:23 | a | | +| test.rs:343:5:346:5 | exit fn test_let_match (normal) | test.rs:343:5:346:5 | exit fn test_let_match | | +| test.rs:343:23:343:23 | a | test.rs:343:23:343:36 | ...: Option::<...> | match | +| test.rs:343:23:343:36 | ...: Option::<...> | test.rs:344:9:344:57 | let ... = a else {...} | | +| test.rs:343:46:346:5 | { ... } | test.rs:343:5:346:5 | exit fn test_let_match (normal) | | +| test.rs:344:9:344:57 | let ... = a else {...} | test.rs:344:23:344:23 | a | | | test.rs:344:13:344:19 | TupleStructPat | test.rs:344:18:344:18 | n | match | | test.rs:344:13:344:19 | TupleStructPat | test.rs:344:39:344:53 | MacroStmts | no-match | | test.rs:344:18:344:18 | n | test.rs:345:9:345:9 | n | match | | test.rs:344:23:344:23 | a | test.rs:344:13:344:19 | TupleStructPat | | -| test.rs:344:32:344:54 | $crate::panicking::panic_fmt | test.rs:344:39:344:53 | "Expected some" | | -| test.rs:344:32:344:54 | MacroExpr | test.rs:344:30:344:56 | BlockExpr | | +| test.rs:344:32:344:54 | ...::panic_fmt | test.rs:344:39:344:53 | "Expected some" | | +| test.rs:344:32:344:54 | MacroExpr | test.rs:344:30:344:56 | { ... } | | | test.rs:344:39:344:53 | "Expected some" | test.rs:344:39:344:53 | FormatArgsExpr | | -| test.rs:344:39:344:53 | BlockExpr | test.rs:344:39:344:53 | MacroExpr | | -| test.rs:344:39:344:53 | CallExpr | test.rs:344:39:344:53 | BlockExpr | | -| test.rs:344:39:344:53 | ExprStmt | test.rs:344:32:344:54 | $crate::panicking::panic_fmt | | +| test.rs:344:39:344:53 | ...::panic_fmt(...) | test.rs:344:39:344:53 | { ... } | | +| test.rs:344:39:344:53 | ExprStmt | test.rs:344:32:344:54 | ...::panic_fmt | | | test.rs:344:39:344:53 | FormatArgsExpr | test.rs:344:39:344:53 | MacroExpr | | | test.rs:344:39:344:53 | MacroExpr | test.rs:344:32:344:54 | MacroExpr | | -| test.rs:344:39:344:53 | MacroExpr | test.rs:344:39:344:53 | CallExpr | | +| test.rs:344:39:344:53 | MacroExpr | test.rs:344:39:344:53 | ...::panic_fmt(...) | | | test.rs:344:39:344:53 | MacroStmts | test.rs:344:39:344:53 | ExprStmt | | | test.rs:344:39:344:53 | MacroStmts | test.rs:344:39:344:53 | MacroStmts | | -| test.rs:345:9:345:9 | n | test.rs:343:46:346:5 | BlockExpr | | -| test.rs:348:5:354:5 | enter test_let_with_return | test.rs:348:29:348:29 | m | | -| test.rs:348:5:354:5 | exit test_let_with_return (normal) | test.rs:348:5:354:5 | exit test_let_with_return | | -| test.rs:348:29:348:29 | m | test.rs:348:29:348:42 | Param | match | -| test.rs:348:29:348:42 | Param | test.rs:349:9:352:10 | LetStmt | | -| test.rs:348:53:354:5 | BlockExpr | test.rs:348:5:354:5 | exit test_let_with_return (normal) | | -| test.rs:349:9:352:10 | LetStmt | test.rs:349:25:349:25 | m | | +| test.rs:344:39:344:53 | { ... } | test.rs:344:39:344:53 | MacroExpr | | +| test.rs:345:9:345:9 | n | test.rs:343:46:346:5 | { ... } | | +| test.rs:348:5:354:5 | enter fn test_let_with_return | test.rs:348:29:348:29 | m | | +| test.rs:348:5:354:5 | exit fn test_let_with_return (normal) | test.rs:348:5:354:5 | exit fn test_let_with_return | | +| test.rs:348:29:348:29 | m | test.rs:348:29:348:42 | ...: Option::<...> | match | +| test.rs:348:29:348:42 | ...: Option::<...> | test.rs:349:9:352:10 | let ... = ... | | +| test.rs:348:53:354:5 | { ... } | test.rs:348:5:354:5 | exit fn test_let_with_return (normal) | | +| test.rs:349:9:352:10 | let ... = ... | test.rs:349:25:349:25 | m | | | test.rs:349:13:349:15 | ret | test.rs:353:9:353:12 | true | match | -| test.rs:349:19:352:9 | MatchExpr | test.rs:349:13:349:15 | ret | | +| test.rs:349:19:352:9 | match m { ... } | test.rs:349:13:349:15 | ret | | | test.rs:349:25:349:25 | m | test.rs:350:13:350:21 | TupleStructPat | | | test.rs:350:13:350:21 | TupleStructPat | test.rs:350:18:350:20 | ret | match | | test.rs:350:13:350:21 | TupleStructPat | test.rs:351:13:351:16 | None | no-match | | test.rs:350:18:350:20 | ret | test.rs:350:26:350:28 | ret | match | -| test.rs:350:26:350:28 | ret | test.rs:349:19:352:9 | MatchExpr | | +| test.rs:350:26:350:28 | ret | test.rs:349:19:352:9 | match m { ... } | | | test.rs:351:13:351:16 | None | test.rs:351:28:351:32 | false | match | -| test.rs:351:21:351:32 | ReturnExpr | test.rs:348:5:354:5 | exit test_let_with_return (normal) | return | -| test.rs:351:28:351:32 | false | test.rs:351:21:351:32 | ReturnExpr | | -| test.rs:353:9:353:12 | true | test.rs:348:53:354:5 | BlockExpr | | -| test.rs:359:5:362:5 | enter empty_tuple_pattern | test.rs:359:28:359:31 | unit | | -| test.rs:359:5:362:5 | exit empty_tuple_pattern (normal) | test.rs:359:5:362:5 | exit empty_tuple_pattern | | -| test.rs:359:28:359:31 | unit | test.rs:359:28:359:35 | Param | match | -| test.rs:359:28:359:35 | Param | test.rs:360:9:360:22 | LetStmt | | -| test.rs:360:9:360:22 | LetStmt | test.rs:360:18:360:21 | unit | | +| test.rs:351:21:351:32 | return false | test.rs:348:5:354:5 | exit fn test_let_with_return (normal) | return | +| test.rs:351:28:351:32 | false | test.rs:351:21:351:32 | return false | | +| test.rs:353:9:353:12 | true | test.rs:348:53:354:5 | { ... } | | +| test.rs:359:5:362:5 | enter fn empty_tuple_pattern | test.rs:359:28:359:31 | unit | | +| test.rs:359:5:362:5 | exit fn empty_tuple_pattern (normal) | test.rs:359:5:362:5 | exit fn empty_tuple_pattern | | +| test.rs:359:28:359:31 | unit | test.rs:359:28:359:35 | ...: ... | match | +| test.rs:359:28:359:35 | ...: ... | test.rs:360:9:360:22 | let ... = unit | | +| test.rs:360:9:360:22 | let ... = unit | test.rs:360:18:360:21 | unit | | | test.rs:360:13:360:14 | TuplePat | test.rs:361:9:361:15 | ExprStmt | match | | test.rs:360:18:360:21 | unit | test.rs:360:13:360:14 | TuplePat | | -| test.rs:361:9:361:14 | ReturnExpr | test.rs:359:5:362:5 | exit empty_tuple_pattern (normal) | return | -| test.rs:361:9:361:15 | ExprStmt | test.rs:361:9:361:14 | ReturnExpr | | -| test.rs:366:5:370:5 | enter empty_struct_pattern | test.rs:366:29:366:30 | st | | -| test.rs:366:5:370:5 | exit empty_struct_pattern (normal) | test.rs:366:5:370:5 | exit empty_struct_pattern | | -| test.rs:366:29:366:30 | st | test.rs:366:29:366:40 | Param | match | -| test.rs:366:29:366:40 | Param | test.rs:367:15:367:16 | st | | -| test.rs:366:50:370:5 | BlockExpr | test.rs:366:5:370:5 | exit empty_struct_pattern (normal) | | -| test.rs:367:9:369:9 | MatchExpr | test.rs:366:50:370:5 | BlockExpr | | -| test.rs:367:15:367:16 | st | test.rs:368:13:368:27 | RecordPat | | -| test.rs:368:13:368:27 | RecordPat | test.rs:368:24:368:25 | RestPat | match | -| test.rs:368:24:368:25 | RestPat | test.rs:368:32:368:32 | 1 | match | -| test.rs:368:32:368:32 | 1 | test.rs:367:9:369:9 | MatchExpr | | -| test.rs:372:5:379:5 | enter range_pattern | test.rs:373:15:373:16 | 42 | | -| test.rs:372:5:379:5 | exit range_pattern (normal) | test.rs:372:5:379:5 | exit range_pattern | | -| test.rs:372:31:379:5 | BlockExpr | test.rs:372:5:379:5 | exit range_pattern (normal) | | -| test.rs:373:9:378:9 | MatchExpr | test.rs:372:31:379:5 | BlockExpr | | +| test.rs:361:9:361:14 | return | test.rs:359:5:362:5 | exit fn empty_tuple_pattern (normal) | return | +| test.rs:361:9:361:15 | ExprStmt | test.rs:361:9:361:14 | return | | +| test.rs:366:5:370:5 | enter fn empty_struct_pattern | test.rs:366:29:366:30 | st | | +| test.rs:366:5:370:5 | exit fn empty_struct_pattern (normal) | test.rs:366:5:370:5 | exit fn empty_struct_pattern | | +| test.rs:366:29:366:30 | st | test.rs:366:29:366:40 | ...: MyStruct | match | +| test.rs:366:29:366:40 | ...: MyStruct | test.rs:367:15:367:16 | st | | +| test.rs:366:50:370:5 | { ... } | test.rs:366:5:370:5 | exit fn empty_struct_pattern (normal) | | +| test.rs:367:9:369:9 | match st { ... } | test.rs:366:50:370:5 | { ... } | | +| test.rs:367:15:367:16 | st | test.rs:368:13:368:27 | MyStruct {...} | | +| test.rs:368:13:368:27 | MyStruct {...} | test.rs:368:24:368:25 | .. | match | +| test.rs:368:24:368:25 | .. | test.rs:368:32:368:32 | 1 | match | +| test.rs:368:32:368:32 | 1 | test.rs:367:9:369:9 | match st { ... } | | +| test.rs:372:5:379:5 | enter fn range_pattern | test.rs:373:15:373:16 | 42 | | +| test.rs:372:5:379:5 | exit fn range_pattern (normal) | test.rs:372:5:379:5 | exit fn range_pattern | | +| test.rs:372:31:379:5 | { ... } | test.rs:372:5:379:5 | exit fn range_pattern (normal) | | +| test.rs:373:9:378:9 | match 42 { ... } | test.rs:372:31:379:5 | { ... } | | | test.rs:373:15:373:16 | 42 | test.rs:374:13:374:15 | RangePat | | | test.rs:374:13:374:15 | RangePat | test.rs:374:15:374:15 | 0 | match | | test.rs:374:13:374:15 | RangePat | test.rs:375:13:375:16 | RangePat | no-match | -| test.rs:374:15:374:15 | 0 | test.rs:374:15:374:15 | LiteralPat | | -| test.rs:374:15:374:15 | LiteralPat | test.rs:374:20:374:20 | 1 | match | -| test.rs:374:15:374:15 | LiteralPat | test.rs:375:13:375:16 | RangePat | no-match | -| test.rs:374:20:374:20 | 1 | test.rs:373:9:378:9 | MatchExpr | | -| test.rs:375:13:375:13 | 1 | test.rs:375:13:375:13 | LiteralPat | | -| test.rs:375:13:375:13 | LiteralPat | test.rs:375:16:375:16 | 2 | match | -| test.rs:375:13:375:13 | LiteralPat | test.rs:376:13:376:15 | RangePat | no-match | +| test.rs:374:15:374:15 | 0 | test.rs:374:15:374:15 | 0 | | +| test.rs:374:15:374:15 | 0 | test.rs:374:20:374:20 | 1 | match | +| test.rs:374:15:374:15 | 0 | test.rs:375:13:375:16 | RangePat | no-match | +| test.rs:374:20:374:20 | 1 | test.rs:373:9:378:9 | match 42 { ... } | | +| test.rs:375:13:375:13 | 1 | test.rs:375:13:375:13 | 1 | | +| test.rs:375:13:375:13 | 1 | test.rs:375:16:375:16 | 2 | match | +| test.rs:375:13:375:13 | 1 | test.rs:376:13:376:15 | RangePat | no-match | | test.rs:375:13:375:16 | RangePat | test.rs:375:13:375:13 | 1 | match | | test.rs:375:13:375:16 | RangePat | test.rs:376:13:376:15 | RangePat | no-match | -| test.rs:375:16:375:16 | 2 | test.rs:375:16:375:16 | LiteralPat | | -| test.rs:375:16:375:16 | LiteralPat | test.rs:375:21:375:21 | 2 | match | -| test.rs:375:16:375:16 | LiteralPat | test.rs:376:13:376:15 | RangePat | no-match | -| test.rs:375:21:375:21 | 2 | test.rs:373:9:378:9 | MatchExpr | | -| test.rs:376:13:376:13 | 5 | test.rs:376:13:376:13 | LiteralPat | | -| test.rs:376:13:376:13 | LiteralPat | test.rs:376:20:376:20 | 3 | match | -| test.rs:376:13:376:13 | LiteralPat | test.rs:377:13:377:13 | WildcardPat | no-match | +| test.rs:375:16:375:16 | 2 | test.rs:375:16:375:16 | 2 | | +| test.rs:375:16:375:16 | 2 | test.rs:375:21:375:21 | 2 | match | +| test.rs:375:16:375:16 | 2 | test.rs:376:13:376:15 | RangePat | no-match | +| test.rs:375:21:375:21 | 2 | test.rs:373:9:378:9 | match 42 { ... } | | +| test.rs:376:13:376:13 | 5 | test.rs:376:13:376:13 | 5 | | +| test.rs:376:13:376:13 | 5 | test.rs:376:20:376:20 | 3 | match | +| test.rs:376:13:376:13 | 5 | test.rs:377:13:377:13 | _ | no-match | | test.rs:376:13:376:15 | RangePat | test.rs:376:13:376:13 | 5 | match | -| test.rs:376:13:376:15 | RangePat | test.rs:377:13:377:13 | WildcardPat | no-match | -| test.rs:376:20:376:20 | 3 | test.rs:373:9:378:9 | MatchExpr | | -| test.rs:377:13:377:13 | WildcardPat | test.rs:377:18:377:18 | 4 | match | -| test.rs:377:18:377:18 | 4 | test.rs:373:9:378:9 | MatchExpr | | -| test.rs:383:5:388:5 | enter test_infinite_loop | test.rs:384:9:386:9 | ExprStmt | | +| test.rs:376:13:376:15 | RangePat | test.rs:377:13:377:13 | _ | no-match | +| test.rs:376:20:376:20 | 3 | test.rs:373:9:378:9 | match 42 { ... } | | +| test.rs:377:13:377:13 | _ | test.rs:377:18:377:18 | 4 | match | +| test.rs:377:18:377:18 | 4 | test.rs:373:9:378:9 | match 42 { ... } | | +| test.rs:383:5:388:5 | enter fn test_infinite_loop | test.rs:384:9:386:9 | ExprStmt | | | test.rs:384:9:386:9 | ExprStmt | test.rs:385:13:385:14 | TupleExpr | | -| test.rs:384:14:386:9 | BlockExpr | test.rs:385:13:385:14 | TupleExpr | | -| test.rs:385:13:385:14 | TupleExpr | test.rs:384:14:386:9 | BlockExpr | | -| test.rs:392:5:394:5 | enter say_hello | test.rs:393:9:393:34 | ExprStmt | | -| test.rs:392:5:394:5 | exit say_hello (normal) | test.rs:392:5:394:5 | exit say_hello | | -| test.rs:392:26:394:5 | BlockExpr | test.rs:392:5:394:5 | exit say_hello (normal) | | -| test.rs:393:9:393:33 | $crate::io::_print | test.rs:393:18:393:32 | "hello, world!\\n" | | -| test.rs:393:9:393:33 | MacroExpr | test.rs:392:26:394:5 | BlockExpr | | +| test.rs:384:14:386:9 | { ... } | test.rs:385:13:385:14 | TupleExpr | | +| test.rs:385:13:385:14 | TupleExpr | test.rs:384:14:386:9 | { ... } | | +| test.rs:392:5:394:5 | enter fn say_hello | test.rs:393:9:393:34 | ExprStmt | | +| test.rs:392:5:394:5 | exit fn say_hello (normal) | test.rs:392:5:394:5 | exit fn say_hello | | +| test.rs:392:26:394:5 | { ... } | test.rs:392:5:394:5 | exit fn say_hello (normal) | | +| test.rs:393:9:393:33 | ...::_print | test.rs:393:18:393:32 | "hello, world!\\n" | | +| test.rs:393:9:393:33 | MacroExpr | test.rs:392:26:394:5 | { ... } | | | test.rs:393:9:393:34 | ExprStmt | test.rs:393:18:393:32 | MacroStmts | | | test.rs:393:18:393:32 | "hello, world!\\n" | test.rs:393:18:393:32 | FormatArgsExpr | | -| test.rs:393:18:393:32 | BlockExpr | test.rs:393:9:393:33 | MacroExpr | | -| test.rs:393:18:393:32 | CallExpr | test.rs:393:18:393:32 | BlockExpr | | -| test.rs:393:18:393:32 | ExprStmt | test.rs:393:9:393:33 | $crate::io::_print | | +| test.rs:393:18:393:32 | ...::_print(...) | test.rs:393:18:393:32 | { ... } | | +| test.rs:393:18:393:32 | ExprStmt | test.rs:393:9:393:33 | ...::_print | | | test.rs:393:18:393:32 | FormatArgsExpr | test.rs:393:18:393:32 | MacroExpr | | -| test.rs:393:18:393:32 | MacroExpr | test.rs:393:18:393:32 | CallExpr | | +| test.rs:393:18:393:32 | MacroExpr | test.rs:393:18:393:32 | ...::_print(...) | | | test.rs:393:18:393:32 | MacroStmts | test.rs:393:18:393:32 | ExprStmt | | -| test.rs:396:5:415:5 | enter async_block | test.rs:396:26:396:26 | b | | -| test.rs:396:5:415:5 | exit async_block (normal) | test.rs:396:5:415:5 | exit async_block | | -| test.rs:396:26:396:26 | b | test.rs:396:26:396:32 | Param | match | -| test.rs:396:26:396:32 | Param | test.rs:397:9:399:10 | LetStmt | | -| test.rs:396:35:415:5 | BlockExpr | test.rs:396:5:415:5 | exit async_block (normal) | | -| test.rs:397:9:399:10 | LetStmt | test.rs:397:26:399:9 | BlockExpr | | -| test.rs:397:13:397:22 | say_godbye | test.rs:400:9:402:10 | LetStmt | match | -| test.rs:397:26:399:9 | BlockExpr | test.rs:397:13:397:22 | say_godbye | | -| test.rs:397:26:399:9 | enter BlockExpr | test.rs:398:13:398:42 | ExprStmt | | -| test.rs:397:26:399:9 | exit BlockExpr (normal) | test.rs:397:26:399:9 | exit BlockExpr | | -| test.rs:398:13:398:41 | $crate::io::_print | test.rs:398:22:398:40 | "godbye, everyone!\\n" | | -| test.rs:398:13:398:41 | MacroExpr | test.rs:397:26:399:9 | exit BlockExpr (normal) | | +| test.rs:393:18:393:32 | { ... } | test.rs:393:9:393:33 | MacroExpr | | +| test.rs:396:5:415:5 | enter fn async_block | test.rs:396:26:396:26 | b | | +| test.rs:396:5:415:5 | exit fn async_block (normal) | test.rs:396:5:415:5 | exit fn async_block | | +| test.rs:396:26:396:26 | b | test.rs:396:26:396:32 | ...: bool | match | +| test.rs:396:26:396:32 | ...: bool | test.rs:397:9:399:10 | let ... = ... | | +| test.rs:396:35:415:5 | { ... } | test.rs:396:5:415:5 | exit fn async_block (normal) | | +| test.rs:397:9:399:10 | let ... = ... | test.rs:397:26:399:9 | { ... } | | +| test.rs:397:13:397:22 | say_godbye | test.rs:400:9:402:10 | let ... = ... | match | +| test.rs:397:26:399:9 | enter { ... } | test.rs:398:13:398:42 | ExprStmt | | +| test.rs:397:26:399:9 | exit { ... } (normal) | test.rs:397:26:399:9 | exit { ... } | | +| test.rs:397:26:399:9 | { ... } | test.rs:397:13:397:22 | say_godbye | | +| test.rs:398:13:398:41 | ...::_print | test.rs:398:22:398:40 | "godbye, everyone!\\n" | | +| test.rs:398:13:398:41 | MacroExpr | test.rs:397:26:399:9 | exit { ... } (normal) | | | test.rs:398:13:398:42 | ExprStmt | test.rs:398:22:398:40 | MacroStmts | | | test.rs:398:22:398:40 | "godbye, everyone!\\n" | test.rs:398:22:398:40 | FormatArgsExpr | | -| test.rs:398:22:398:40 | BlockExpr | test.rs:398:13:398:41 | MacroExpr | | -| test.rs:398:22:398:40 | CallExpr | test.rs:398:22:398:40 | BlockExpr | | -| test.rs:398:22:398:40 | ExprStmt | test.rs:398:13:398:41 | $crate::io::_print | | +| test.rs:398:22:398:40 | ...::_print(...) | test.rs:398:22:398:40 | { ... } | | +| test.rs:398:22:398:40 | ExprStmt | test.rs:398:13:398:41 | ...::_print | | | test.rs:398:22:398:40 | FormatArgsExpr | test.rs:398:22:398:40 | MacroExpr | | -| test.rs:398:22:398:40 | MacroExpr | test.rs:398:22:398:40 | CallExpr | | +| test.rs:398:22:398:40 | MacroExpr | test.rs:398:22:398:40 | ...::_print(...) | | | test.rs:398:22:398:40 | MacroStmts | test.rs:398:22:398:40 | ExprStmt | | -| test.rs:400:9:402:10 | LetStmt | test.rs:400:31:402:9 | BlockExpr | | -| test.rs:400:13:400:27 | say_how_are_you | test.rs:403:9:403:28 | LetStmt | match | -| test.rs:400:31:402:9 | BlockExpr | test.rs:400:13:400:27 | say_how_are_you | | -| test.rs:400:31:402:9 | enter BlockExpr | test.rs:401:13:401:37 | ExprStmt | | -| test.rs:400:31:402:9 | exit BlockExpr (normal) | test.rs:400:31:402:9 | exit BlockExpr | | -| test.rs:401:13:401:36 | $crate::io::_print | test.rs:401:22:401:35 | "how are you?\\n" | | -| test.rs:401:13:401:36 | MacroExpr | test.rs:400:31:402:9 | exit BlockExpr (normal) | | +| test.rs:398:22:398:40 | { ... } | test.rs:398:13:398:41 | MacroExpr | | +| test.rs:400:9:402:10 | let ... = ... | test.rs:400:31:402:9 | { ... } | | +| test.rs:400:13:400:27 | say_how_are_you | test.rs:403:9:403:28 | let ... = ... | match | +| test.rs:400:31:402:9 | enter { ... } | test.rs:401:13:401:37 | ExprStmt | | +| test.rs:400:31:402:9 | exit { ... } (normal) | test.rs:400:31:402:9 | exit { ... } | | +| test.rs:400:31:402:9 | { ... } | test.rs:400:13:400:27 | say_how_are_you | | +| test.rs:401:13:401:36 | ...::_print | test.rs:401:22:401:35 | "how are you?\\n" | | +| test.rs:401:13:401:36 | MacroExpr | test.rs:400:31:402:9 | exit { ... } (normal) | | | test.rs:401:13:401:37 | ExprStmt | test.rs:401:22:401:35 | MacroStmts | | | test.rs:401:22:401:35 | "how are you?\\n" | test.rs:401:22:401:35 | FormatArgsExpr | | -| test.rs:401:22:401:35 | BlockExpr | test.rs:401:13:401:36 | MacroExpr | | -| test.rs:401:22:401:35 | CallExpr | test.rs:401:22:401:35 | BlockExpr | | -| test.rs:401:22:401:35 | ExprStmt | test.rs:401:13:401:36 | $crate::io::_print | | +| test.rs:401:22:401:35 | ...::_print(...) | test.rs:401:22:401:35 | { ... } | | +| test.rs:401:22:401:35 | ExprStmt | test.rs:401:13:401:36 | ...::_print | | | test.rs:401:22:401:35 | FormatArgsExpr | test.rs:401:22:401:35 | MacroExpr | | -| test.rs:401:22:401:35 | MacroExpr | test.rs:401:22:401:35 | CallExpr | | +| test.rs:401:22:401:35 | MacroExpr | test.rs:401:22:401:35 | ...::_print(...) | | | test.rs:401:22:401:35 | MacroStmts | test.rs:401:22:401:35 | ExprStmt | | -| test.rs:403:9:403:28 | LetStmt | test.rs:403:20:403:27 | BlockExpr | | +| test.rs:401:22:401:35 | { ... } | test.rs:401:13:401:36 | MacroExpr | | +| test.rs:403:9:403:28 | let ... = ... | test.rs:403:20:403:27 | { ... } | | | test.rs:403:13:403:16 | noop | test.rs:404:9:404:26 | ExprStmt | match | -| test.rs:403:20:403:27 | BlockExpr | test.rs:403:13:403:16 | noop | | -| test.rs:404:9:404:17 | say_hello | test.rs:404:9:404:19 | CallExpr | | -| test.rs:404:9:404:19 | CallExpr | test.rs:404:9:404:25 | AwaitExpr | | -| test.rs:404:9:404:25 | AwaitExpr | test.rs:405:9:405:30 | ExprStmt | | +| test.rs:403:20:403:27 | { ... } | test.rs:403:13:403:16 | noop | | +| test.rs:404:9:404:17 | say_hello | test.rs:404:9:404:19 | say_hello(...) | | +| test.rs:404:9:404:19 | say_hello(...) | test.rs:404:9:404:25 | await ... | | +| test.rs:404:9:404:25 | await ... | test.rs:405:9:405:30 | ExprStmt | | | test.rs:404:9:404:26 | ExprStmt | test.rs:404:9:404:17 | say_hello | | -| test.rs:405:9:405:23 | say_how_are_you | test.rs:405:9:405:29 | AwaitExpr | | -| test.rs:405:9:405:29 | AwaitExpr | test.rs:406:9:406:25 | ExprStmt | | +| test.rs:405:9:405:23 | say_how_are_you | test.rs:405:9:405:29 | await say_how_are_you | | +| test.rs:405:9:405:29 | await say_how_are_you | test.rs:406:9:406:25 | ExprStmt | | | test.rs:405:9:405:30 | ExprStmt | test.rs:405:9:405:23 | say_how_are_you | | -| test.rs:406:9:406:18 | say_godbye | test.rs:406:9:406:24 | AwaitExpr | | -| test.rs:406:9:406:24 | AwaitExpr | test.rs:407:9:407:19 | ExprStmt | | +| test.rs:406:9:406:18 | say_godbye | test.rs:406:9:406:24 | await say_godbye | | +| test.rs:406:9:406:24 | await say_godbye | test.rs:407:9:407:19 | ExprStmt | | | test.rs:406:9:406:25 | ExprStmt | test.rs:406:9:406:18 | say_godbye | | -| test.rs:407:9:407:12 | noop | test.rs:407:9:407:18 | AwaitExpr | | -| test.rs:407:9:407:18 | AwaitExpr | test.rs:409:9:414:10 | LetStmt | | +| test.rs:407:9:407:12 | noop | test.rs:407:9:407:18 | await noop | | +| test.rs:407:9:407:18 | await noop | test.rs:409:9:414:10 | let ... = ... | | | test.rs:407:9:407:19 | ExprStmt | test.rs:407:9:407:12 | noop | | -| test.rs:409:9:414:10 | LetStmt | test.rs:409:22:414:9 | ClosureExpr | | -| test.rs:409:13:409:18 | lambda | test.rs:396:35:415:5 | BlockExpr | match | -| test.rs:409:22:414:9 | ClosureExpr | test.rs:409:13:409:18 | lambda | | -| test.rs:409:22:414:9 | enter ClosureExpr | test.rs:409:23:409:25 | foo | | -| test.rs:409:22:414:9 | exit ClosureExpr (normal) | test.rs:409:22:414:9 | exit ClosureExpr | | -| test.rs:409:23:409:25 | Param | test.rs:409:28:414:9 | BlockExpr | | -| test.rs:409:23:409:25 | foo | test.rs:409:23:409:25 | Param | match | -| test.rs:409:28:414:9 | BlockExpr | test.rs:409:22:414:9 | exit ClosureExpr (normal) | | -| test.rs:409:28:414:9 | enter BlockExpr | test.rs:410:13:412:14 | ExprStmt | | -| test.rs:409:28:414:9 | exit BlockExpr (normal) | test.rs:409:28:414:9 | exit BlockExpr | | -| test.rs:410:13:412:13 | IfExpr | test.rs:413:13:413:15 | foo | | +| test.rs:409:9:414:10 | let ... = ... | test.rs:409:22:414:9 | \|...\| ... | | +| test.rs:409:13:409:18 | lambda | test.rs:396:35:415:5 | { ... } | match | +| test.rs:409:22:414:9 | \|...\| ... | test.rs:409:13:409:18 | lambda | | +| test.rs:409:22:414:9 | enter \|...\| ... | test.rs:409:23:409:25 | foo | | +| test.rs:409:22:414:9 | exit \|...\| ... (normal) | test.rs:409:22:414:9 | exit \|...\| ... | | +| test.rs:409:23:409:25 | ... | test.rs:409:28:414:9 | { ... } | | +| test.rs:409:23:409:25 | foo | test.rs:409:23:409:25 | ... | match | +| test.rs:409:28:414:9 | enter { ... } | test.rs:410:13:412:14 | ExprStmt | | +| test.rs:409:28:414:9 | exit { ... } (normal) | test.rs:409:28:414:9 | exit { ... } | | +| test.rs:409:28:414:9 | { ... } | test.rs:409:22:414:9 | exit \|...\| ... (normal) | | +| test.rs:410:13:412:13 | if b {...} | test.rs:413:13:413:15 | foo | | | test.rs:410:13:412:14 | ExprStmt | test.rs:410:16:410:16 | b | | -| test.rs:410:16:410:16 | b | test.rs:410:13:412:13 | IfExpr | false | +| test.rs:410:16:410:16 | b | test.rs:410:13:412:13 | if b {...} | false | | test.rs:410:16:410:16 | b | test.rs:411:17:411:41 | ExprStmt | true | -| test.rs:411:17:411:40 | ReturnExpr | test.rs:409:28:414:9 | exit BlockExpr (normal) | return | +| test.rs:411:17:411:40 | return ... | test.rs:409:28:414:9 | exit { ... } (normal) | return | | test.rs:411:17:411:41 | ExprStmt | test.rs:411:24:411:34 | async_block | | | test.rs:411:24:411:34 | async_block | test.rs:411:36:411:39 | true | | -| test.rs:411:24:411:40 | CallExpr | test.rs:411:17:411:40 | ReturnExpr | | -| test.rs:411:36:411:39 | true | test.rs:411:24:411:40 | CallExpr | | -| test.rs:413:13:413:15 | foo | test.rs:409:28:414:9 | exit BlockExpr (normal) | | -| test.rs:421:5:423:5 | enter add_two | test.rs:421:22:421:22 | n | | -| test.rs:421:5:423:5 | exit add_two (normal) | test.rs:421:5:423:5 | exit add_two | | -| test.rs:421:22:421:22 | n | test.rs:421:22:421:27 | Param | match | -| test.rs:421:22:421:27 | Param | test.rs:422:9:422:9 | n | | -| test.rs:421:37:423:5 | BlockExpr | test.rs:421:5:423:5 | exit add_two (normal) | | +| test.rs:411:24:411:40 | async_block(...) | test.rs:411:17:411:40 | return ... | | +| test.rs:411:36:411:39 | true | test.rs:411:24:411:40 | async_block(...) | | +| test.rs:413:13:413:15 | foo | test.rs:409:28:414:9 | exit { ... } (normal) | | +| test.rs:421:5:423:5 | enter fn add_two | test.rs:421:22:421:22 | n | | +| test.rs:421:5:423:5 | exit fn add_two (normal) | test.rs:421:5:423:5 | exit fn add_two | | +| test.rs:421:22:421:22 | n | test.rs:421:22:421:27 | ...: i64 | match | +| test.rs:421:22:421:27 | ...: i64 | test.rs:422:9:422:9 | n | | +| test.rs:421:37:423:5 | { ... } | test.rs:421:5:423:5 | exit fn add_two (normal) | | | test.rs:422:9:422:9 | n | test.rs:422:13:422:13 | 2 | | -| test.rs:422:9:422:13 | ... + ... | test.rs:421:37:423:5 | BlockExpr | | +| test.rs:422:9:422:13 | ... + ... | test.rs:421:37:423:5 | { ... } | | | test.rs:422:13:422:13 | 2 | test.rs:422:9:422:13 | ... + ... | | -| test.rs:427:5:435:5 | enter const_block_assert | test.rs:430:9:432:9 | ExprStmt | | -| test.rs:427:5:435:5 | exit const_block_assert (normal) | test.rs:427:5:435:5 | exit const_block_assert | | -| test.rs:427:41:435:5 | BlockExpr | test.rs:427:5:435:5 | exit const_block_assert (normal) | | -| test.rs:430:9:432:9 | BlockExpr | test.rs:434:9:434:10 | 42 | | +| test.rs:427:5:435:5 | enter fn const_block_assert | test.rs:430:9:432:9 | ExprStmt | | +| test.rs:427:5:435:5 | exit fn const_block_assert (normal) | test.rs:427:5:435:5 | exit fn const_block_assert | | +| test.rs:427:41:435:5 | { ... } | test.rs:427:5:435:5 | exit fn const_block_assert (normal) | | | test.rs:430:9:432:9 | ExprStmt | test.rs:431:13:431:50 | ExprStmt | | -| test.rs:431:13:431:49 | $crate::panicking::panic_explicit | test.rs:431:13:431:49 | CallExpr | | -| test.rs:431:13:431:49 | BlockExpr | test.rs:431:13:431:49 | MacroExpr | | -| test.rs:431:13:431:49 | BlockExpr | test.rs:431:13:431:49 | exit panic_cold_explicit (normal) | | -| test.rs:431:13:431:49 | BlockExpr | test.rs:431:21:431:48 | IfExpr | | -| test.rs:431:13:431:49 | CallExpr | test.rs:431:13:431:49 | BlockExpr | | -| test.rs:431:13:431:49 | CallExpr | test.rs:431:13:431:49 | BlockExpr | | +| test.rs:430:9:432:9 | { ... } | test.rs:434:9:434:10 | 42 | | +| test.rs:431:13:431:49 | ...::panic_explicit | test.rs:431:13:431:49 | ...::panic_explicit(...) | | +| test.rs:431:13:431:49 | ...::panic_explicit(...) | test.rs:431:13:431:49 | { ... } | | | test.rs:431:13:431:49 | ExprStmt | test.rs:431:13:431:49 | MacroStmts | | | test.rs:431:13:431:49 | ExprStmt | test.rs:431:13:431:49 | panic_cold_explicit | | -| test.rs:431:13:431:49 | MacroExpr | test.rs:430:9:432:9 | BlockExpr | | -| test.rs:431:13:431:49 | MacroExpr | test.rs:431:13:431:49 | BlockExpr | | -| test.rs:431:13:431:49 | MacroStmts | test.rs:431:13:431:49 | panic_cold_explicit | | -| test.rs:431:13:431:49 | enter panic_cold_explicit | test.rs:431:13:431:49 | $crate::panicking::panic_explicit | | -| test.rs:431:13:431:49 | exit panic_cold_explicit (normal) | test.rs:431:13:431:49 | exit panic_cold_explicit | | -| test.rs:431:13:431:49 | panic_cold_explicit | test.rs:431:13:431:49 | CallExpr | | -| test.rs:431:13:431:49 | panic_cold_explicit | test.rs:431:13:431:49 | ExprStmt | | +| test.rs:431:13:431:49 | MacroExpr | test.rs:430:9:432:9 | { ... } | | +| test.rs:431:13:431:49 | MacroExpr | test.rs:431:13:431:49 | { ... } | | +| test.rs:431:13:431:49 | MacroStmts | test.rs:431:13:431:49 | fn panic_cold_explicit | | +| test.rs:431:13:431:49 | enter fn panic_cold_explicit | test.rs:431:13:431:49 | ...::panic_explicit | | +| test.rs:431:13:431:49 | exit fn panic_cold_explicit (normal) | test.rs:431:13:431:49 | exit fn panic_cold_explicit | | +| test.rs:431:13:431:49 | fn panic_cold_explicit | test.rs:431:13:431:49 | ExprStmt | | +| test.rs:431:13:431:49 | panic_cold_explicit | test.rs:431:13:431:49 | panic_cold_explicit(...) | | +| test.rs:431:13:431:49 | panic_cold_explicit(...) | test.rs:431:13:431:49 | { ... } | | +| test.rs:431:13:431:49 | { ... } | test.rs:431:13:431:49 | MacroExpr | | +| test.rs:431:13:431:49 | { ... } | test.rs:431:13:431:49 | exit fn panic_cold_explicit (normal) | | +| test.rs:431:13:431:49 | { ... } | test.rs:431:21:431:48 | if ... {...} | | | test.rs:431:13:431:50 | ExprStmt | test.rs:431:21:431:48 | MacroStmts | | -| test.rs:431:21:431:42 | std::mem::size_of::<...> | test.rs:431:21:431:44 | CallExpr | | -| test.rs:431:21:431:44 | CallExpr | test.rs:431:48:431:48 | 0 | | +| test.rs:431:21:431:42 | ...::size_of::<...> | test.rs:431:21:431:44 | ...::size_of::<...>(...) | | +| test.rs:431:21:431:44 | ...::size_of::<...>(...) | test.rs:431:48:431:48 | 0 | | | test.rs:431:21:431:48 | ... > ... | test.rs:431:21:431:48 | [boolean(false)] ! ... | true | | test.rs:431:21:431:48 | ... > ... | test.rs:431:21:431:48 | [boolean(true)] ! ... | false | -| test.rs:431:21:431:48 | BlockExpr | test.rs:431:13:431:49 | MacroExpr | | -| test.rs:431:21:431:48 | IfExpr | test.rs:431:21:431:48 | BlockExpr | | -| test.rs:431:21:431:48 | MacroStmts | test.rs:431:21:431:42 | std::mem::size_of::<...> | | -| test.rs:431:21:431:48 | [boolean(false)] ! ... | test.rs:431:21:431:48 | IfExpr | false | +| test.rs:431:21:431:48 | MacroStmts | test.rs:431:21:431:42 | ...::size_of::<...> | | +| test.rs:431:21:431:48 | [boolean(false)] ! ... | test.rs:431:21:431:48 | if ... {...} | false | | test.rs:431:21:431:48 | [boolean(true)] ! ... | test.rs:431:13:431:49 | ExprStmt | true | +| test.rs:431:21:431:48 | if ... {...} | test.rs:431:21:431:48 | { ... } | | +| test.rs:431:21:431:48 | { ... } | test.rs:431:13:431:49 | MacroExpr | | | test.rs:431:48:431:48 | 0 | test.rs:431:21:431:48 | ... > ... | | -| test.rs:434:9:434:10 | 42 | test.rs:427:41:435:5 | BlockExpr | | -| test.rs:437:5:446:5 | enter const_block_panic | test.rs:438:9:438:30 | Const | | -| test.rs:437:5:446:5 | exit const_block_panic (normal) | test.rs:437:5:446:5 | exit const_block_panic | | -| test.rs:437:35:446:5 | BlockExpr | test.rs:437:5:446:5 | exit const_block_panic (normal) | | +| test.rs:434:9:434:10 | 42 | test.rs:427:41:435:5 | { ... } | | +| test.rs:437:5:446:5 | enter fn const_block_panic | test.rs:438:9:438:30 | Const | | +| test.rs:437:5:446:5 | exit fn const_block_panic (normal) | test.rs:437:5:446:5 | exit fn const_block_panic | | +| test.rs:437:35:446:5 | { ... } | test.rs:437:5:446:5 | exit fn const_block_panic (normal) | | | test.rs:438:9:438:30 | Const | test.rs:439:9:444:9 | ExprStmt | | | test.rs:439:9:444:9 | ExprStmt | test.rs:439:12:439:16 | false | | -| test.rs:439:9:444:9 | IfExpr | test.rs:445:9:445:9 | N | | -| test.rs:439:12:439:16 | false | test.rs:439:9:444:9 | IfExpr | false | -| test.rs:442:17:442:24 | $crate::panicking::panic_explicit | test.rs:442:17:442:24 | CallExpr | | -| test.rs:442:17:442:24 | BlockExpr | test.rs:442:17:442:24 | exit panic_cold_explicit (normal) | | -| test.rs:442:17:442:24 | CallExpr | test.rs:442:17:442:24 | BlockExpr | | -| test.rs:442:17:442:24 | enter panic_cold_explicit | test.rs:442:17:442:24 | $crate::panicking::panic_explicit | | -| test.rs:442:17:442:24 | exit panic_cold_explicit (normal) | test.rs:442:17:442:24 | exit panic_cold_explicit | | -| test.rs:445:9:445:9 | N | test.rs:437:35:446:5 | BlockExpr | | -| test.rs:449:1:454:1 | enter dead_code | test.rs:450:5:452:5 | ExprStmt | | -| test.rs:449:1:454:1 | exit dead_code (normal) | test.rs:449:1:454:1 | exit dead_code | | +| test.rs:439:9:444:9 | if false {...} | test.rs:445:9:445:9 | N | | +| test.rs:439:12:439:16 | false | test.rs:439:9:444:9 | if false {...} | false | +| test.rs:442:17:442:24 | ...::panic_explicit | test.rs:442:17:442:24 | ...::panic_explicit(...) | | +| test.rs:442:17:442:24 | ...::panic_explicit(...) | test.rs:442:17:442:24 | { ... } | | +| test.rs:442:17:442:24 | enter fn panic_cold_explicit | test.rs:442:17:442:24 | ...::panic_explicit | | +| test.rs:442:17:442:24 | exit fn panic_cold_explicit (normal) | test.rs:442:17:442:24 | exit fn panic_cold_explicit | | +| test.rs:442:17:442:24 | { ... } | test.rs:442:17:442:24 | exit fn panic_cold_explicit (normal) | | +| test.rs:445:9:445:9 | N | test.rs:437:35:446:5 | { ... } | | +| test.rs:449:1:454:1 | enter fn dead_code | test.rs:450:5:452:5 | ExprStmt | | +| test.rs:449:1:454:1 | exit fn dead_code (normal) | test.rs:449:1:454:1 | exit fn dead_code | | | test.rs:450:5:452:5 | ExprStmt | test.rs:450:9:450:12 | true | | | test.rs:450:9:450:12 | true | test.rs:451:9:451:17 | ExprStmt | true | -| test.rs:451:9:451:16 | ReturnExpr | test.rs:449:1:454:1 | exit dead_code (normal) | return | +| test.rs:451:9:451:16 | return 0 | test.rs:449:1:454:1 | exit fn dead_code (normal) | return | | test.rs:451:9:451:17 | ExprStmt | test.rs:451:16:451:16 | 0 | | -| test.rs:451:16:451:16 | 0 | test.rs:451:9:451:16 | ReturnExpr | | -| test.rs:456:1:456:16 | enter do_thing | test.rs:456:15:456:16 | BlockExpr | | -| test.rs:456:1:456:16 | exit do_thing (normal) | test.rs:456:1:456:16 | exit do_thing | | -| test.rs:456:15:456:16 | BlockExpr | test.rs:456:1:456:16 | exit do_thing (normal) | | -| test.rs:458:1:460:1 | enter condition_not_met | test.rs:459:5:459:9 | false | | -| test.rs:458:1:460:1 | exit condition_not_met (normal) | test.rs:458:1:460:1 | exit condition_not_met | | -| test.rs:458:32:460:1 | BlockExpr | test.rs:458:1:460:1 | exit condition_not_met (normal) | | -| test.rs:459:5:459:9 | false | test.rs:458:32:460:1 | BlockExpr | | -| test.rs:462:1:462:21 | enter do_next_thing | test.rs:462:20:462:21 | BlockExpr | | -| test.rs:462:1:462:21 | exit do_next_thing (normal) | test.rs:462:1:462:21 | exit do_next_thing | | -| test.rs:462:20:462:21 | BlockExpr | test.rs:462:1:462:21 | exit do_next_thing (normal) | | -| test.rs:464:1:464:21 | enter do_last_thing | test.rs:464:20:464:21 | BlockExpr | | -| test.rs:464:1:464:21 | exit do_last_thing (normal) | test.rs:464:1:464:21 | exit do_last_thing | | -| test.rs:464:20:464:21 | BlockExpr | test.rs:464:1:464:21 | exit do_last_thing (normal) | | -| test.rs:466:1:480:1 | enter labelled_block1 | test.rs:467:5:478:6 | LetStmt | | -| test.rs:466:1:480:1 | exit labelled_block1 (normal) | test.rs:466:1:480:1 | exit labelled_block1 | | -| test.rs:466:29:480:1 | BlockExpr | test.rs:466:1:480:1 | exit labelled_block1 (normal) | | -| test.rs:467:5:478:6 | LetStmt | test.rs:468:9:468:19 | ExprStmt | | +| test.rs:451:16:451:16 | 0 | test.rs:451:9:451:16 | return 0 | | +| test.rs:456:1:456:16 | enter fn do_thing | test.rs:456:15:456:16 | { ... } | | +| test.rs:456:1:456:16 | exit fn do_thing (normal) | test.rs:456:1:456:16 | exit fn do_thing | | +| test.rs:456:15:456:16 | { ... } | test.rs:456:1:456:16 | exit fn do_thing (normal) | | +| test.rs:458:1:460:1 | enter fn condition_not_met | test.rs:459:5:459:9 | false | | +| test.rs:458:1:460:1 | exit fn condition_not_met (normal) | test.rs:458:1:460:1 | exit fn condition_not_met | | +| test.rs:458:32:460:1 | { ... } | test.rs:458:1:460:1 | exit fn condition_not_met (normal) | | +| test.rs:459:5:459:9 | false | test.rs:458:32:460:1 | { ... } | | +| test.rs:462:1:462:21 | enter fn do_next_thing | test.rs:462:20:462:21 | { ... } | | +| test.rs:462:1:462:21 | exit fn do_next_thing (normal) | test.rs:462:1:462:21 | exit fn do_next_thing | | +| test.rs:462:20:462:21 | { ... } | test.rs:462:1:462:21 | exit fn do_next_thing (normal) | | +| test.rs:464:1:464:21 | enter fn do_last_thing | test.rs:464:20:464:21 | { ... } | | +| test.rs:464:1:464:21 | exit fn do_last_thing (normal) | test.rs:464:1:464:21 | exit fn do_last_thing | | +| test.rs:464:20:464:21 | { ... } | test.rs:464:1:464:21 | exit fn do_last_thing (normal) | | +| test.rs:466:1:480:1 | enter fn labelled_block1 | test.rs:467:5:478:6 | let ... = ... | | +| test.rs:466:1:480:1 | exit fn labelled_block1 (normal) | test.rs:466:1:480:1 | exit fn labelled_block1 | | +| test.rs:466:29:480:1 | { ... } | test.rs:466:1:480:1 | exit fn labelled_block1 (normal) | | +| test.rs:467:5:478:6 | let ... = ... | test.rs:468:9:468:19 | ExprStmt | | | test.rs:467:9:467:14 | result | test.rs:479:5:479:10 | result | match | -| test.rs:467:18:478:5 | BlockExpr | test.rs:467:9:467:14 | result | | -| test.rs:468:9:468:16 | do_thing | test.rs:468:9:468:18 | CallExpr | | -| test.rs:468:9:468:18 | CallExpr | test.rs:469:9:471:9 | ExprStmt | | +| test.rs:467:18:478:5 | 'block: { ... } | test.rs:467:9:467:14 | result | | +| test.rs:468:9:468:16 | do_thing | test.rs:468:9:468:18 | do_thing(...) | | +| test.rs:468:9:468:18 | do_thing(...) | test.rs:469:9:471:9 | ExprStmt | | | test.rs:468:9:468:19 | ExprStmt | test.rs:468:9:468:16 | do_thing | | | test.rs:469:9:471:9 | ExprStmt | test.rs:469:12:469:28 | condition_not_met | | -| test.rs:469:9:471:9 | IfExpr | test.rs:472:9:472:24 | ExprStmt | | -| test.rs:469:12:469:28 | condition_not_met | test.rs:469:12:469:30 | CallExpr | | -| test.rs:469:12:469:30 | CallExpr | test.rs:469:9:471:9 | IfExpr | false | -| test.rs:469:12:469:30 | CallExpr | test.rs:470:13:470:27 | ExprStmt | true | -| test.rs:470:13:470:26 | BreakExpr | test.rs:467:18:478:5 | BlockExpr | break | +| test.rs:469:9:471:9 | if ... {...} | test.rs:472:9:472:24 | ExprStmt | | +| test.rs:469:12:469:28 | condition_not_met | test.rs:469:12:469:30 | condition_not_met(...) | | +| test.rs:469:12:469:30 | condition_not_met(...) | test.rs:469:9:471:9 | if ... {...} | false | +| test.rs:469:12:469:30 | condition_not_met(...) | test.rs:470:13:470:27 | ExprStmt | true | +| test.rs:470:13:470:26 | break ''block 1 | test.rs:467:18:478:5 | 'block: { ... } | break | | test.rs:470:13:470:27 | ExprStmt | test.rs:470:26:470:26 | 1 | | -| test.rs:470:26:470:26 | 1 | test.rs:470:13:470:26 | BreakExpr | | -| test.rs:472:9:472:21 | do_next_thing | test.rs:472:9:472:23 | CallExpr | | -| test.rs:472:9:472:23 | CallExpr | test.rs:473:9:475:9 | ExprStmt | | +| test.rs:470:26:470:26 | 1 | test.rs:470:13:470:26 | break ''block 1 | | +| test.rs:472:9:472:21 | do_next_thing | test.rs:472:9:472:23 | do_next_thing(...) | | +| test.rs:472:9:472:23 | do_next_thing(...) | test.rs:473:9:475:9 | ExprStmt | | | test.rs:472:9:472:24 | ExprStmt | test.rs:472:9:472:21 | do_next_thing | | | test.rs:473:9:475:9 | ExprStmt | test.rs:473:12:473:28 | condition_not_met | | -| test.rs:473:9:475:9 | IfExpr | test.rs:476:9:476:24 | ExprStmt | | -| test.rs:473:12:473:28 | condition_not_met | test.rs:473:12:473:30 | CallExpr | | -| test.rs:473:12:473:30 | CallExpr | test.rs:473:9:475:9 | IfExpr | false | -| test.rs:473:12:473:30 | CallExpr | test.rs:474:13:474:27 | ExprStmt | true | -| test.rs:474:13:474:26 | BreakExpr | test.rs:467:18:478:5 | BlockExpr | break | +| test.rs:473:9:475:9 | if ... {...} | test.rs:476:9:476:24 | ExprStmt | | +| test.rs:473:12:473:28 | condition_not_met | test.rs:473:12:473:30 | condition_not_met(...) | | +| test.rs:473:12:473:30 | condition_not_met(...) | test.rs:473:9:475:9 | if ... {...} | false | +| test.rs:473:12:473:30 | condition_not_met(...) | test.rs:474:13:474:27 | ExprStmt | true | +| test.rs:474:13:474:26 | break ''block 2 | test.rs:467:18:478:5 | 'block: { ... } | break | | test.rs:474:13:474:27 | ExprStmt | test.rs:474:26:474:26 | 2 | | -| test.rs:474:26:474:26 | 2 | test.rs:474:13:474:26 | BreakExpr | | -| test.rs:476:9:476:21 | do_last_thing | test.rs:476:9:476:23 | CallExpr | | -| test.rs:476:9:476:23 | CallExpr | test.rs:477:9:477:9 | 3 | | +| test.rs:474:26:474:26 | 2 | test.rs:474:13:474:26 | break ''block 2 | | +| test.rs:476:9:476:21 | do_last_thing | test.rs:476:9:476:23 | do_last_thing(...) | | +| test.rs:476:9:476:23 | do_last_thing(...) | test.rs:477:9:477:9 | 3 | | | test.rs:476:9:476:24 | ExprStmt | test.rs:476:9:476:21 | do_last_thing | | -| test.rs:477:9:477:9 | 3 | test.rs:467:18:478:5 | BlockExpr | | -| test.rs:479:5:479:10 | result | test.rs:466:29:480:1 | BlockExpr | | -| test.rs:482:1:490:1 | enter labelled_block2 | test.rs:483:5:489:6 | LetStmt | | -| test.rs:482:1:490:1 | exit labelled_block2 (normal) | test.rs:482:1:490:1 | exit labelled_block2 | | -| test.rs:482:22:490:1 | BlockExpr | test.rs:482:1:490:1 | exit labelled_block2 (normal) | | -| test.rs:483:5:489:6 | LetStmt | test.rs:484:9:484:34 | LetStmt | | -| test.rs:483:9:483:14 | result | test.rs:482:22:490:1 | BlockExpr | match | -| test.rs:483:18:489:5 | BlockExpr | test.rs:483:9:483:14 | result | | -| test.rs:484:9:484:34 | LetStmt | test.rs:484:30:484:33 | None | | -| test.rs:484:13:484:13 | x | test.rs:485:9:487:10 | LetStmt | match | +| test.rs:477:9:477:9 | 3 | test.rs:467:18:478:5 | 'block: { ... } | | +| test.rs:479:5:479:10 | result | test.rs:466:29:480:1 | { ... } | | +| test.rs:482:1:490:1 | enter fn labelled_block2 | test.rs:483:5:489:6 | let ... = ... | | +| test.rs:482:1:490:1 | exit fn labelled_block2 (normal) | test.rs:482:1:490:1 | exit fn labelled_block2 | | +| test.rs:482:22:490:1 | { ... } | test.rs:482:1:490:1 | exit fn labelled_block2 (normal) | | +| test.rs:483:5:489:6 | let ... = ... | test.rs:484:9:484:34 | let ... = None | | +| test.rs:483:9:483:14 | result | test.rs:482:22:490:1 | { ... } | match | +| test.rs:483:18:489:5 | 'block: { ... } | test.rs:483:9:483:14 | result | | +| test.rs:484:9:484:34 | let ... = None | test.rs:484:30:484:33 | None | | +| test.rs:484:13:484:13 | x | test.rs:485:9:487:10 | let ... = x else {...} | match | | test.rs:484:30:484:33 | None | test.rs:484:13:484:13 | x | | -| test.rs:485:9:487:10 | LetStmt | test.rs:485:23:485:23 | x | | +| test.rs:485:9:487:10 | let ... = x else {...} | test.rs:485:23:485:23 | x | | | test.rs:485:13:485:19 | TupleStructPat | test.rs:485:18:485:18 | y | match | | test.rs:485:13:485:19 | TupleStructPat | test.rs:486:13:486:27 | ExprStmt | no-match | | test.rs:485:18:485:18 | y | test.rs:488:9:488:9 | 0 | match | | test.rs:485:23:485:23 | x | test.rs:485:13:485:19 | TupleStructPat | | -| test.rs:486:13:486:26 | BreakExpr | test.rs:483:18:489:5 | BlockExpr | break | +| test.rs:486:13:486:26 | break ''block 1 | test.rs:483:18:489:5 | 'block: { ... } | break | | test.rs:486:13:486:27 | ExprStmt | test.rs:486:26:486:26 | 1 | | -| test.rs:486:26:486:26 | 1 | test.rs:486:13:486:26 | BreakExpr | | -| test.rs:488:9:488:9 | 0 | test.rs:483:18:489:5 | BlockExpr | | -| test.rs:492:1:498:1 | enter test_nested_function2 | test.rs:493:5:493:18 | LetStmt | | -| test.rs:492:1:498:1 | exit test_nested_function2 (normal) | test.rs:492:1:498:1 | exit test_nested_function2 | | -| test.rs:492:28:498:1 | BlockExpr | test.rs:492:1:498:1 | exit test_nested_function2 (normal) | | -| test.rs:493:5:493:18 | LetStmt | test.rs:493:17:493:17 | 0 | | -| test.rs:493:9:493:13 | x | test.rs:494:5:496:5 | nested | match | +| test.rs:486:26:486:26 | 1 | test.rs:486:13:486:26 | break ''block 1 | | +| test.rs:488:9:488:9 | 0 | test.rs:483:18:489:5 | 'block: { ... } | | +| test.rs:492:1:498:1 | enter fn test_nested_function2 | test.rs:493:5:493:18 | let ... = 0 | | +| test.rs:492:1:498:1 | exit fn test_nested_function2 (normal) | test.rs:492:1:498:1 | exit fn test_nested_function2 | | +| test.rs:492:28:498:1 | { ... } | test.rs:492:1:498:1 | exit fn test_nested_function2 (normal) | | +| test.rs:493:5:493:18 | let ... = 0 | test.rs:493:17:493:17 | 0 | | +| test.rs:493:9:493:13 | x | test.rs:494:5:496:5 | fn nested | match | | test.rs:493:17:493:17 | 0 | test.rs:493:9:493:13 | x | | -| test.rs:494:5:496:5 | enter nested | test.rs:494:15:494:15 | x | | -| test.rs:494:5:496:5 | exit nested (normal) | test.rs:494:5:496:5 | exit nested | | -| test.rs:494:5:496:5 | nested | test.rs:497:5:497:19 | ExprStmt | | -| test.rs:494:15:494:15 | x | test.rs:494:15:494:25 | Param | match | -| test.rs:494:15:494:25 | Param | test.rs:495:9:495:16 | ExprStmt | | -| test.rs:494:28:496:5 | BlockExpr | test.rs:494:5:496:5 | exit nested (normal) | | +| test.rs:494:5:496:5 | enter fn nested | test.rs:494:15:494:15 | x | | +| test.rs:494:5:496:5 | exit fn nested (normal) | test.rs:494:5:496:5 | exit fn nested | | +| test.rs:494:5:496:5 | fn nested | test.rs:497:5:497:19 | ExprStmt | | +| test.rs:494:15:494:15 | x | test.rs:494:15:494:25 | ...: ... | match | +| test.rs:494:15:494:25 | ...: ... | test.rs:495:9:495:16 | ExprStmt | | +| test.rs:494:28:496:5 | { ... } | test.rs:494:5:496:5 | exit fn nested (normal) | | | test.rs:495:9:495:10 | * ... | test.rs:495:15:495:15 | 1 | | -| test.rs:495:9:495:15 | ... += ... | test.rs:494:28:496:5 | BlockExpr | | +| test.rs:495:9:495:15 | ... += ... | test.rs:494:28:496:5 | { ... } | | | test.rs:495:9:495:16 | ExprStmt | test.rs:495:10:495:10 | x | | | test.rs:495:10:495:10 | x | test.rs:495:9:495:10 | * ... | | | test.rs:495:15:495:15 | 1 | test.rs:495:9:495:15 | ... += ... | | | test.rs:497:5:497:10 | nested | test.rs:497:17:497:17 | x | | -| test.rs:497:5:497:18 | CallExpr | test.rs:492:28:498:1 | BlockExpr | | +| test.rs:497:5:497:18 | nested(...) | test.rs:492:28:498:1 | { ... } | | | test.rs:497:5:497:19 | ExprStmt | test.rs:497:5:497:10 | nested | | -| test.rs:497:12:497:17 | RefExpr | test.rs:497:5:497:18 | CallExpr | | -| test.rs:497:17:497:17 | x | test.rs:497:12:497:17 | RefExpr | | -| test.rs:509:5:511:5 | enter new | test.rs:509:12:509:12 | a | | -| test.rs:509:5:511:5 | exit new (normal) | test.rs:509:5:511:5 | exit new | | -| test.rs:509:12:509:12 | a | test.rs:509:12:509:17 | Param | match | -| test.rs:509:12:509:17 | Param | test.rs:510:23:510:23 | a | | -| test.rs:509:28:511:5 | BlockExpr | test.rs:509:5:511:5 | exit new (normal) | | -| test.rs:510:9:510:25 | RecordExpr | test.rs:509:28:511:5 | BlockExpr | | -| test.rs:510:23:510:23 | a | test.rs:510:9:510:25 | RecordExpr | | -| test.rs:513:5:515:5 | enter negated | test.rs:513:16:513:19 | self | | -| test.rs:513:5:515:5 | exit negated (normal) | test.rs:513:5:515:5 | exit negated | | +| test.rs:497:12:497:17 | &mut x | test.rs:497:5:497:18 | nested(...) | | +| test.rs:497:17:497:17 | x | test.rs:497:12:497:17 | &mut x | | +| test.rs:509:5:511:5 | enter fn new | test.rs:509:12:509:12 | a | | +| test.rs:509:5:511:5 | exit fn new (normal) | test.rs:509:5:511:5 | exit fn new | | +| test.rs:509:12:509:12 | a | test.rs:509:12:509:17 | ...: i64 | match | +| test.rs:509:12:509:17 | ...: i64 | test.rs:510:23:510:23 | a | | +| test.rs:509:28:511:5 | { ... } | test.rs:509:5:511:5 | exit fn new (normal) | | +| test.rs:510:9:510:25 | MyNumber {...} | test.rs:509:28:511:5 | { ... } | | +| test.rs:510:23:510:23 | a | test.rs:510:9:510:25 | MyNumber {...} | | +| test.rs:513:5:515:5 | enter fn negated | test.rs:513:16:513:19 | self | | +| test.rs:513:5:515:5 | exit fn negated (normal) | test.rs:513:5:515:5 | exit fn negated | | | test.rs:513:16:513:19 | SelfParam | test.rs:514:23:514:26 | self | | | test.rs:513:16:513:19 | self | test.rs:513:16:513:19 | SelfParam | | -| test.rs:513:30:515:5 | BlockExpr | test.rs:513:5:515:5 | exit negated (normal) | | -| test.rs:514:9:514:30 | RecordExpr | test.rs:513:30:515:5 | BlockExpr | | -| test.rs:514:23:514:26 | self | test.rs:514:23:514:28 | FieldExpr | | -| test.rs:514:23:514:28 | FieldExpr | test.rs:514:9:514:30 | RecordExpr | | -| test.rs:517:5:519:5 | enter multifly_add | test.rs:517:26:517:29 | self | | -| test.rs:517:5:519:5 | exit multifly_add (normal) | test.rs:517:5:519:5 | exit multifly_add | | +| test.rs:513:30:515:5 | { ... } | test.rs:513:5:515:5 | exit fn negated (normal) | | +| test.rs:514:9:514:30 | MyNumber {...} | test.rs:513:30:515:5 | { ... } | | +| test.rs:514:23:514:26 | self | test.rs:514:23:514:28 | self.n | | +| test.rs:514:23:514:28 | self.n | test.rs:514:9:514:30 | MyNumber {...} | | +| test.rs:517:5:519:5 | enter fn multifly_add | test.rs:517:26:517:29 | self | | +| test.rs:517:5:519:5 | exit fn multifly_add (normal) | test.rs:517:5:519:5 | exit fn multifly_add | | | test.rs:517:21:517:29 | SelfParam | test.rs:517:32:517:32 | a | | | test.rs:517:26:517:29 | self | test.rs:517:21:517:29 | SelfParam | | -| test.rs:517:32:517:32 | a | test.rs:517:32:517:37 | Param | match | -| test.rs:517:32:517:37 | Param | test.rs:517:40:517:40 | b | | -| test.rs:517:40:517:40 | b | test.rs:517:40:517:45 | Param | match | -| test.rs:517:40:517:45 | Param | test.rs:518:9:518:34 | ExprStmt | | -| test.rs:517:48:519:5 | BlockExpr | test.rs:517:5:519:5 | exit multifly_add (normal) | | -| test.rs:518:9:518:12 | self | test.rs:518:9:518:14 | FieldExpr | | -| test.rs:518:9:518:14 | FieldExpr | test.rs:518:19:518:22 | self | | -| test.rs:518:9:518:33 | ... = ... | test.rs:517:48:519:5 | BlockExpr | | +| test.rs:517:32:517:32 | a | test.rs:517:32:517:37 | ...: i64 | match | +| test.rs:517:32:517:37 | ...: i64 | test.rs:517:40:517:40 | b | | +| test.rs:517:40:517:40 | b | test.rs:517:40:517:45 | ...: i64 | match | +| test.rs:517:40:517:45 | ...: i64 | test.rs:518:9:518:34 | ExprStmt | | +| test.rs:517:48:519:5 | { ... } | test.rs:517:5:519:5 | exit fn multifly_add (normal) | | +| test.rs:518:9:518:12 | self | test.rs:518:9:518:14 | self.n | | +| test.rs:518:9:518:14 | self.n | test.rs:518:19:518:22 | self | | +| test.rs:518:9:518:33 | ... = ... | test.rs:517:48:519:5 | { ... } | | | test.rs:518:9:518:34 | ExprStmt | test.rs:518:9:518:12 | self | | | test.rs:518:18:518:33 | ... + ... | test.rs:518:9:518:33 | ... = ... | | -| test.rs:518:19:518:22 | self | test.rs:518:19:518:24 | FieldExpr | | -| test.rs:518:19:518:24 | FieldExpr | test.rs:518:28:518:28 | a | | +| test.rs:518:19:518:22 | self | test.rs:518:19:518:24 | self.n | | +| test.rs:518:19:518:24 | self.n | test.rs:518:28:518:28 | a | | | test.rs:518:19:518:28 | ... * ... | test.rs:518:33:518:33 | b | | | test.rs:518:28:518:28 | a | test.rs:518:19:518:28 | ... * ... | | | test.rs:518:33:518:33 | b | test.rs:518:18:518:33 | ... + ... | | breakTarget -| test.rs:34:17:34:21 | BreakExpr | test.rs:28:9:40:9 | LoopExpr | -| test.rs:48:21:48:25 | BreakExpr | test.rs:46:13:53:13 | LoopExpr | -| test.rs:50:21:50:32 | BreakExpr | test.rs:45:9:54:9 | LoopExpr | -| test.rs:52:17:52:28 | BreakExpr | test.rs:46:13:53:13 | LoopExpr | -| test.rs:91:17:91:21 | BreakExpr | test.rs:88:9:94:9 | WhileExpr | -| test.rs:101:17:101:21 | BreakExpr | test.rs:99:9:103:9 | WhileExpr | -| test.rs:109:17:109:21 | BreakExpr | test.rs:107:9:112:9 | ForExpr | -| test.rs:117:13:117:26 | BreakExpr | test.rs:116:9:118:9 | LoopExpr | -| test.rs:197:17:197:28 | BreakExpr | test.rs:195:13:200:9 | LoopExpr | -| test.rs:210:17:210:35 | BreakExpr | test.rs:208:13:213:9 | LoopExpr | -| test.rs:222:13:222:30 | BreakExpr | test.rs:221:13:223:9 | BlockExpr | -| test.rs:470:13:470:26 | BreakExpr | test.rs:467:18:478:5 | BlockExpr | -| test.rs:474:13:474:26 | BreakExpr | test.rs:467:18:478:5 | BlockExpr | -| test.rs:486:13:486:26 | BreakExpr | test.rs:483:18:489:5 | BlockExpr | +| test.rs:34:17:34:21 | break | test.rs:28:9:40:9 | loop { ... } | +| test.rs:48:21:48:25 | break | test.rs:46:13:53:13 | 'inner: loop { ... } | +| test.rs:50:21:50:32 | break ''outer | test.rs:45:9:54:9 | 'outer: loop { ... } | +| test.rs:52:17:52:28 | break ''inner | test.rs:46:13:53:13 | 'inner: loop { ... } | +| test.rs:91:17:91:21 | break | test.rs:88:9:94:9 | while b { ... } | +| test.rs:101:17:101:21 | break | test.rs:99:9:103:9 | while ... { ... } | +| test.rs:109:17:109:21 | break | test.rs:107:9:112:9 | for ... in ... { ... } | +| test.rs:117:13:117:26 | break ... | test.rs:116:9:118:9 | loop { ... } | +| test.rs:197:17:197:28 | break ... | test.rs:195:13:200:9 | loop { ... } | +| test.rs:210:17:210:35 | break ''label ... | test.rs:208:13:213:9 | 'label: loop { ... } | +| test.rs:222:13:222:30 | break ''block ... | test.rs:221:13:223:9 | 'block: { ... } | +| test.rs:470:13:470:26 | break ''block 1 | test.rs:467:18:478:5 | 'block: { ... } | +| test.rs:474:13:474:26 | break ''block 2 | test.rs:467:18:478:5 | 'block: { ... } | +| test.rs:486:13:486:26 | break ''block 1 | test.rs:483:18:489:5 | 'block: { ... } | continueTarget -| test.rs:37:17:37:24 | ContinueExpr | test.rs:28:9:40:9 | LoopExpr | -| test.rs:63:21:63:28 | ContinueExpr | test.rs:61:13:68:13 | LoopExpr | -| test.rs:65:21:65:35 | ContinueExpr | test.rs:59:9:69:9 | LoopExpr | -| test.rs:67:17:67:31 | ContinueExpr | test.rs:61:13:68:13 | LoopExpr | -| test.rs:77:21:77:28 | ContinueExpr | test.rs:75:13:82:13 | LoopExpr | -| test.rs:79:21:79:35 | ContinueExpr | test.rs:75:13:82:13 | LoopExpr | -| test.rs:81:17:81:31 | ContinueExpr | test.rs:75:13:82:13 | LoopExpr | +| test.rs:37:17:37:24 | continue | test.rs:28:9:40:9 | loop { ... } | +| test.rs:63:21:63:28 | continue | test.rs:61:13:68:13 | 'inner: loop { ... } | +| test.rs:65:21:65:35 | continue 'outer | test.rs:59:9:69:9 | 'outer: loop { ... } | +| test.rs:67:17:67:31 | continue 'inner | test.rs:61:13:68:13 | 'inner: loop { ... } | +| test.rs:77:21:77:28 | continue | test.rs:75:13:82:13 | 'label: loop { ... } | +| test.rs:79:21:79:35 | continue 'label | test.rs:75:13:82:13 | 'label: loop { ... } | +| test.rs:81:17:81:31 | continue 'label | test.rs:75:13:82:13 | 'label: loop { ... } | diff --git a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected index a54c75d0c17f..660aee690861 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/barrier/inline-flow.expected @@ -1,16 +1,29 @@ models edges -| main.rs:21:13:21:21 | CallExpr : unit | main.rs:22:10:22:10 | s | provenance | | -| main.rs:32:13:32:21 | CallExpr : unit | main.rs:33:10:33:10 | s | provenance | | +| main.rs:9:13:9:19 | ...: ... : unit | main.rs:9:30:14:1 | { ... } : unit | provenance | | +| main.rs:21:13:21:21 | source(...) : unit | main.rs:22:10:22:10 | s | provenance | | +| main.rs:26:13:26:21 | source(...) : unit | main.rs:27:22:27:22 | s : unit | provenance | | +| main.rs:27:13:27:23 | sanitize(...) : unit | main.rs:28:10:28:10 | s | provenance | | +| main.rs:27:22:27:22 | s : unit | main.rs:9:13:9:19 | ...: ... : unit | provenance | | +| main.rs:27:22:27:22 | s : unit | main.rs:27:13:27:23 | sanitize(...) : unit | provenance | | +| main.rs:32:13:32:21 | source(...) : unit | main.rs:33:10:33:10 | s | provenance | | nodes -| main.rs:17:10:17:18 | CallExpr | semmle.label | CallExpr | -| main.rs:21:13:21:21 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:9:13:9:19 | ...: ... : unit | semmle.label | ...: ... : unit | +| main.rs:9:30:14:1 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:17:10:17:18 | source(...) | semmle.label | source(...) | +| main.rs:21:13:21:21 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:22:10:22:10 | s | semmle.label | s | -| main.rs:32:13:32:21 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:26:13:26:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:27:13:27:23 | sanitize(...) : unit | semmle.label | sanitize(...) : unit | +| main.rs:27:22:27:22 | s : unit | semmle.label | s : unit | +| main.rs:28:10:28:10 | s | semmle.label | s | +| main.rs:32:13:32:21 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:33:10:33:10 | s | semmle.label | s | subpaths +| main.rs:27:22:27:22 | s : unit | main.rs:9:13:9:19 | ...: ... : unit | main.rs:9:30:14:1 | { ... } : unit | main.rs:27:13:27:23 | sanitize(...) : unit | testFailures #select -| main.rs:17:10:17:18 | CallExpr | main.rs:17:10:17:18 | CallExpr | main.rs:17:10:17:18 | CallExpr | $@ | main.rs:17:10:17:18 | CallExpr | CallExpr | -| main.rs:22:10:22:10 | s | main.rs:21:13:21:21 | CallExpr : unit | main.rs:22:10:22:10 | s | $@ | main.rs:21:13:21:21 | CallExpr : unit | CallExpr : unit | -| main.rs:33:10:33:10 | s | main.rs:32:13:32:21 | CallExpr : unit | main.rs:33:10:33:10 | s | $@ | main.rs:32:13:32:21 | CallExpr : unit | CallExpr : unit | +| main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | main.rs:17:10:17:18 | source(...) | $@ | main.rs:17:10:17:18 | source(...) | source(...) | +| main.rs:22:10:22:10 | s | main.rs:21:13:21:21 | source(...) : unit | main.rs:22:10:22:10 | s | $@ | main.rs:21:13:21:21 | source(...) : unit | source(...) : unit | +| main.rs:28:10:28:10 | s | main.rs:26:13:26:21 | source(...) : unit | main.rs:28:10:28:10 | s | $@ | main.rs:26:13:26:21 | source(...) : unit | source(...) : unit | +| main.rs:33:10:33:10 | s | main.rs:32:13:32:21 | source(...) : unit | main.rs:33:10:33:10 | s | $@ | main.rs:32:13:32:21 | source(...) : unit | source(...) : unit | diff --git a/rust/ql/test/library-tests/dataflow/barrier/main.rs b/rust/ql/test/library-tests/dataflow/barrier/main.rs index 8a0a7bc2be62..14935f0f3286 100644 --- a/rust/ql/test/library-tests/dataflow/barrier/main.rs +++ b/rust/ql/test/library-tests/dataflow/barrier/main.rs @@ -9,7 +9,7 @@ fn sink(s: &str) { fn sanitize(s: &str) -> &str { match s { "dangerous" => "", - s => s + s => s, } } @@ -25,7 +25,7 @@ fn through_variable() { fn with_barrier() { let s = source(1); let s = sanitize(s); - sink(s); + sink(s); // $ SPURIOUS: hasValueFlow=1 } fn main() { diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected new file mode 100644 index 000000000000..147fa059c31f --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -0,0 +1,74 @@ +models +edges +| main.rs:12:28:14:1 | { ... } : unit | main.rs:17:13:17:23 | get_data(...) : unit | provenance | | +| main.rs:13:5:13:13 | source(...) : unit | main.rs:12:28:14:1 | { ... } : unit | provenance | | +| main.rs:17:13:17:23 | get_data(...) : unit | main.rs:18:10:18:10 | a | provenance | | +| main.rs:21:12:21:17 | ...: i64 : unit | main.rs:22:10:22:10 | n | provenance | | +| main.rs:26:13:26:21 | source(...) : unit | main.rs:27:13:27:13 | a : unit | provenance | | +| main.rs:27:13:27:13 | a : unit | main.rs:21:12:21:17 | ...: i64 : unit | provenance | | +| main.rs:30:17:30:22 | ...: i64 : unit | main.rs:30:32:32:1 | { ... } : unit | provenance | | +| main.rs:35:13:35:21 | source(...) : unit | main.rs:36:26:36:26 | a : unit | provenance | | +| main.rs:36:13:36:27 | pass_through(...) : unit | main.rs:37:10:37:10 | b | provenance | | +| main.rs:36:26:36:26 | a : unit | main.rs:30:17:30:22 | ...: i64 : unit | provenance | | +| main.rs:36:26:36:26 | a : unit | main.rs:36:13:36:27 | pass_through(...) : unit | provenance | | +| main.rs:41:13:44:6 | pass_through(...) : unit | main.rs:45:10:45:10 | a | provenance | | +| main.rs:41:26:44:5 | { ... } : unit | main.rs:30:17:30:22 | ...: i64 : unit | provenance | | +| main.rs:41:26:44:5 | { ... } : unit | main.rs:41:13:44:6 | pass_through(...) : unit | provenance | | +| main.rs:43:9:43:18 | source(...) : unit | main.rs:41:26:44:5 | { ... } : unit | provenance | | +| main.rs:56:23:56:28 | ...: i64 : unit | main.rs:57:14:57:14 | n | provenance | | +| main.rs:59:31:65:5 | { ... } : unit | main.rs:77:13:77:25 | ... .get_data(...) : unit | provenance | | +| main.rs:63:13:63:21 | source(...) : unit | main.rs:59:31:65:5 | { ... } : unit | provenance | | +| main.rs:66:28:66:33 | ...: i64 : unit | main.rs:66:43:72:5 | { ... } : unit | provenance | | +| main.rs:77:13:77:25 | ... .get_data(...) : unit | main.rs:78:10:78:10 | a | provenance | | +| main.rs:83:13:83:21 | source(...) : unit | main.rs:84:16:84:16 | a : unit | provenance | | +| main.rs:84:16:84:16 | a : unit | main.rs:56:23:56:28 | ...: i64 : unit | provenance | | +| main.rs:89:13:89:21 | source(...) : unit | main.rs:90:29:90:29 | a : unit | provenance | | +| main.rs:90:13:90:30 | ... .data_through(...) : unit | main.rs:91:10:91:10 | b | provenance | | +| main.rs:90:29:90:29 | a : unit | main.rs:66:28:66:33 | ...: i64 : unit | provenance | | +| main.rs:90:29:90:29 | a : unit | main.rs:90:13:90:30 | ... .data_through(...) : unit | provenance | | +nodes +| main.rs:12:28:14:1 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:13:5:13:13 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:17:13:17:23 | get_data(...) : unit | semmle.label | get_data(...) : unit | +| main.rs:18:10:18:10 | a | semmle.label | a | +| main.rs:21:12:21:17 | ...: i64 : unit | semmle.label | ...: i64 : unit | +| main.rs:22:10:22:10 | n | semmle.label | n | +| main.rs:26:13:26:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:27:13:27:13 | a : unit | semmle.label | a : unit | +| main.rs:30:17:30:22 | ...: i64 : unit | semmle.label | ...: i64 : unit | +| main.rs:30:32:32:1 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:35:13:35:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:36:13:36:27 | pass_through(...) : unit | semmle.label | pass_through(...) : unit | +| main.rs:36:26:36:26 | a : unit | semmle.label | a : unit | +| main.rs:37:10:37:10 | b | semmle.label | b | +| main.rs:41:13:44:6 | pass_through(...) : unit | semmle.label | pass_through(...) : unit | +| main.rs:41:26:44:5 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:43:9:43:18 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:45:10:45:10 | a | semmle.label | a | +| main.rs:56:23:56:28 | ...: i64 : unit | semmle.label | ...: i64 : unit | +| main.rs:57:14:57:14 | n | semmle.label | n | +| main.rs:59:31:65:5 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:63:13:63:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:66:28:66:33 | ...: i64 : unit | semmle.label | ...: i64 : unit | +| main.rs:66:43:72:5 | { ... } : unit | semmle.label | { ... } : unit | +| main.rs:77:13:77:25 | ... .get_data(...) : unit | semmle.label | ... .get_data(...) : unit | +| main.rs:78:10:78:10 | a | semmle.label | a | +| main.rs:83:13:83:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:84:16:84:16 | a : unit | semmle.label | a : unit | +| main.rs:89:13:89:21 | source(...) : unit | semmle.label | source(...) : unit | +| main.rs:90:13:90:30 | ... .data_through(...) : unit | semmle.label | ... .data_through(...) : unit | +| main.rs:90:29:90:29 | a : unit | semmle.label | a : unit | +| main.rs:91:10:91:10 | b | semmle.label | b | +subpaths +| main.rs:36:26:36:26 | a : unit | main.rs:30:17:30:22 | ...: i64 : unit | main.rs:30:32:32:1 | { ... } : unit | main.rs:36:13:36:27 | pass_through(...) : unit | +| main.rs:41:26:44:5 | { ... } : unit | main.rs:30:17:30:22 | ...: i64 : unit | main.rs:30:32:32:1 | { ... } : unit | main.rs:41:13:44:6 | pass_through(...) : unit | +| main.rs:90:29:90:29 | a : unit | main.rs:66:28:66:33 | ...: i64 : unit | main.rs:66:43:72:5 | { ... } : unit | main.rs:90:13:90:30 | ... .data_through(...) : unit | +testFailures +#select +| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) : unit | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) : unit | source(...) : unit | +| main.rs:22:10:22:10 | n | main.rs:26:13:26:21 | source(...) : unit | main.rs:22:10:22:10 | n | $@ | main.rs:26:13:26:21 | source(...) : unit | source(...) : unit | +| main.rs:37:10:37:10 | b | main.rs:35:13:35:21 | source(...) : unit | main.rs:37:10:37:10 | b | $@ | main.rs:35:13:35:21 | source(...) : unit | source(...) : unit | +| main.rs:45:10:45:10 | a | main.rs:43:9:43:18 | source(...) : unit | main.rs:45:10:45:10 | a | $@ | main.rs:43:9:43:18 | source(...) : unit | source(...) : unit | +| main.rs:57:14:57:14 | n | main.rs:83:13:83:21 | source(...) : unit | main.rs:57:14:57:14 | n | $@ | main.rs:83:13:83:21 | source(...) : unit | source(...) : unit | +| main.rs:78:10:78:10 | a | main.rs:63:13:63:21 | source(...) : unit | main.rs:78:10:78:10 | a | $@ | main.rs:63:13:63:21 | source(...) : unit | source(...) : unit | +| main.rs:91:10:91:10 | b | main.rs:89:13:89:21 | source(...) : unit | main.rs:91:10:91:10 | b | $@ | main.rs:89:13:89:21 | source(...) : unit | source(...) : unit | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.ql b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql new file mode 100644 index 000000000000..ad553fe548dc --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import rust +import utils.InlineFlowTest +import DefaultFlowTest +import ValueFlow::PathGraph + +from ValueFlow::PathNode source, ValueFlow::PathNode sink +where ValueFlow::flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index eb3a59856922..77c37a945b8f 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -19,7 +19,7 @@ fn data_out_of_call() { } fn data_in(n: i64) { - sink(n + 7); // $ hasValueFlow + sink(n); // $ hasValueFlow=3 } fn data_in_to_call() { @@ -37,6 +37,14 @@ fn data_through_call() { sink(b); // $ hasValueFlow=1 } +fn block_expression_as_argument() { + let a = pass_through({ + println!("Hello"); + source(14) + }); + sink(a); // $ hasValueFlow=14 +} + // ----------------------------------------------------------------------------- // Data flow in, out, and through method. @@ -67,7 +75,7 @@ impl MyFlag { fn data_out_of_method() { let mn = MyFlag { flag: true }; let a = mn.get_data(); - sink(a); + sink(a); // $ hasValueFlow=2 } fn data_in_to_method_call() { @@ -79,8 +87,8 @@ fn data_in_to_method_call() { fn data_through_method() { let mn = MyFlag { flag: true }; let a = source(4); - mn.data_through(a); - sink(a); // $ hasValueFlow=4 + let b = mn.data_through(a); + sink(b); // $ hasValueFlow=4 } fn main() { diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index 6a15bb25249a..eaf4a7b14d91 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -1,24 +1,27 @@ -| main.rs:13:5:13:13 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:17:13:17:23 | CallExpr | main.rs:12:1:14:1 | get_data | -| main.rs:18:5:18:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:22:5:22:15 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:26:13:26:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:27:5:27:14 | CallExpr | main.rs:21:1:23:1 | data_in | -| main.rs:35:13:35:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:36:13:36:27 | CallExpr | main.rs:30:1:32:1 | pass_through | -| main.rs:37:5:37:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:49:9:49:15 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:55:13:55:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:69:13:69:25 | ... .get_data(...) | main.rs:51:5:57:5 | get_data | -| main.rs:70:5:70:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:75:13:75:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:76:5:76:17 | ... .data_in(...) | main.rs:48:5:50:5 | data_in | -| main.rs:81:13:81:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:82:5:82:22 | ... .data_through(...) | main.rs:58:5:64:5 | data_through | -| main.rs:83:5:83:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:87:5:87:22 | CallExpr | main.rs:16:1:19:1 | data_out_of_call | -| main.rs:88:5:88:21 | CallExpr | main.rs:25:1:28:1 | data_in_to_call | -| main.rs:89:5:89:23 | CallExpr | main.rs:34:1:38:1 | data_through_call | -| main.rs:91:5:91:24 | CallExpr | main.rs:67:1:71:1 | data_out_of_method | -| main.rs:92:5:92:28 | CallExpr | main.rs:73:1:77:1 | data_in_to_method_call | -| main.rs:93:5:93:25 | CallExpr | main.rs:79:1:84:1 | data_through_method | +| main.rs:13:5:13:13 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:17:13:17:23 | get_data(...) | main.rs:12:1:14:1 | fn get_data | +| main.rs:18:5:18:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:22:5:22:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:26:13:26:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:27:5:27:14 | data_in(...) | main.rs:21:1:23:1 | fn data_in | +| main.rs:35:13:35:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:36:13:36:27 | pass_through(...) | main.rs:30:1:32:1 | fn pass_through | +| main.rs:37:5:37:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:41:13:44:6 | pass_through(...) | main.rs:30:1:32:1 | fn pass_through | +| main.rs:43:9:43:18 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:45:5:45:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:57:9:57:15 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:63:13:63:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:77:13:77:25 | ... .get_data(...) | main.rs:59:5:65:5 | fn get_data | +| main.rs:78:5:78:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:83:13:83:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:84:5:84:17 | ... .data_in(...) | main.rs:56:5:58:5 | fn data_in | +| main.rs:89:13:89:21 | source(...) | main.rs:1:1:3:1 | fn source | +| main.rs:90:13:90:30 | ... .data_through(...) | main.rs:66:5:72:5 | fn data_through | +| main.rs:91:5:91:11 | sink(...) | main.rs:5:1:7:1 | fn sink | +| main.rs:95:5:95:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | +| main.rs:96:5:96:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call | +| main.rs:97:5:97:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call | +| main.rs:99:5:99:24 | data_out_of_method(...) | main.rs:75:1:79:1 | fn data_out_of_method | +| main.rs:100:5:100:28 | data_in_to_method_call(...) | main.rs:81:1:85:1 | fn data_in_to_method_call | +| main.rs:101:5:101:25 | data_through_method(...) | main.rs:87:1:92:1 | fn data_through_method | diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 1ccc9c219c32..02cc2fdf5919 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,110 +1,116 @@ | main.rs:3:11:3:11 | [SSA] i | main.rs:4:12:4:12 | i | | main.rs:3:11:3:11 | i | main.rs:3:11:3:11 | [SSA] i | -| main.rs:4:5:4:12 | ... + ... | main.rs:3:26:5:1 | BlockExpr | +| main.rs:3:11:3:16 | ...: i64 | main.rs:3:11:3:11 | i | +| main.rs:4:5:4:12 | ... + ... | main.rs:3:26:5:1 | { ... } | | main.rs:7:9:7:9 | [SSA] s | main.rs:8:20:8:20 | s | | main.rs:7:9:7:9 | s | main.rs:7:9:7:9 | [SSA] s | +| main.rs:7:9:7:14 | ...: i64 | main.rs:7:9:7:9 | s | | main.rs:19:9:19:9 | [SSA] s | main.rs:20:10:20:10 | s | | main.rs:19:9:19:9 | s | main.rs:19:9:19:9 | [SSA] s | -| main.rs:19:13:19:21 | CallExpr | main.rs:19:9:19:9 | s | +| main.rs:19:13:19:21 | source(...) | main.rs:19:9:19:9 | s | | main.rs:23:18:23:21 | [SSA] cond | main.rs:26:16:26:19 | cond | | main.rs:23:18:23:21 | cond | main.rs:23:18:23:21 | [SSA] cond | +| main.rs:23:18:23:27 | ...: bool | main.rs:23:18:23:21 | cond | | main.rs:24:9:24:9 | [SSA] a | main.rs:26:23:26:23 | a | | main.rs:24:9:24:9 | a | main.rs:24:9:24:9 | [SSA] a | -| main.rs:24:13:24:21 | CallExpr | main.rs:24:9:24:9 | a | +| main.rs:24:13:24:21 | source(...) | main.rs:24:9:24:9 | a | | main.rs:25:9:25:9 | [SSA] b | main.rs:26:34:26:34 | b | | main.rs:25:9:25:9 | b | main.rs:25:9:25:9 | [SSA] b | | main.rs:25:13:25:13 | 2 | main.rs:25:9:25:9 | b | | main.rs:26:9:26:9 | [SSA] c | main.rs:27:10:27:10 | c | | main.rs:26:9:26:9 | c | main.rs:26:9:26:9 | [SSA] c | -| main.rs:26:13:26:36 | IfExpr | main.rs:26:9:26:9 | c | -| main.rs:26:21:26:25 | BlockExpr | main.rs:26:13:26:36 | IfExpr | -| main.rs:26:23:26:23 | a | main.rs:26:21:26:25 | BlockExpr | -| main.rs:26:32:26:36 | BlockExpr | main.rs:26:13:26:36 | IfExpr | -| main.rs:26:34:26:34 | b | main.rs:26:32:26:36 | BlockExpr | +| main.rs:26:13:26:36 | if cond {...} else {...} | main.rs:26:9:26:9 | c | +| main.rs:26:21:26:25 | { ... } | main.rs:26:13:26:36 | if cond {...} else {...} | +| main.rs:26:23:26:23 | a | main.rs:26:21:26:25 | { ... } | +| main.rs:26:32:26:36 | { ... } | main.rs:26:13:26:36 | if cond {...} else {...} | +| main.rs:26:34:26:34 | b | main.rs:26:32:26:36 | { ... } | | main.rs:30:21:30:21 | [SSA] m | main.rs:32:19:32:19 | m | | main.rs:30:21:30:21 | m | main.rs:30:21:30:21 | [SSA] m | +| main.rs:30:21:30:34 | ...: Option::<...> | main.rs:30:21:30:21 | m | | main.rs:31:9:31:9 | [SSA] a | main.rs:33:20:33:20 | a | | main.rs:31:9:31:9 | a | main.rs:31:9:31:9 | [SSA] a | -| main.rs:31:13:31:21 | CallExpr | main.rs:31:9:31:9 | a | +| main.rs:31:13:31:21 | source(...) | main.rs:31:9:31:9 | a | | main.rs:32:9:32:9 | [SSA] b | main.rs:36:10:36:10 | b | | main.rs:32:9:32:9 | b | main.rs:32:9:32:9 | [SSA] b | -| main.rs:32:13:35:5 | MatchExpr | main.rs:32:9:32:9 | b | -| main.rs:33:20:33:20 | a | main.rs:32:13:35:5 | MatchExpr | -| main.rs:34:17:34:17 | 0 | main.rs:32:13:35:5 | MatchExpr | +| main.rs:32:13:35:5 | match m { ... } | main.rs:32:9:32:9 | b | +| main.rs:33:20:33:20 | a | main.rs:32:13:35:5 | match m { ... } | +| main.rs:34:17:34:17 | 0 | main.rs:32:13:35:5 | match m { ... } | | main.rs:40:9:40:9 | [SSA] a | main.rs:43:10:43:10 | a | | main.rs:40:9:40:9 | a | main.rs:40:9:40:9 | [SSA] a | -| main.rs:40:13:42:5 | LoopExpr | main.rs:40:9:40:9 | a | -| main.rs:41:9:41:15 | BreakExpr | main.rs:40:13:42:5 | LoopExpr | -| main.rs:41:15:41:15 | 1 | main.rs:41:9:41:15 | BreakExpr | +| main.rs:40:13:42:5 | loop { ... } | main.rs:40:9:40:9 | a | +| main.rs:41:9:41:15 | break 1 | main.rs:40:13:42:5 | loop { ... } | +| main.rs:41:15:41:15 | 1 | main.rs:41:9:41:15 | break 1 | | main.rs:44:9:44:9 | [SSA] b | main.rs:47:10:47:10 | b | | main.rs:44:9:44:9 | b | main.rs:44:9:44:9 | [SSA] b | -| main.rs:44:13:46:5 | LoopExpr | main.rs:44:9:44:9 | b | -| main.rs:45:9:45:23 | BreakExpr | main.rs:44:13:46:5 | LoopExpr | -| main.rs:45:15:45:23 | CallExpr | main.rs:45:9:45:23 | BreakExpr | +| main.rs:44:13:46:5 | loop { ... } | main.rs:44:9:44:9 | b | +| main.rs:45:9:45:23 | break ... | main.rs:44:13:46:5 | loop { ... } | +| main.rs:45:15:45:23 | source(...) | main.rs:45:9:45:23 | break ... | | main.rs:51:9:51:13 | [SSA] i | main.rs:52:10:52:10 | i | | main.rs:51:9:51:13 | i | main.rs:51:9:51:13 | [SSA] i | | main.rs:51:17:51:17 | 1 | main.rs:51:9:51:13 | i | | main.rs:53:5:53:5 | [SSA] i | main.rs:54:10:54:10 | i | | main.rs:53:5:53:5 | i | main.rs:53:5:53:5 | [SSA] i | -| main.rs:53:9:53:17 | CallExpr | main.rs:53:5:53:5 | i | +| main.rs:53:9:53:17 | source(...) | main.rs:53:5:53:5 | i | | main.rs:61:9:61:9 | [SSA] i | main.rs:62:11:62:11 | i | | main.rs:61:9:61:9 | i | main.rs:61:9:61:9 | [SSA] i | -| main.rs:61:13:61:31 | CallExpr | main.rs:61:9:61:9 | i | +| main.rs:61:13:61:31 | ...::new(...) | main.rs:61:9:61:9 | i | | main.rs:66:9:66:9 | [SSA] a | main.rs:67:10:67:10 | a | | main.rs:66:9:66:9 | a | main.rs:66:9:66:9 | [SSA] a | | main.rs:66:13:66:26 | TupleExpr | main.rs:66:9:66:9 | a | | main.rs:67:10:67:10 | a | main.rs:68:10:68:10 | a | | main.rs:78:9:78:9 | [SSA] p | main.rs:83:10:83:10 | p | | main.rs:78:9:78:9 | p | main.rs:78:9:78:9 | [SSA] p | -| main.rs:78:13:82:5 | RecordExpr | main.rs:78:9:78:9 | p | +| main.rs:78:13:82:5 | Point {...} | main.rs:78:9:78:9 | p | | main.rs:83:10:83:10 | p | main.rs:84:10:84:10 | p | | main.rs:84:10:84:10 | p | main.rs:85:10:85:10 | p | | main.rs:92:9:92:9 | [SSA] p | main.rs:97:38:97:38 | p | | main.rs:92:9:92:9 | p | main.rs:92:9:92:9 | [SSA] p | -| main.rs:92:13:96:5 | RecordExpr | main.rs:92:9:92:9 | p | +| main.rs:92:13:96:5 | Point {...} | main.rs:92:9:92:9 | p | | main.rs:97:20:97:20 | [SSA] a | main.rs:98:10:98:10 | a | | main.rs:97:20:97:20 | a | main.rs:97:20:97:20 | [SSA] a | | main.rs:97:26:97:26 | [SSA] b | main.rs:99:10:99:10 | b | | main.rs:97:26:97:26 | b | main.rs:97:26:97:26 | [SSA] b | | main.rs:97:32:97:32 | [SSA] c | main.rs:100:10:100:10 | c | | main.rs:97:32:97:32 | c | main.rs:97:32:97:32 | [SSA] c | -| main.rs:97:38:97:38 | p | main.rs:97:9:97:34 | RecordPat | +| main.rs:97:38:97:38 | p | main.rs:97:9:97:34 | Point {...} | | main.rs:104:9:104:10 | [SSA] s1 | main.rs:106:11:106:12 | s1 | | main.rs:104:9:104:10 | s1 | main.rs:104:9:104:10 | [SSA] s1 | -| main.rs:104:14:104:28 | CallExpr | main.rs:104:9:104:10 | s1 | +| main.rs:104:14:104:28 | Some(...) | main.rs:104:9:104:10 | s1 | | main.rs:105:9:105:10 | [SSA] s2 | main.rs:110:11:110:12 | s2 | | main.rs:105:9:105:10 | s2 | main.rs:105:9:105:10 | [SSA] s2 | -| main.rs:105:14:105:20 | CallExpr | main.rs:105:9:105:10 | s2 | +| main.rs:105:14:105:20 | Some(...) | main.rs:105:9:105:10 | s2 | | main.rs:107:14:107:14 | [SSA] n | main.rs:107:25:107:25 | n | | main.rs:107:14:107:14 | n | main.rs:107:14:107:14 | [SSA] n | -| main.rs:107:20:107:26 | CallExpr | main.rs:106:5:109:5 | MatchExpr | -| main.rs:108:17:108:23 | CallExpr | main.rs:106:5:109:5 | MatchExpr | -| main.rs:110:5:113:5 | MatchExpr | main.rs:103:27:114:1 | BlockExpr | +| main.rs:107:20:107:26 | sink(...) | main.rs:106:5:109:5 | match s1 { ... } | +| main.rs:108:17:108:23 | sink(...) | main.rs:106:5:109:5 | match s1 { ... } | +| main.rs:110:5:113:5 | match s2 { ... } | main.rs:103:27:114:1 | { ... } | | main.rs:111:14:111:14 | [SSA] n | main.rs:111:25:111:25 | n | | main.rs:111:14:111:14 | n | main.rs:111:14:111:14 | [SSA] n | -| main.rs:111:20:111:26 | CallExpr | main.rs:110:5:113:5 | MatchExpr | -| main.rs:112:17:112:23 | CallExpr | main.rs:110:5:113:5 | MatchExpr | +| main.rs:111:20:111:26 | sink(...) | main.rs:110:5:113:5 | match s2 { ... } | +| main.rs:112:17:112:23 | sink(...) | main.rs:110:5:113:5 | match s2 { ... } | | main.rs:117:9:117:9 | [SSA] a | main.rs:118:5:118:5 | a | | main.rs:117:9:117:9 | a | main.rs:117:9:117:9 | [SSA] a | -| main.rs:117:13:117:17 | BlockExpr | main.rs:117:9:117:9 | a | -| main.rs:117:15:117:15 | 0 | main.rs:117:13:117:17 | BlockExpr | -| main.rs:118:5:118:5 | a | main.rs:116:31:119:1 | BlockExpr | +| main.rs:117:13:117:17 | { ... } | main.rs:117:9:117:9 | a | +| main.rs:117:15:117:15 | 0 | main.rs:117:13:117:17 | { ... } | +| main.rs:118:5:118:5 | a | main.rs:116:31:119:1 | { ... } | | main.rs:121:22:121:22 | [SSA] b | main.rs:123:12:123:12 | b | | main.rs:121:22:121:22 | b | main.rs:121:22:121:22 | [SSA] b | +| main.rs:121:22:121:28 | ...: bool | main.rs:121:22:121:22 | b | | main.rs:122:9:122:9 | [SSA] a | main.rs:128:5:128:5 | a | | main.rs:122:9:122:9 | a | main.rs:122:9:122:9 | [SSA] a | -| main.rs:122:13:127:5 | BlockExpr | main.rs:122:9:122:9 | a | -| main.rs:124:13:124:26 | BreakExpr | main.rs:122:13:127:5 | BlockExpr | -| main.rs:124:26:124:26 | 1 | main.rs:124:13:124:26 | BreakExpr | -| main.rs:126:9:126:9 | 2 | main.rs:122:13:127:5 | BlockExpr | -| main.rs:128:5:128:5 | a | main.rs:121:38:129:1 | BlockExpr | +| main.rs:122:13:127:5 | 'block: { ... } | main.rs:122:9:122:9 | a | +| main.rs:124:13:124:26 | break ''block 1 | main.rs:122:13:127:5 | 'block: { ... } | +| main.rs:124:26:124:26 | 1 | main.rs:124:13:124:26 | break ''block 1 | +| main.rs:126:9:126:9 | 2 | main.rs:122:13:127:5 | 'block: { ... } | +| main.rs:128:5:128:5 | a | main.rs:121:38:129:1 | { ... } | | main.rs:131:22:131:22 | [SSA] b | main.rs:133:12:133:12 | b | | main.rs:131:22:131:22 | b | main.rs:131:22:131:22 | [SSA] b | +| main.rs:131:22:131:28 | ...: bool | main.rs:131:22:131:22 | b | | main.rs:132:9:132:9 | [SSA] a | main.rs:138:5:138:5 | a | | main.rs:132:9:132:9 | a | main.rs:132:9:132:9 | [SSA] a | -| main.rs:132:13:137:5 | BlockExpr | main.rs:132:9:132:9 | a | -| main.rs:134:13:134:26 | BreakExpr | main.rs:132:13:137:5 | BlockExpr | -| main.rs:134:26:134:26 | 1 | main.rs:134:13:134:26 | BreakExpr | -| main.rs:136:9:136:22 | BreakExpr | main.rs:132:13:137:5 | BlockExpr | -| main.rs:136:22:136:22 | 2 | main.rs:136:9:136:22 | BreakExpr | -| main.rs:138:5:138:5 | a | main.rs:131:38:139:1 | BlockExpr | +| main.rs:132:13:137:5 | 'block: { ... } | main.rs:132:9:132:9 | a | +| main.rs:134:13:134:26 | break ''block 1 | main.rs:132:13:137:5 | 'block: { ... } | +| main.rs:134:26:134:26 | 1 | main.rs:134:13:134:26 | break ''block 1 | +| main.rs:136:9:136:22 | break ''block 2 | main.rs:132:13:137:5 | 'block: { ... } | +| main.rs:136:22:136:22 | 2 | main.rs:136:9:136:22 | break ''block 2 | +| main.rs:138:5:138:5 | a | main.rs:131:38:139:1 | { ... } | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 3cb35a1079fe..0932efcf4846 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -1,28 +1,28 @@ models edges -| main.rs:19:13:19:21 | CallExpr : unit | main.rs:20:10:20:10 | s | provenance | | -| main.rs:24:13:24:21 | CallExpr : unit | main.rs:27:10:27:10 | c | provenance | | -| main.rs:31:13:31:21 | CallExpr : unit | main.rs:36:10:36:10 | b | provenance | | -| main.rs:45:15:45:23 | CallExpr : unit | main.rs:47:10:47:10 | b | provenance | | -| main.rs:53:9:53:17 | CallExpr : unit | main.rs:54:10:54:10 | i | provenance | | +| main.rs:19:13:19:21 | source(...) : unit | main.rs:20:10:20:10 | s | provenance | | +| main.rs:24:13:24:21 | source(...) : unit | main.rs:27:10:27:10 | c | provenance | | +| main.rs:31:13:31:21 | source(...) : unit | main.rs:36:10:36:10 | b | provenance | | +| main.rs:45:15:45:23 | source(...) : unit | main.rs:47:10:47:10 | b | provenance | | +| main.rs:53:9:53:17 | source(...) : unit | main.rs:54:10:54:10 | i | provenance | | nodes -| main.rs:15:10:15:18 | CallExpr | semmle.label | CallExpr | -| main.rs:19:13:19:21 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:15:10:15:18 | source(...) | semmle.label | source(...) | +| main.rs:19:13:19:21 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:20:10:20:10 | s | semmle.label | s | -| main.rs:24:13:24:21 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:24:13:24:21 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:27:10:27:10 | c | semmle.label | c | -| main.rs:31:13:31:21 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:31:13:31:21 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:36:10:36:10 | b | semmle.label | b | -| main.rs:45:15:45:23 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:45:15:45:23 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:47:10:47:10 | b | semmle.label | b | -| main.rs:53:9:53:17 | CallExpr : unit | semmle.label | CallExpr : unit | +| main.rs:53:9:53:17 | source(...) : unit | semmle.label | source(...) : unit | | main.rs:54:10:54:10 | i | semmle.label | i | subpaths testFailures #select -| main.rs:15:10:15:18 | CallExpr | main.rs:15:10:15:18 | CallExpr | main.rs:15:10:15:18 | CallExpr | $@ | main.rs:15:10:15:18 | CallExpr | CallExpr | -| main.rs:20:10:20:10 | s | main.rs:19:13:19:21 | CallExpr : unit | main.rs:20:10:20:10 | s | $@ | main.rs:19:13:19:21 | CallExpr : unit | CallExpr : unit | -| main.rs:27:10:27:10 | c | main.rs:24:13:24:21 | CallExpr : unit | main.rs:27:10:27:10 | c | $@ | main.rs:24:13:24:21 | CallExpr : unit | CallExpr : unit | -| main.rs:36:10:36:10 | b | main.rs:31:13:31:21 | CallExpr : unit | main.rs:36:10:36:10 | b | $@ | main.rs:31:13:31:21 | CallExpr : unit | CallExpr : unit | -| main.rs:47:10:47:10 | b | main.rs:45:15:45:23 | CallExpr : unit | main.rs:47:10:47:10 | b | $@ | main.rs:45:15:45:23 | CallExpr : unit | CallExpr : unit | -| main.rs:54:10:54:10 | i | main.rs:53:9:53:17 | CallExpr : unit | main.rs:54:10:54:10 | i | $@ | main.rs:53:9:53:17 | CallExpr : unit | CallExpr : unit | +| main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | main.rs:15:10:15:18 | source(...) | $@ | main.rs:15:10:15:18 | source(...) | source(...) | +| main.rs:20:10:20:10 | s | main.rs:19:13:19:21 | source(...) : unit | main.rs:20:10:20:10 | s | $@ | main.rs:19:13:19:21 | source(...) : unit | source(...) : unit | +| main.rs:27:10:27:10 | c | main.rs:24:13:24:21 | source(...) : unit | main.rs:27:10:27:10 | c | $@ | main.rs:24:13:24:21 | source(...) : unit | source(...) : unit | +| main.rs:36:10:36:10 | b | main.rs:31:13:31:21 | source(...) : unit | main.rs:36:10:36:10 | b | $@ | main.rs:31:13:31:21 | source(...) : unit | source(...) : unit | +| main.rs:47:10:47:10 | b | main.rs:45:15:45:23 | source(...) : unit | main.rs:47:10:47:10 | b | $@ | main.rs:45:15:45:23 | source(...) : unit | source(...) : unit | +| main.rs:54:10:54:10 | i | main.rs:53:9:53:17 | source(...) : unit | main.rs:54:10:54:10 | i | $@ | main.rs:53:9:53:17 | source(...) : unit | source(...) : unit | diff --git a/rust/ql/test/library-tests/definitions/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/library-tests/definitions/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index 8d729bb5fd93..000000000000 --- a/rust/ql/test/library-tests/definitions/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,4 +0,0 @@ -uniqueEnclosingCallable -| main.rs:5:29:5:33 | width | Node should have one enclosing callable but has 0. | -| main.rs:5:36:5:44 | precision | Node should have one enclosing callable but has 0. | -| main.rs:9:22:9:27 | people | Node should have one enclosing callable but has 0. | diff --git a/rust/ql/test/library-tests/formatstrings/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/library-tests/formatstrings/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index 5bd870a72056..000000000000 --- a/rust/ql/test/library-tests/formatstrings/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,5 +0,0 @@ -uniqueEnclosingCallable -| main.rs:5:29:5:33 | width | Node should have one enclosing callable but has 0. | -| main.rs:5:36:5:44 | precision | Node should have one enclosing callable but has 0. | -| main.rs:16:22:16:27 | people | Node should have one enclosing callable but has 0. | -| main.rs:27:23:27:27 | width | Node should have one enclosing callable but has 0. | diff --git a/rust/ql/test/library-tests/variables/Cfg.expected b/rust/ql/test/library-tests/variables/Cfg.expected index bb635f788792..77ea9a8b15bf 100644 --- a/rust/ql/test/library-tests/variables/Cfg.expected +++ b/rust/ql/test/library-tests/variables/Cfg.expected @@ -1,292 +1,292 @@ edges -| variables.rs:3:1:5:1 | enter print_str | variables.rs:3:14:3:14 | s | | -| variables.rs:3:1:5:1 | exit print_str (normal) | variables.rs:3:1:5:1 | exit print_str | | -| variables.rs:3:14:3:14 | s | variables.rs:3:14:3:20 | Param | match | -| variables.rs:3:14:3:20 | Param | variables.rs:4:5:4:22 | ExprStmt | | -| variables.rs:3:23:5:1 | BlockExpr | variables.rs:3:1:5:1 | exit print_str (normal) | | -| variables.rs:4:5:4:21 | $crate::io::_print | variables.rs:4:14:4:17 | "{}\\n" | | -| variables.rs:4:5:4:21 | MacroExpr | variables.rs:3:23:5:1 | BlockExpr | | +| variables.rs:3:1:5:1 | enter fn print_str | variables.rs:3:14:3:14 | s | | +| variables.rs:3:1:5:1 | exit fn print_str (normal) | variables.rs:3:1:5:1 | exit fn print_str | | +| variables.rs:3:14:3:14 | s | variables.rs:3:14:3:20 | ...: ... | match | +| variables.rs:3:14:3:20 | ...: ... | variables.rs:4:5:4:22 | ExprStmt | | +| variables.rs:3:23:5:1 | { ... } | variables.rs:3:1:5:1 | exit fn print_str (normal) | | +| variables.rs:4:5:4:21 | ...::_print | variables.rs:4:14:4:17 | "{}\\n" | | +| variables.rs:4:5:4:21 | MacroExpr | variables.rs:3:23:5:1 | { ... } | | | variables.rs:4:5:4:22 | ExprStmt | variables.rs:4:14:4:20 | MacroStmts | | | variables.rs:4:14:4:17 | "{}\\n" | variables.rs:4:20:4:20 | s | | -| variables.rs:4:14:4:20 | BlockExpr | variables.rs:4:5:4:21 | MacroExpr | | -| variables.rs:4:14:4:20 | CallExpr | variables.rs:4:14:4:20 | BlockExpr | | -| variables.rs:4:14:4:20 | ExprStmt | variables.rs:4:5:4:21 | $crate::io::_print | | +| variables.rs:4:14:4:20 | ...::_print(...) | variables.rs:4:14:4:20 | { ... } | | +| variables.rs:4:14:4:20 | ExprStmt | variables.rs:4:5:4:21 | ...::_print | | | variables.rs:4:14:4:20 | FormatArgsExpr | variables.rs:4:14:4:20 | MacroExpr | | -| variables.rs:4:14:4:20 | MacroExpr | variables.rs:4:14:4:20 | CallExpr | | +| variables.rs:4:14:4:20 | MacroExpr | variables.rs:4:14:4:20 | ...::_print(...) | | | variables.rs:4:14:4:20 | MacroStmts | variables.rs:4:14:4:20 | ExprStmt | | +| variables.rs:4:14:4:20 | { ... } | variables.rs:4:5:4:21 | MacroExpr | | | variables.rs:4:20:4:20 | s | variables.rs:4:14:4:20 | FormatArgsExpr | | -| variables.rs:7:1:9:1 | enter print_i64 | variables.rs:7:14:7:14 | i | | -| variables.rs:7:1:9:1 | exit print_i64 (normal) | variables.rs:7:1:9:1 | exit print_i64 | | -| variables.rs:7:14:7:14 | i | variables.rs:7:14:7:19 | Param | match | -| variables.rs:7:14:7:19 | Param | variables.rs:8:5:8:22 | ExprStmt | | -| variables.rs:7:22:9:1 | BlockExpr | variables.rs:7:1:9:1 | exit print_i64 (normal) | | -| variables.rs:8:5:8:21 | $crate::io::_print | variables.rs:8:14:8:17 | "{}\\n" | | -| variables.rs:8:5:8:21 | MacroExpr | variables.rs:7:22:9:1 | BlockExpr | | +| variables.rs:7:1:9:1 | enter fn print_i64 | variables.rs:7:14:7:14 | i | | +| variables.rs:7:1:9:1 | exit fn print_i64 (normal) | variables.rs:7:1:9:1 | exit fn print_i64 | | +| variables.rs:7:14:7:14 | i | variables.rs:7:14:7:19 | ...: i64 | match | +| variables.rs:7:14:7:19 | ...: i64 | variables.rs:8:5:8:22 | ExprStmt | | +| variables.rs:7:22:9:1 | { ... } | variables.rs:7:1:9:1 | exit fn print_i64 (normal) | | +| variables.rs:8:5:8:21 | ...::_print | variables.rs:8:14:8:17 | "{}\\n" | | +| variables.rs:8:5:8:21 | MacroExpr | variables.rs:7:22:9:1 | { ... } | | | variables.rs:8:5:8:22 | ExprStmt | variables.rs:8:14:8:20 | MacroStmts | | | variables.rs:8:14:8:17 | "{}\\n" | variables.rs:8:20:8:20 | i | | -| variables.rs:8:14:8:20 | BlockExpr | variables.rs:8:5:8:21 | MacroExpr | | -| variables.rs:8:14:8:20 | CallExpr | variables.rs:8:14:8:20 | BlockExpr | | -| variables.rs:8:14:8:20 | ExprStmt | variables.rs:8:5:8:21 | $crate::io::_print | | +| variables.rs:8:14:8:20 | ...::_print(...) | variables.rs:8:14:8:20 | { ... } | | +| variables.rs:8:14:8:20 | ExprStmt | variables.rs:8:5:8:21 | ...::_print | | | variables.rs:8:14:8:20 | FormatArgsExpr | variables.rs:8:14:8:20 | MacroExpr | | -| variables.rs:8:14:8:20 | MacroExpr | variables.rs:8:14:8:20 | CallExpr | | +| variables.rs:8:14:8:20 | MacroExpr | variables.rs:8:14:8:20 | ...::_print(...) | | | variables.rs:8:14:8:20 | MacroStmts | variables.rs:8:14:8:20 | ExprStmt | | +| variables.rs:8:14:8:20 | { ... } | variables.rs:8:5:8:21 | MacroExpr | | | variables.rs:8:20:8:20 | i | variables.rs:8:14:8:20 | FormatArgsExpr | | -| variables.rs:11:1:13:1 | enter print_i64_ref | variables.rs:11:18:11:18 | i | | -| variables.rs:11:1:13:1 | exit print_i64_ref (normal) | variables.rs:11:1:13:1 | exit print_i64_ref | | -| variables.rs:11:18:11:18 | i | variables.rs:11:18:11:24 | Param | match | -| variables.rs:11:18:11:24 | Param | variables.rs:12:5:12:13 | print_i64 | | -| variables.rs:11:27:13:1 | BlockExpr | variables.rs:11:1:13:1 | exit print_i64_ref (normal) | | +| variables.rs:11:1:13:1 | enter fn print_i64_ref | variables.rs:11:18:11:18 | i | | +| variables.rs:11:1:13:1 | exit fn print_i64_ref (normal) | variables.rs:11:1:13:1 | exit fn print_i64_ref | | +| variables.rs:11:18:11:18 | i | variables.rs:11:18:11:24 | ...: ... | match | +| variables.rs:11:18:11:24 | ...: ... | variables.rs:12:5:12:13 | print_i64 | | +| variables.rs:11:27:13:1 | { ... } | variables.rs:11:1:13:1 | exit fn print_i64_ref (normal) | | | variables.rs:12:5:12:13 | print_i64 | variables.rs:12:16:12:16 | i | | -| variables.rs:12:5:12:17 | CallExpr | variables.rs:11:27:13:1 | BlockExpr | | -| variables.rs:12:15:12:16 | * ... | variables.rs:12:5:12:17 | CallExpr | | +| variables.rs:12:5:12:17 | print_i64(...) | variables.rs:11:27:13:1 | { ... } | | +| variables.rs:12:15:12:16 | * ... | variables.rs:12:5:12:17 | print_i64(...) | | | variables.rs:12:16:12:16 | i | variables.rs:12:15:12:16 | * ... | | -| variables.rs:15:1:18:1 | enter immutable_variable | variables.rs:16:5:16:17 | LetStmt | | -| variables.rs:15:1:18:1 | exit immutable_variable (normal) | variables.rs:15:1:18:1 | exit immutable_variable | | -| variables.rs:15:25:18:1 | BlockExpr | variables.rs:15:1:18:1 | exit immutable_variable (normal) | | -| variables.rs:16:5:16:17 | LetStmt | variables.rs:16:14:16:16 | "a" | | +| variables.rs:15:1:18:1 | enter fn immutable_variable | variables.rs:16:5:16:17 | let ... = "a" | | +| variables.rs:15:1:18:1 | exit fn immutable_variable (normal) | variables.rs:15:1:18:1 | exit fn immutable_variable | | +| variables.rs:15:25:18:1 | { ... } | variables.rs:15:1:18:1 | exit fn immutable_variable (normal) | | +| variables.rs:16:5:16:17 | let ... = "a" | variables.rs:16:14:16:16 | "a" | | | variables.rs:16:9:16:10 | x1 | variables.rs:17:5:17:18 | ExprStmt | match | | variables.rs:16:14:16:16 | "a" | variables.rs:16:9:16:10 | x1 | | | variables.rs:17:5:17:13 | print_str | variables.rs:17:15:17:16 | x1 | | -| variables.rs:17:5:17:17 | CallExpr | variables.rs:15:25:18:1 | BlockExpr | | +| variables.rs:17:5:17:17 | print_str(...) | variables.rs:15:25:18:1 | { ... } | | | variables.rs:17:5:17:18 | ExprStmt | variables.rs:17:5:17:13 | print_str | | -| variables.rs:17:15:17:16 | x1 | variables.rs:17:5:17:17 | CallExpr | | -| variables.rs:20:1:25:1 | enter mutable_variable | variables.rs:21:5:21:19 | LetStmt | | -| variables.rs:20:1:25:1 | exit mutable_variable (normal) | variables.rs:20:1:25:1 | exit mutable_variable | | -| variables.rs:20:23:25:1 | BlockExpr | variables.rs:20:1:25:1 | exit mutable_variable (normal) | | -| variables.rs:21:5:21:19 | LetStmt | variables.rs:21:18:21:18 | 4 | | +| variables.rs:17:15:17:16 | x1 | variables.rs:17:5:17:17 | print_str(...) | | +| variables.rs:20:1:25:1 | enter fn mutable_variable | variables.rs:21:5:21:19 | let ... = 4 | | +| variables.rs:20:1:25:1 | exit fn mutable_variable (normal) | variables.rs:20:1:25:1 | exit fn mutable_variable | | +| variables.rs:20:23:25:1 | { ... } | variables.rs:20:1:25:1 | exit fn mutable_variable (normal) | | +| variables.rs:21:5:21:19 | let ... = 4 | variables.rs:21:18:21:18 | 4 | | | variables.rs:21:9:21:14 | x2 | variables.rs:22:5:22:18 | ExprStmt | match | | variables.rs:21:18:21:18 | 4 | variables.rs:21:9:21:14 | x2 | | | variables.rs:22:5:22:13 | print_i64 | variables.rs:22:15:22:16 | x2 | | -| variables.rs:22:5:22:17 | CallExpr | variables.rs:23:5:23:11 | ExprStmt | | +| variables.rs:22:5:22:17 | print_i64(...) | variables.rs:23:5:23:11 | ExprStmt | | | variables.rs:22:5:22:18 | ExprStmt | variables.rs:22:5:22:13 | print_i64 | | -| variables.rs:22:15:22:16 | x2 | variables.rs:22:5:22:17 | CallExpr | | +| variables.rs:22:15:22:16 | x2 | variables.rs:22:5:22:17 | print_i64(...) | | | variables.rs:23:5:23:6 | x2 | variables.rs:23:10:23:10 | 5 | | | variables.rs:23:5:23:10 | ... = ... | variables.rs:24:5:24:18 | ExprStmt | | | variables.rs:23:5:23:11 | ExprStmt | variables.rs:23:5:23:6 | x2 | | | variables.rs:23:10:23:10 | 5 | variables.rs:23:5:23:10 | ... = ... | | | variables.rs:24:5:24:13 | print_i64 | variables.rs:24:15:24:16 | x2 | | -| variables.rs:24:5:24:17 | CallExpr | variables.rs:20:23:25:1 | BlockExpr | | +| variables.rs:24:5:24:17 | print_i64(...) | variables.rs:20:23:25:1 | { ... } | | | variables.rs:24:5:24:18 | ExprStmt | variables.rs:24:5:24:13 | print_i64 | | -| variables.rs:24:15:24:16 | x2 | variables.rs:24:5:24:17 | CallExpr | | -| variables.rs:27:1:32:1 | enter mutable_variable_immutable_borrow | variables.rs:28:5:28:18 | LetStmt | | -| variables.rs:27:1:32:1 | exit mutable_variable_immutable_borrow (normal) | variables.rs:27:1:32:1 | exit mutable_variable_immutable_borrow | | -| variables.rs:27:40:32:1 | BlockExpr | variables.rs:27:1:32:1 | exit mutable_variable_immutable_borrow (normal) | | -| variables.rs:28:5:28:18 | LetStmt | variables.rs:28:17:28:17 | 1 | | +| variables.rs:24:15:24:16 | x2 | variables.rs:24:5:24:17 | print_i64(...) | | +| variables.rs:27:1:32:1 | enter fn mutable_variable_immutable_borrow | variables.rs:28:5:28:18 | let ... = 1 | | +| variables.rs:27:1:32:1 | exit fn mutable_variable_immutable_borrow (normal) | variables.rs:27:1:32:1 | exit fn mutable_variable_immutable_borrow | | +| variables.rs:27:40:32:1 | { ... } | variables.rs:27:1:32:1 | exit fn mutable_variable_immutable_borrow (normal) | | +| variables.rs:28:5:28:18 | let ... = 1 | variables.rs:28:17:28:17 | 1 | | | variables.rs:28:9:28:13 | x | variables.rs:29:5:29:22 | ExprStmt | match | | variables.rs:28:17:28:17 | 1 | variables.rs:28:9:28:13 | x | | | variables.rs:29:5:29:17 | print_i64_ref | variables.rs:29:20:29:20 | x | | -| variables.rs:29:5:29:21 | CallExpr | variables.rs:30:5:30:10 | ExprStmt | | +| variables.rs:29:5:29:21 | print_i64_ref(...) | variables.rs:30:5:30:10 | ExprStmt | | | variables.rs:29:5:29:22 | ExprStmt | variables.rs:29:5:29:17 | print_i64_ref | | -| variables.rs:29:19:29:20 | RefExpr | variables.rs:29:5:29:21 | CallExpr | | -| variables.rs:29:20:29:20 | x | variables.rs:29:19:29:20 | RefExpr | | +| variables.rs:29:19:29:20 | &x | variables.rs:29:5:29:21 | print_i64_ref(...) | | +| variables.rs:29:20:29:20 | x | variables.rs:29:19:29:20 | &x | | | variables.rs:30:5:30:5 | x | variables.rs:30:9:30:9 | 2 | | | variables.rs:30:5:30:9 | ... = ... | variables.rs:31:5:31:22 | ExprStmt | | | variables.rs:30:5:30:10 | ExprStmt | variables.rs:30:5:30:5 | x | | | variables.rs:30:9:30:9 | 2 | variables.rs:30:5:30:9 | ... = ... | | | variables.rs:31:5:31:17 | print_i64_ref | variables.rs:31:20:31:20 | x | | -| variables.rs:31:5:31:21 | CallExpr | variables.rs:27:40:32:1 | BlockExpr | | +| variables.rs:31:5:31:21 | print_i64_ref(...) | variables.rs:27:40:32:1 | { ... } | | | variables.rs:31:5:31:22 | ExprStmt | variables.rs:31:5:31:17 | print_i64_ref | | -| variables.rs:31:19:31:20 | RefExpr | variables.rs:31:5:31:21 | CallExpr | | -| variables.rs:31:20:31:20 | x | variables.rs:31:19:31:20 | RefExpr | | -| variables.rs:34:1:40:1 | enter variable_shadow1 | variables.rs:35:5:35:15 | LetStmt | | -| variables.rs:34:1:40:1 | exit variable_shadow1 (normal) | variables.rs:34:1:40:1 | exit variable_shadow1 | | -| variables.rs:34:23:40:1 | BlockExpr | variables.rs:34:1:40:1 | exit variable_shadow1 (normal) | | -| variables.rs:35:5:35:15 | LetStmt | variables.rs:35:14:35:14 | 1 | | +| variables.rs:31:19:31:20 | &x | variables.rs:31:5:31:21 | print_i64_ref(...) | | +| variables.rs:31:20:31:20 | x | variables.rs:31:19:31:20 | &x | | +| variables.rs:34:1:40:1 | enter fn variable_shadow1 | variables.rs:35:5:35:15 | let ... = 1 | | +| variables.rs:34:1:40:1 | exit fn variable_shadow1 (normal) | variables.rs:34:1:40:1 | exit fn variable_shadow1 | | +| variables.rs:34:23:40:1 | { ... } | variables.rs:34:1:40:1 | exit fn variable_shadow1 (normal) | | +| variables.rs:35:5:35:15 | let ... = 1 | variables.rs:35:14:35:14 | 1 | | | variables.rs:35:9:35:10 | x3 | variables.rs:36:5:36:18 | ExprStmt | match | | variables.rs:35:14:35:14 | 1 | variables.rs:35:9:35:10 | x3 | | | variables.rs:36:5:36:13 | print_i64 | variables.rs:36:15:36:16 | x3 | | -| variables.rs:36:5:36:17 | CallExpr | variables.rs:37:5:38:15 | LetStmt | | +| variables.rs:36:5:36:17 | print_i64(...) | variables.rs:37:5:38:15 | let ... = ... | | | variables.rs:36:5:36:18 | ExprStmt | variables.rs:36:5:36:13 | print_i64 | | -| variables.rs:36:15:36:16 | x3 | variables.rs:36:5:36:17 | CallExpr | | -| variables.rs:37:5:38:15 | LetStmt | variables.rs:38:9:38:10 | x3 | | +| variables.rs:36:15:36:16 | x3 | variables.rs:36:5:36:17 | print_i64(...) | | +| variables.rs:37:5:38:15 | let ... = ... | variables.rs:38:9:38:10 | x3 | | | variables.rs:37:9:37:10 | x3 | variables.rs:39:5:39:18 | ExprStmt | match | | variables.rs:38:9:38:10 | x3 | variables.rs:38:14:38:14 | 1 | | | variables.rs:38:9:38:14 | ... + ... | variables.rs:37:9:37:10 | x3 | | | variables.rs:38:14:38:14 | 1 | variables.rs:38:9:38:14 | ... + ... | | | variables.rs:39:5:39:13 | print_i64 | variables.rs:39:15:39:16 | x3 | | -| variables.rs:39:5:39:17 | CallExpr | variables.rs:34:23:40:1 | BlockExpr | | +| variables.rs:39:5:39:17 | print_i64(...) | variables.rs:34:23:40:1 | { ... } | | | variables.rs:39:5:39:18 | ExprStmt | variables.rs:39:5:39:13 | print_i64 | | -| variables.rs:39:15:39:16 | x3 | variables.rs:39:5:39:17 | CallExpr | | -| variables.rs:42:1:50:1 | enter variable_shadow2 | variables.rs:43:5:43:17 | LetStmt | | -| variables.rs:42:1:50:1 | exit variable_shadow2 (normal) | variables.rs:42:1:50:1 | exit variable_shadow2 | | -| variables.rs:42:23:50:1 | BlockExpr | variables.rs:42:1:50:1 | exit variable_shadow2 (normal) | | -| variables.rs:43:5:43:17 | LetStmt | variables.rs:43:14:43:16 | "a" | | +| variables.rs:39:15:39:16 | x3 | variables.rs:39:5:39:17 | print_i64(...) | | +| variables.rs:42:1:50:1 | enter fn variable_shadow2 | variables.rs:43:5:43:17 | let ... = "a" | | +| variables.rs:42:1:50:1 | exit fn variable_shadow2 (normal) | variables.rs:42:1:50:1 | exit fn variable_shadow2 | | +| variables.rs:42:23:50:1 | { ... } | variables.rs:42:1:50:1 | exit fn variable_shadow2 (normal) | | +| variables.rs:43:5:43:17 | let ... = "a" | variables.rs:43:14:43:16 | "a" | | | variables.rs:43:9:43:10 | x4 | variables.rs:44:5:44:18 | ExprStmt | match | | variables.rs:43:14:43:16 | "a" | variables.rs:43:9:43:10 | x4 | | | variables.rs:44:5:44:13 | print_str | variables.rs:44:15:44:16 | x4 | | -| variables.rs:44:5:44:17 | CallExpr | variables.rs:45:5:48:5 | ExprStmt | | +| variables.rs:44:5:44:17 | print_str(...) | variables.rs:45:5:48:5 | ExprStmt | | | variables.rs:44:5:44:18 | ExprStmt | variables.rs:44:5:44:13 | print_str | | -| variables.rs:44:15:44:16 | x4 | variables.rs:44:5:44:17 | CallExpr | | -| variables.rs:45:5:48:5 | BlockExpr | variables.rs:49:5:49:18 | ExprStmt | | -| variables.rs:45:5:48:5 | ExprStmt | variables.rs:46:9:46:21 | LetStmt | | -| variables.rs:46:9:46:21 | LetStmt | variables.rs:46:18:46:20 | "b" | | +| variables.rs:44:15:44:16 | x4 | variables.rs:44:5:44:17 | print_str(...) | | +| variables.rs:45:5:48:5 | ExprStmt | variables.rs:46:9:46:21 | let ... = "b" | | +| variables.rs:45:5:48:5 | { ... } | variables.rs:49:5:49:18 | ExprStmt | | +| variables.rs:46:9:46:21 | let ... = "b" | variables.rs:46:18:46:20 | "b" | | | variables.rs:46:13:46:14 | x4 | variables.rs:47:9:47:22 | ExprStmt | match | | variables.rs:46:18:46:20 | "b" | variables.rs:46:13:46:14 | x4 | | | variables.rs:47:9:47:17 | print_str | variables.rs:47:19:47:20 | x4 | | -| variables.rs:47:9:47:21 | CallExpr | variables.rs:45:5:48:5 | BlockExpr | | +| variables.rs:47:9:47:21 | print_str(...) | variables.rs:45:5:48:5 | { ... } | | | variables.rs:47:9:47:22 | ExprStmt | variables.rs:47:9:47:17 | print_str | | -| variables.rs:47:19:47:20 | x4 | variables.rs:47:9:47:21 | CallExpr | | +| variables.rs:47:19:47:20 | x4 | variables.rs:47:9:47:21 | print_str(...) | | | variables.rs:49:5:49:13 | print_str | variables.rs:49:15:49:16 | x4 | | -| variables.rs:49:5:49:17 | CallExpr | variables.rs:42:23:50:1 | BlockExpr | | +| variables.rs:49:5:49:17 | print_str(...) | variables.rs:42:23:50:1 | { ... } | | | variables.rs:49:5:49:18 | ExprStmt | variables.rs:49:5:49:13 | print_str | | -| variables.rs:49:15:49:16 | x4 | variables.rs:49:5:49:17 | CallExpr | | -| variables.rs:57:1:72:1 | enter let_pattern1 | variables.rs:58:5:67:47 | LetStmt | | -| variables.rs:57:1:72:1 | exit let_pattern1 (normal) | variables.rs:57:1:72:1 | exit let_pattern1 | | -| variables.rs:57:19:72:1 | BlockExpr | variables.rs:57:1:72:1 | exit let_pattern1 (normal) | | -| variables.rs:58:5:67:47 | LetStmt | variables.rs:67:11:67:13 | "a" | | +| variables.rs:49:15:49:16 | x4 | variables.rs:49:5:49:17 | print_str(...) | | +| variables.rs:57:1:72:1 | enter fn let_pattern1 | variables.rs:58:5:67:47 | let ... = ... | | +| variables.rs:57:1:72:1 | exit fn let_pattern1 (normal) | variables.rs:57:1:72:1 | exit fn let_pattern1 | | +| variables.rs:57:19:72:1 | { ... } | variables.rs:57:1:72:1 | exit fn let_pattern1 (normal) | | +| variables.rs:58:5:67:47 | let ... = ... | variables.rs:67:11:67:13 | "a" | | | variables.rs:58:9:67:5 | TuplePat | variables.rs:59:9:62:9 | TuplePat | match | | variables.rs:59:9:62:9 | TuplePat | variables.rs:60:13:60:14 | a1 | match | | variables.rs:60:13:60:14 | a1 | variables.rs:61:13:61:14 | b1 | match | -| variables.rs:61:13:61:14 | b1 | variables.rs:63:9:66:9 | RecordPat | match | -| variables.rs:63:9:66:9 | RecordPat | variables.rs:64:13:64:13 | x | match | +| variables.rs:61:13:61:14 | b1 | variables.rs:63:9:66:9 | Point {...} | match | +| variables.rs:63:9:66:9 | Point {...} | variables.rs:64:13:64:13 | x | match | | variables.rs:64:13:64:13 | x | variables.rs:65:13:65:13 | y | match | | variables.rs:65:13:65:13 | y | variables.rs:68:5:68:18 | ExprStmt | match | | variables.rs:67:9:67:46 | TupleExpr | variables.rs:58:9:67:5 | TuplePat | | | variables.rs:67:10:67:19 | TupleExpr | variables.rs:67:33:67:35 | "x" | | | variables.rs:67:11:67:13 | "a" | variables.rs:67:16:67:18 | "b" | | | variables.rs:67:16:67:18 | "b" | variables.rs:67:10:67:19 | TupleExpr | | -| variables.rs:67:22:67:45 | RecordExpr | variables.rs:67:9:67:46 | TupleExpr | | +| variables.rs:67:22:67:45 | Point {...} | variables.rs:67:9:67:46 | TupleExpr | | | variables.rs:67:33:67:35 | "x" | variables.rs:67:41:67:43 | "y" | | -| variables.rs:67:41:67:43 | "y" | variables.rs:67:22:67:45 | RecordExpr | | +| variables.rs:67:41:67:43 | "y" | variables.rs:67:22:67:45 | Point {...} | | | variables.rs:68:5:68:13 | print_str | variables.rs:68:15:68:16 | a1 | | -| variables.rs:68:5:68:17 | CallExpr | variables.rs:69:5:69:18 | ExprStmt | | +| variables.rs:68:5:68:17 | print_str(...) | variables.rs:69:5:69:18 | ExprStmt | | | variables.rs:68:5:68:18 | ExprStmt | variables.rs:68:5:68:13 | print_str | | -| variables.rs:68:15:68:16 | a1 | variables.rs:68:5:68:17 | CallExpr | | +| variables.rs:68:15:68:16 | a1 | variables.rs:68:5:68:17 | print_str(...) | | | variables.rs:69:5:69:13 | print_str | variables.rs:69:15:69:16 | b1 | | -| variables.rs:69:5:69:17 | CallExpr | variables.rs:70:5:70:17 | ExprStmt | | +| variables.rs:69:5:69:17 | print_str(...) | variables.rs:70:5:70:17 | ExprStmt | | | variables.rs:69:5:69:18 | ExprStmt | variables.rs:69:5:69:13 | print_str | | -| variables.rs:69:15:69:16 | b1 | variables.rs:69:5:69:17 | CallExpr | | +| variables.rs:69:15:69:16 | b1 | variables.rs:69:5:69:17 | print_str(...) | | | variables.rs:70:5:70:13 | print_str | variables.rs:70:15:70:15 | x | | -| variables.rs:70:5:70:16 | CallExpr | variables.rs:71:5:71:17 | ExprStmt | | +| variables.rs:70:5:70:16 | print_str(...) | variables.rs:71:5:71:17 | ExprStmt | | | variables.rs:70:5:70:17 | ExprStmt | variables.rs:70:5:70:13 | print_str | | -| variables.rs:70:15:70:15 | x | variables.rs:70:5:70:16 | CallExpr | | +| variables.rs:70:15:70:15 | x | variables.rs:70:5:70:16 | print_str(...) | | | variables.rs:71:5:71:13 | print_str | variables.rs:71:15:71:15 | y | | -| variables.rs:71:5:71:16 | CallExpr | variables.rs:57:19:72:1 | BlockExpr | | +| variables.rs:71:5:71:16 | print_str(...) | variables.rs:57:19:72:1 | { ... } | | | variables.rs:71:5:71:17 | ExprStmt | variables.rs:71:5:71:13 | print_str | | -| variables.rs:71:15:71:15 | y | variables.rs:71:5:71:16 | CallExpr | | -| variables.rs:74:1:82:1 | enter let_pattern2 | variables.rs:75:5:75:38 | LetStmt | | -| variables.rs:74:1:82:1 | exit let_pattern2 (normal) | variables.rs:74:1:82:1 | exit let_pattern2 | | -| variables.rs:74:19:82:1 | BlockExpr | variables.rs:74:1:82:1 | exit let_pattern2 (normal) | | -| variables.rs:75:5:75:38 | LetStmt | variables.rs:75:25:75:27 | "a" | | -| variables.rs:75:9:75:10 | p1 | variables.rs:76:5:79:11 | LetStmt | match | -| variables.rs:75:14:75:37 | RecordExpr | variables.rs:75:9:75:10 | p1 | | +| variables.rs:71:15:71:15 | y | variables.rs:71:5:71:16 | print_str(...) | | +| variables.rs:74:1:82:1 | enter fn let_pattern2 | variables.rs:75:5:75:38 | let ... = ... | | +| variables.rs:74:1:82:1 | exit fn let_pattern2 (normal) | variables.rs:74:1:82:1 | exit fn let_pattern2 | | +| variables.rs:74:19:82:1 | { ... } | variables.rs:74:1:82:1 | exit fn let_pattern2 (normal) | | +| variables.rs:75:5:75:38 | let ... = ... | variables.rs:75:25:75:27 | "a" | | +| variables.rs:75:9:75:10 | p1 | variables.rs:76:5:79:11 | let ... = p1 | match | +| variables.rs:75:14:75:37 | Point {...} | variables.rs:75:9:75:10 | p1 | | | variables.rs:75:25:75:27 | "a" | variables.rs:75:33:75:35 | "b" | | -| variables.rs:75:33:75:35 | "b" | variables.rs:75:14:75:37 | RecordExpr | | -| variables.rs:76:5:79:11 | LetStmt | variables.rs:79:9:79:10 | p1 | | -| variables.rs:76:9:79:5 | RecordPat | variables.rs:77:12:77:13 | a2 | match | +| variables.rs:75:33:75:35 | "b" | variables.rs:75:14:75:37 | Point {...} | | +| variables.rs:76:5:79:11 | let ... = p1 | variables.rs:79:9:79:10 | p1 | | +| variables.rs:76:9:79:5 | Point {...} | variables.rs:77:12:77:13 | a2 | match | | variables.rs:77:12:77:13 | a2 | variables.rs:78:12:78:13 | b2 | match | | variables.rs:78:12:78:13 | b2 | variables.rs:80:5:80:18 | ExprStmt | match | -| variables.rs:79:9:79:10 | p1 | variables.rs:76:9:79:5 | RecordPat | | +| variables.rs:79:9:79:10 | p1 | variables.rs:76:9:79:5 | Point {...} | | | variables.rs:80:5:80:13 | print_str | variables.rs:80:15:80:16 | a2 | | -| variables.rs:80:5:80:17 | CallExpr | variables.rs:81:5:81:18 | ExprStmt | | +| variables.rs:80:5:80:17 | print_str(...) | variables.rs:81:5:81:18 | ExprStmt | | | variables.rs:80:5:80:18 | ExprStmt | variables.rs:80:5:80:13 | print_str | | -| variables.rs:80:15:80:16 | a2 | variables.rs:80:5:80:17 | CallExpr | | +| variables.rs:80:15:80:16 | a2 | variables.rs:80:5:80:17 | print_str(...) | | | variables.rs:81:5:81:13 | print_str | variables.rs:81:15:81:16 | b2 | | -| variables.rs:81:5:81:17 | CallExpr | variables.rs:74:19:82:1 | BlockExpr | | +| variables.rs:81:5:81:17 | print_str(...) | variables.rs:74:19:82:1 | { ... } | | | variables.rs:81:5:81:18 | ExprStmt | variables.rs:81:5:81:13 | print_str | | -| variables.rs:81:15:81:16 | b2 | variables.rs:81:5:81:17 | CallExpr | | -| variables.rs:84:1:91:1 | enter let_pattern3 | variables.rs:85:5:85:42 | LetStmt | | -| variables.rs:84:1:91:1 | exit let_pattern3 (normal) | variables.rs:84:1:91:1 | exit let_pattern3 | | -| variables.rs:84:19:91:1 | BlockExpr | variables.rs:84:1:91:1 | exit let_pattern3 (normal) | | -| variables.rs:85:5:85:42 | LetStmt | variables.rs:85:14:85:17 | Some | | -| variables.rs:85:9:85:10 | s1 | variables.rs:87:8:88:12 | LetExpr | match | -| variables.rs:85:14:85:17 | Some | variables.rs:85:19:85:30 | String::from | | -| variables.rs:85:14:85:41 | CallExpr | variables.rs:85:9:85:10 | s1 | | -| variables.rs:85:19:85:30 | String::from | variables.rs:85:32:85:39 | "Hello!" | | -| variables.rs:85:19:85:40 | CallExpr | variables.rs:85:14:85:41 | CallExpr | | -| variables.rs:85:32:85:39 | "Hello!" | variables.rs:85:19:85:40 | CallExpr | | -| variables.rs:87:5:90:5 | IfExpr | variables.rs:84:19:91:1 | BlockExpr | | -| variables.rs:87:8:88:12 | LetExpr | variables.rs:88:11:88:12 | s1 | | -| variables.rs:87:12:87:23 | TupleStructPat | variables.rs:87:5:90:5 | IfExpr | no-match | +| variables.rs:81:15:81:16 | b2 | variables.rs:81:5:81:17 | print_str(...) | | +| variables.rs:84:1:91:1 | enter fn let_pattern3 | variables.rs:85:5:85:42 | let ... = ... | | +| variables.rs:84:1:91:1 | exit fn let_pattern3 (normal) | variables.rs:84:1:91:1 | exit fn let_pattern3 | | +| variables.rs:84:19:91:1 | { ... } | variables.rs:84:1:91:1 | exit fn let_pattern3 (normal) | | +| variables.rs:85:5:85:42 | let ... = ... | variables.rs:85:14:85:17 | Some | | +| variables.rs:85:9:85:10 | s1 | variables.rs:87:8:88:12 | let ... = s1 | match | +| variables.rs:85:14:85:17 | Some | variables.rs:85:19:85:30 | ...::from | | +| variables.rs:85:14:85:41 | Some(...) | variables.rs:85:9:85:10 | s1 | | +| variables.rs:85:19:85:30 | ...::from | variables.rs:85:32:85:39 | "Hello!" | | +| variables.rs:85:19:85:40 | ...::from(...) | variables.rs:85:14:85:41 | Some(...) | | +| variables.rs:85:32:85:39 | "Hello!" | variables.rs:85:19:85:40 | ...::from(...) | | +| variables.rs:87:5:90:5 | if ... {...} | variables.rs:84:19:91:1 | { ... } | | +| variables.rs:87:8:88:12 | let ... = s1 | variables.rs:88:11:88:12 | s1 | | +| variables.rs:87:12:87:23 | TupleStructPat | variables.rs:87:5:90:5 | if ... {...} | no-match | | variables.rs:87:12:87:23 | TupleStructPat | variables.rs:87:17:87:22 | s2 | match | | variables.rs:87:17:87:22 | s2 | variables.rs:89:9:89:22 | ExprStmt | match | | variables.rs:88:11:88:12 | s1 | variables.rs:87:12:87:23 | TupleStructPat | | -| variables.rs:88:14:90:5 | BlockExpr | variables.rs:87:5:90:5 | IfExpr | | +| variables.rs:88:14:90:5 | { ... } | variables.rs:87:5:90:5 | if ... {...} | | | variables.rs:89:9:89:17 | print_str | variables.rs:89:19:89:20 | s2 | | -| variables.rs:89:9:89:21 | CallExpr | variables.rs:88:14:90:5 | BlockExpr | | +| variables.rs:89:9:89:21 | print_str(...) | variables.rs:88:14:90:5 | { ... } | | | variables.rs:89:9:89:22 | ExprStmt | variables.rs:89:9:89:17 | print_str | | -| variables.rs:89:19:89:20 | s2 | variables.rs:89:9:89:21 | CallExpr | | -| variables.rs:93:1:99:1 | enter let_pattern4 | variables.rs:94:5:97:10 | LetStmt | | -| variables.rs:93:1:99:1 | exit let_pattern4 (normal) | variables.rs:93:1:99:1 | exit let_pattern4 | | -| variables.rs:93:19:99:1 | BlockExpr | variables.rs:93:1:99:1 | exit let_pattern4 (normal) | | -| variables.rs:94:5:97:10 | LetStmt | variables.rs:94:34:94:37 | Some | | +| variables.rs:89:19:89:20 | s2 | variables.rs:89:9:89:21 | print_str(...) | | +| variables.rs:93:1:99:1 | enter fn let_pattern4 | variables.rs:94:5:97:10 | let ... = ... else {...} | | +| variables.rs:93:1:99:1 | exit fn let_pattern4 (normal) | variables.rs:93:1:99:1 | exit fn let_pattern4 | | +| variables.rs:93:19:99:1 | { ... } | variables.rs:93:1:99:1 | exit fn let_pattern4 (normal) | | +| variables.rs:94:5:97:10 | let ... = ... else {...} | variables.rs:94:34:94:37 | Some | | | variables.rs:94:9:94:16 | TupleStructPat | variables.rs:94:14:94:15 | x5 | match | | variables.rs:94:9:94:16 | TupleStructPat | variables.rs:96:13:96:19 | MacroStmts | no-match | | variables.rs:94:14:94:15 | x5 | variables.rs:98:5:98:18 | ExprStmt | match | | variables.rs:94:34:94:37 | Some | variables.rs:94:39:94:42 | "x5" | | -| variables.rs:94:34:94:43 | CallExpr | variables.rs:94:9:94:16 | TupleStructPat | | -| variables.rs:94:39:94:42 | "x5" | variables.rs:94:34:94:43 | CallExpr | | -| variables.rs:96:13:96:19 | "not yet implemented" | variables.rs:96:13:96:19 | CallExpr | | -| variables.rs:96:13:96:19 | $crate::panicking::panic | variables.rs:96:13:96:19 | "not yet implemented" | | -| variables.rs:96:13:96:19 | CallExpr | variables.rs:96:13:96:19 | MacroExpr | | -| variables.rs:96:13:96:19 | MacroExpr | variables.rs:95:14:97:9 | BlockExpr | | -| variables.rs:96:13:96:19 | MacroStmts | variables.rs:96:13:96:19 | $crate::panicking::panic | | +| variables.rs:94:34:94:43 | Some(...) | variables.rs:94:9:94:16 | TupleStructPat | | +| variables.rs:94:39:94:42 | "x5" | variables.rs:94:34:94:43 | Some(...) | | +| variables.rs:96:13:96:19 | "not yet implemented" | variables.rs:96:13:96:19 | ...::panic(...) | | +| variables.rs:96:13:96:19 | ...::panic | variables.rs:96:13:96:19 | "not yet implemented" | | +| variables.rs:96:13:96:19 | ...::panic(...) | variables.rs:96:13:96:19 | MacroExpr | | +| variables.rs:96:13:96:19 | MacroExpr | variables.rs:95:14:97:9 | { ... } | | +| variables.rs:96:13:96:19 | MacroStmts | variables.rs:96:13:96:19 | ...::panic | | | variables.rs:98:5:98:13 | print_str | variables.rs:98:15:98:16 | x5 | | -| variables.rs:98:5:98:17 | CallExpr | variables.rs:93:19:99:1 | BlockExpr | | +| variables.rs:98:5:98:17 | print_str(...) | variables.rs:93:19:99:1 | { ... } | | | variables.rs:98:5:98:18 | ExprStmt | variables.rs:98:5:98:13 | print_str | | -| variables.rs:98:15:98:16 | x5 | variables.rs:98:5:98:17 | CallExpr | | -| variables.rs:101:1:108:1 | enter let_pattern5 | variables.rs:102:5:102:42 | LetStmt | | -| variables.rs:101:1:108:1 | exit let_pattern5 (normal) | variables.rs:101:1:108:1 | exit let_pattern5 | | -| variables.rs:101:19:108:1 | BlockExpr | variables.rs:101:1:108:1 | exit let_pattern5 (normal) | | -| variables.rs:102:5:102:42 | LetStmt | variables.rs:102:14:102:17 | Some | | -| variables.rs:102:9:102:10 | s1 | variables.rs:104:11:105:12 | LetExpr | match | -| variables.rs:102:14:102:17 | Some | variables.rs:102:19:102:30 | String::from | | -| variables.rs:102:14:102:41 | CallExpr | variables.rs:102:9:102:10 | s1 | | -| variables.rs:102:19:102:30 | String::from | variables.rs:102:32:102:39 | "Hello!" | | -| variables.rs:102:19:102:40 | CallExpr | variables.rs:102:14:102:41 | CallExpr | | -| variables.rs:102:32:102:39 | "Hello!" | variables.rs:102:19:102:40 | CallExpr | | -| variables.rs:104:5:107:5 | WhileExpr | variables.rs:101:19:108:1 | BlockExpr | | -| variables.rs:104:11:105:12 | LetExpr | variables.rs:105:11:105:12 | s1 | | -| variables.rs:104:15:104:26 | TupleStructPat | variables.rs:104:5:107:5 | WhileExpr | no-match | +| variables.rs:98:15:98:16 | x5 | variables.rs:98:5:98:17 | print_str(...) | | +| variables.rs:101:1:108:1 | enter fn let_pattern5 | variables.rs:102:5:102:42 | let ... = ... | | +| variables.rs:101:1:108:1 | exit fn let_pattern5 (normal) | variables.rs:101:1:108:1 | exit fn let_pattern5 | | +| variables.rs:101:19:108:1 | { ... } | variables.rs:101:1:108:1 | exit fn let_pattern5 (normal) | | +| variables.rs:102:5:102:42 | let ... = ... | variables.rs:102:14:102:17 | Some | | +| variables.rs:102:9:102:10 | s1 | variables.rs:104:11:105:12 | let ... = s1 | match | +| variables.rs:102:14:102:17 | Some | variables.rs:102:19:102:30 | ...::from | | +| variables.rs:102:14:102:41 | Some(...) | variables.rs:102:9:102:10 | s1 | | +| variables.rs:102:19:102:30 | ...::from | variables.rs:102:32:102:39 | "Hello!" | | +| variables.rs:102:19:102:40 | ...::from(...) | variables.rs:102:14:102:41 | Some(...) | | +| variables.rs:102:32:102:39 | "Hello!" | variables.rs:102:19:102:40 | ...::from(...) | | +| variables.rs:104:5:107:5 | while ... { ... } | variables.rs:101:19:108:1 | { ... } | | +| variables.rs:104:11:105:12 | let ... = s1 | variables.rs:105:11:105:12 | s1 | | +| variables.rs:104:15:104:26 | TupleStructPat | variables.rs:104:5:107:5 | while ... { ... } | no-match | | variables.rs:104:15:104:26 | TupleStructPat | variables.rs:104:20:104:25 | s2 | match | | variables.rs:104:20:104:25 | s2 | variables.rs:106:9:106:22 | ExprStmt | match | | variables.rs:105:11:105:12 | s1 | variables.rs:104:15:104:26 | TupleStructPat | | -| variables.rs:105:14:107:5 | BlockExpr | variables.rs:104:11:105:12 | LetExpr | | +| variables.rs:105:14:107:5 | { ... } | variables.rs:104:11:105:12 | let ... = s1 | | | variables.rs:106:9:106:17 | print_str | variables.rs:106:19:106:20 | s2 | | -| variables.rs:106:9:106:21 | CallExpr | variables.rs:105:14:107:5 | BlockExpr | | +| variables.rs:106:9:106:21 | print_str(...) | variables.rs:105:14:107:5 | { ... } | | | variables.rs:106:9:106:22 | ExprStmt | variables.rs:106:9:106:17 | print_str | | -| variables.rs:106:19:106:20 | s2 | variables.rs:106:9:106:21 | CallExpr | | -| variables.rs:110:1:125:1 | enter match_pattern1 | variables.rs:111:5:111:21 | LetStmt | | -| variables.rs:110:1:125:1 | exit match_pattern1 (normal) | variables.rs:110:1:125:1 | exit match_pattern1 | | -| variables.rs:110:21:125:1 | BlockExpr | variables.rs:110:1:125:1 | exit match_pattern1 (normal) | | -| variables.rs:111:5:111:21 | LetStmt | variables.rs:111:14:111:17 | Some | | -| variables.rs:111:9:111:10 | x6 | variables.rs:112:5:112:16 | LetStmt | match | +| variables.rs:106:19:106:20 | s2 | variables.rs:106:9:106:21 | print_str(...) | | +| variables.rs:110:1:125:1 | enter fn match_pattern1 | variables.rs:111:5:111:21 | let ... = ... | | +| variables.rs:110:1:125:1 | exit fn match_pattern1 (normal) | variables.rs:110:1:125:1 | exit fn match_pattern1 | | +| variables.rs:110:21:125:1 | { ... } | variables.rs:110:1:125:1 | exit fn match_pattern1 (normal) | | +| variables.rs:111:5:111:21 | let ... = ... | variables.rs:111:14:111:17 | Some | | +| variables.rs:111:9:111:10 | x6 | variables.rs:112:5:112:16 | let ... = 10 | match | | variables.rs:111:14:111:17 | Some | variables.rs:111:19:111:19 | 5 | | -| variables.rs:111:14:111:20 | CallExpr | variables.rs:111:9:111:10 | x6 | | -| variables.rs:111:19:111:19 | 5 | variables.rs:111:14:111:20 | CallExpr | | -| variables.rs:112:5:112:16 | LetStmt | variables.rs:112:14:112:15 | 10 | | +| variables.rs:111:14:111:20 | Some(...) | variables.rs:111:9:111:10 | x6 | | +| variables.rs:111:19:111:19 | 5 | variables.rs:111:14:111:20 | Some(...) | | +| variables.rs:112:5:112:16 | let ... = 10 | variables.rs:112:14:112:15 | 10 | | | variables.rs:112:9:112:10 | y1 | variables.rs:114:5:122:5 | ExprStmt | match | | variables.rs:112:14:112:15 | 10 | variables.rs:112:9:112:10 | y1 | | | variables.rs:114:5:122:5 | ExprStmt | variables.rs:114:11:114:12 | x6 | | -| variables.rs:114:5:122:5 | MatchExpr | variables.rs:124:5:124:18 | ExprStmt | | +| variables.rs:114:5:122:5 | match x6 { ... } | variables.rs:124:5:124:18 | ExprStmt | | | variables.rs:114:11:114:12 | x6 | variables.rs:115:9:115:16 | TupleStructPat | | | variables.rs:115:9:115:16 | TupleStructPat | variables.rs:115:14:115:15 | 50 | match | | variables.rs:115:9:115:16 | TupleStructPat | variables.rs:116:9:116:16 | TupleStructPat | no-match | -| variables.rs:115:14:115:15 | 50 | variables.rs:115:14:115:15 | LiteralPat | | -| variables.rs:115:14:115:15 | LiteralPat | variables.rs:115:21:115:29 | print_str | match | -| variables.rs:115:14:115:15 | LiteralPat | variables.rs:116:9:116:16 | TupleStructPat | no-match | +| variables.rs:115:14:115:15 | 50 | variables.rs:115:14:115:15 | 50 | | +| variables.rs:115:14:115:15 | 50 | variables.rs:115:21:115:29 | print_str | match | +| variables.rs:115:14:115:15 | 50 | variables.rs:116:9:116:16 | TupleStructPat | no-match | | variables.rs:115:21:115:29 | print_str | variables.rs:115:31:115:38 | "Got 50" | | -| variables.rs:115:21:115:39 | CallExpr | variables.rs:114:5:122:5 | MatchExpr | | -| variables.rs:115:31:115:38 | "Got 50" | variables.rs:115:21:115:39 | CallExpr | | +| variables.rs:115:21:115:39 | print_str(...) | variables.rs:114:5:122:5 | match x6 { ... } | | +| variables.rs:115:31:115:38 | "Got 50" | variables.rs:115:21:115:39 | print_str(...) | | | variables.rs:116:9:116:16 | TupleStructPat | variables.rs:116:14:116:15 | y1 | match | | variables.rs:116:9:116:16 | TupleStructPat | variables.rs:121:9:121:12 | None | no-match | | variables.rs:116:14:116:15 | y1 | variables.rs:119:13:119:21 | print_i64 | match | -| variables.rs:118:9:120:9 | BlockExpr | variables.rs:114:5:122:5 | MatchExpr | | +| variables.rs:118:9:120:9 | { ... } | variables.rs:114:5:122:5 | match x6 { ... } | | | variables.rs:119:13:119:21 | print_i64 | variables.rs:119:23:119:24 | y1 | | -| variables.rs:119:13:119:25 | CallExpr | variables.rs:118:9:120:9 | BlockExpr | | -| variables.rs:119:23:119:24 | y1 | variables.rs:119:13:119:25 | CallExpr | | +| variables.rs:119:13:119:25 | print_i64(...) | variables.rs:118:9:120:9 | { ... } | | +| variables.rs:119:23:119:24 | y1 | variables.rs:119:13:119:25 | print_i64(...) | | | variables.rs:121:9:121:12 | None | variables.rs:121:17:121:25 | print_str | match | | variables.rs:121:17:121:25 | print_str | variables.rs:121:27:121:32 | "NONE" | | -| variables.rs:121:17:121:33 | CallExpr | variables.rs:114:5:122:5 | MatchExpr | | -| variables.rs:121:27:121:32 | "NONE" | variables.rs:121:17:121:33 | CallExpr | | +| variables.rs:121:17:121:33 | print_str(...) | variables.rs:114:5:122:5 | match x6 { ... } | | +| variables.rs:121:27:121:32 | "NONE" | variables.rs:121:17:121:33 | print_str(...) | | | variables.rs:124:5:124:13 | print_i64 | variables.rs:124:15:124:16 | y1 | | -| variables.rs:124:5:124:17 | CallExpr | variables.rs:110:21:125:1 | BlockExpr | | +| variables.rs:124:5:124:17 | print_i64(...) | variables.rs:110:21:125:1 | { ... } | | | variables.rs:124:5:124:18 | ExprStmt | variables.rs:124:5:124:13 | print_i64 | | -| variables.rs:124:15:124:16 | y1 | variables.rs:124:5:124:17 | CallExpr | | -| variables.rs:127:1:152:1 | enter match_pattern2 | variables.rs:128:5:128:36 | LetStmt | | -| variables.rs:127:1:152:1 | exit match_pattern2 (normal) | variables.rs:127:1:152:1 | exit match_pattern2 | | -| variables.rs:127:21:152:1 | BlockExpr | variables.rs:127:1:152:1 | exit match_pattern2 (normal) | | -| variables.rs:128:5:128:36 | LetStmt | variables.rs:128:20:128:20 | 2 | | +| variables.rs:124:15:124:16 | y1 | variables.rs:124:5:124:17 | print_i64(...) | | +| variables.rs:127:1:152:1 | enter fn match_pattern2 | variables.rs:128:5:128:36 | let ... = ... | | +| variables.rs:127:1:152:1 | exit fn match_pattern2 (normal) | variables.rs:127:1:152:1 | exit fn match_pattern2 | | +| variables.rs:127:21:152:1 | { ... } | variables.rs:127:1:152:1 | exit fn match_pattern2 (normal) | | +| variables.rs:128:5:128:36 | let ... = ... | variables.rs:128:20:128:20 | 2 | | | variables.rs:128:9:128:15 | numbers | variables.rs:130:5:140:5 | ExprStmt | match | | variables.rs:128:19:128:35 | TupleExpr | variables.rs:128:9:128:15 | numbers | | | variables.rs:128:20:128:20 | 2 | variables.rs:128:23:128:23 | 4 | | @@ -295,311 +295,311 @@ edges | variables.rs:128:29:128:30 | 16 | variables.rs:128:33:128:34 | 32 | | | variables.rs:128:33:128:34 | 32 | variables.rs:128:19:128:35 | TupleExpr | | | variables.rs:130:5:140:5 | ExprStmt | variables.rs:130:11:130:17 | numbers | | -| variables.rs:130:5:140:5 | MatchExpr | variables.rs:142:11:142:17 | numbers | | +| variables.rs:130:5:140:5 | match numbers { ... } | variables.rs:142:11:142:17 | numbers | | | variables.rs:130:11:130:17 | numbers | variables.rs:131:9:135:9 | TuplePat | | | variables.rs:131:9:135:9 | TuplePat | variables.rs:132:13:132:17 | first | match | -| variables.rs:132:13:132:17 | first | variables.rs:132:20:132:20 | WildcardPat | match | -| variables.rs:132:20:132:20 | WildcardPat | variables.rs:133:13:133:17 | third | match | -| variables.rs:133:13:133:17 | third | variables.rs:133:20:133:20 | WildcardPat | match | -| variables.rs:133:20:133:20 | WildcardPat | variables.rs:134:13:134:17 | fifth | match | +| variables.rs:132:13:132:17 | first | variables.rs:132:20:132:20 | _ | match | +| variables.rs:132:20:132:20 | _ | variables.rs:133:13:133:17 | third | match | +| variables.rs:133:13:133:17 | third | variables.rs:133:20:133:20 | _ | match | +| variables.rs:133:20:133:20 | _ | variables.rs:134:13:134:17 | fifth | match | | variables.rs:134:13:134:17 | fifth | variables.rs:136:13:136:29 | ExprStmt | match | -| variables.rs:135:14:139:9 | BlockExpr | variables.rs:130:5:140:5 | MatchExpr | | +| variables.rs:135:14:139:9 | { ... } | variables.rs:130:5:140:5 | match numbers { ... } | | | variables.rs:136:13:136:21 | print_i64 | variables.rs:136:23:136:27 | first | | -| variables.rs:136:13:136:28 | CallExpr | variables.rs:137:13:137:29 | ExprStmt | | +| variables.rs:136:13:136:28 | print_i64(...) | variables.rs:137:13:137:29 | ExprStmt | | | variables.rs:136:13:136:29 | ExprStmt | variables.rs:136:13:136:21 | print_i64 | | -| variables.rs:136:23:136:27 | first | variables.rs:136:13:136:28 | CallExpr | | +| variables.rs:136:23:136:27 | first | variables.rs:136:13:136:28 | print_i64(...) | | | variables.rs:137:13:137:21 | print_i64 | variables.rs:137:23:137:27 | third | | -| variables.rs:137:13:137:28 | CallExpr | variables.rs:138:13:138:29 | ExprStmt | | +| variables.rs:137:13:137:28 | print_i64(...) | variables.rs:138:13:138:29 | ExprStmt | | | variables.rs:137:13:137:29 | ExprStmt | variables.rs:137:13:137:21 | print_i64 | | -| variables.rs:137:23:137:27 | third | variables.rs:137:13:137:28 | CallExpr | | +| variables.rs:137:23:137:27 | third | variables.rs:137:13:137:28 | print_i64(...) | | | variables.rs:138:13:138:21 | print_i64 | variables.rs:138:23:138:27 | fifth | | -| variables.rs:138:13:138:28 | CallExpr | variables.rs:135:14:139:9 | BlockExpr | | +| variables.rs:138:13:138:28 | print_i64(...) | variables.rs:135:14:139:9 | { ... } | | | variables.rs:138:13:138:29 | ExprStmt | variables.rs:138:13:138:21 | print_i64 | | -| variables.rs:138:23:138:27 | fifth | variables.rs:138:13:138:28 | CallExpr | | -| variables.rs:142:5:151:5 | MatchExpr | variables.rs:127:21:152:1 | BlockExpr | | +| variables.rs:138:23:138:27 | fifth | variables.rs:138:13:138:28 | print_i64(...) | | +| variables.rs:142:5:151:5 | match numbers { ... } | variables.rs:127:21:152:1 | { ... } | | | variables.rs:142:11:142:17 | numbers | variables.rs:143:9:147:9 | TuplePat | | | variables.rs:143:9:147:9 | TuplePat | variables.rs:144:13:144:17 | first | match | -| variables.rs:144:13:144:17 | first | variables.rs:145:13:145:14 | RestPat | match | -| variables.rs:145:13:145:14 | RestPat | variables.rs:146:13:146:16 | last | match | +| variables.rs:144:13:144:17 | first | variables.rs:145:13:145:14 | .. | match | +| variables.rs:145:13:145:14 | .. | variables.rs:146:13:146:16 | last | match | | variables.rs:146:13:146:16 | last | variables.rs:148:13:148:29 | ExprStmt | match | -| variables.rs:147:14:150:9 | BlockExpr | variables.rs:142:5:151:5 | MatchExpr | | +| variables.rs:147:14:150:9 | { ... } | variables.rs:142:5:151:5 | match numbers { ... } | | | variables.rs:148:13:148:21 | print_i64 | variables.rs:148:23:148:27 | first | | -| variables.rs:148:13:148:28 | CallExpr | variables.rs:149:13:149:28 | ExprStmt | | +| variables.rs:148:13:148:28 | print_i64(...) | variables.rs:149:13:149:28 | ExprStmt | | | variables.rs:148:13:148:29 | ExprStmt | variables.rs:148:13:148:21 | print_i64 | | -| variables.rs:148:23:148:27 | first | variables.rs:148:13:148:28 | CallExpr | | +| variables.rs:148:23:148:27 | first | variables.rs:148:13:148:28 | print_i64(...) | | | variables.rs:149:13:149:21 | print_i64 | variables.rs:149:23:149:26 | last | | -| variables.rs:149:13:149:27 | CallExpr | variables.rs:147:14:150:9 | BlockExpr | | +| variables.rs:149:13:149:27 | print_i64(...) | variables.rs:147:14:150:9 | { ... } | | | variables.rs:149:13:149:28 | ExprStmt | variables.rs:149:13:149:21 | print_i64 | | -| variables.rs:149:23:149:26 | last | variables.rs:149:13:149:27 | CallExpr | | -| variables.rs:154:1:162:1 | enter match_pattern3 | variables.rs:155:5:155:38 | LetStmt | | -| variables.rs:154:1:162:1 | exit match_pattern3 (normal) | variables.rs:154:1:162:1 | exit match_pattern3 | | -| variables.rs:154:21:162:1 | BlockExpr | variables.rs:154:1:162:1 | exit match_pattern3 (normal) | | -| variables.rs:155:5:155:38 | LetStmt | variables.rs:155:25:155:27 | "x" | | +| variables.rs:149:23:149:26 | last | variables.rs:149:13:149:27 | print_i64(...) | | +| variables.rs:154:1:162:1 | enter fn match_pattern3 | variables.rs:155:5:155:38 | let ... = ... | | +| variables.rs:154:1:162:1 | exit fn match_pattern3 (normal) | variables.rs:154:1:162:1 | exit fn match_pattern3 | | +| variables.rs:154:21:162:1 | { ... } | variables.rs:154:1:162:1 | exit fn match_pattern3 (normal) | | +| variables.rs:155:5:155:38 | let ... = ... | variables.rs:155:25:155:27 | "x" | | | variables.rs:155:9:155:10 | p2 | variables.rs:157:11:157:12 | p2 | match | -| variables.rs:155:14:155:37 | RecordExpr | variables.rs:155:9:155:10 | p2 | | +| variables.rs:155:14:155:37 | Point {...} | variables.rs:155:9:155:10 | p2 | | | variables.rs:155:25:155:27 | "x" | variables.rs:155:33:155:35 | "y" | | -| variables.rs:155:33:155:35 | "y" | variables.rs:155:14:155:37 | RecordExpr | | -| variables.rs:157:5:161:5 | MatchExpr | variables.rs:154:21:162:1 | BlockExpr | | -| variables.rs:157:11:157:12 | p2 | variables.rs:158:9:160:9 | RecordPat | | -| variables.rs:158:9:160:9 | RecordPat | variables.rs:159:16:159:17 | x7 | match | -| variables.rs:159:16:159:17 | x7 | variables.rs:159:20:159:21 | RestPat | match | -| variables.rs:159:20:159:21 | RestPat | variables.rs:160:14:160:22 | print_str | match | +| variables.rs:155:33:155:35 | "y" | variables.rs:155:14:155:37 | Point {...} | | +| variables.rs:157:5:161:5 | match p2 { ... } | variables.rs:154:21:162:1 | { ... } | | +| variables.rs:157:11:157:12 | p2 | variables.rs:158:9:160:9 | Point {...} | | +| variables.rs:158:9:160:9 | Point {...} | variables.rs:159:16:159:17 | x7 | match | +| variables.rs:159:16:159:17 | x7 | variables.rs:159:20:159:21 | .. | match | +| variables.rs:159:20:159:21 | .. | variables.rs:160:14:160:22 | print_str | match | | variables.rs:160:14:160:22 | print_str | variables.rs:160:24:160:25 | x7 | | -| variables.rs:160:14:160:26 | CallExpr | variables.rs:157:5:161:5 | MatchExpr | | -| variables.rs:160:24:160:25 | x7 | variables.rs:160:14:160:26 | CallExpr | | -| variables.rs:168:1:181:1 | enter match_pattern4 | variables.rs:169:5:169:39 | LetStmt | | -| variables.rs:168:1:181:1 | exit match_pattern4 (normal) | variables.rs:168:1:181:1 | exit match_pattern4 | | -| variables.rs:168:21:181:1 | BlockExpr | variables.rs:168:1:181:1 | exit match_pattern4 (normal) | | -| variables.rs:169:5:169:39 | LetStmt | variables.rs:169:36:169:36 | 0 | | +| variables.rs:160:14:160:26 | print_str(...) | variables.rs:157:5:161:5 | match p2 { ... } | | +| variables.rs:160:24:160:25 | x7 | variables.rs:160:14:160:26 | print_str(...) | | +| variables.rs:168:1:181:1 | enter fn match_pattern4 | variables.rs:169:5:169:39 | let ... = ... | | +| variables.rs:168:1:181:1 | exit fn match_pattern4 (normal) | variables.rs:168:1:181:1 | exit fn match_pattern4 | | +| variables.rs:168:21:181:1 | { ... } | variables.rs:168:1:181:1 | exit fn match_pattern4 (normal) | | +| variables.rs:169:5:169:39 | let ... = ... | variables.rs:169:36:169:36 | 0 | | | variables.rs:169:9:169:11 | msg | variables.rs:171:11:171:13 | msg | match | -| variables.rs:169:15:169:38 | RecordExpr | variables.rs:169:9:169:11 | msg | | -| variables.rs:169:36:169:36 | 0 | variables.rs:169:15:169:38 | RecordExpr | | -| variables.rs:171:5:180:5 | MatchExpr | variables.rs:168:21:181:1 | BlockExpr | | -| variables.rs:171:11:171:13 | msg | variables.rs:172:9:174:9 | RecordPat | | -| variables.rs:172:9:174:9 | RecordPat | variables.rs:173:31:173:35 | RangePat | match | -| variables.rs:172:9:174:9 | RecordPat | variables.rs:175:9:175:38 | RecordPat | no-match | +| variables.rs:169:15:169:38 | ...::Hello {...} | variables.rs:169:9:169:11 | msg | | +| variables.rs:169:36:169:36 | 0 | variables.rs:169:15:169:38 | ...::Hello {...} | | +| variables.rs:171:5:180:5 | match msg { ... } | variables.rs:168:21:181:1 | { ... } | | +| variables.rs:171:11:171:13 | msg | variables.rs:172:9:174:9 | ...::Hello {...} | | +| variables.rs:172:9:174:9 | ...::Hello {...} | variables.rs:173:31:173:35 | RangePat | match | +| variables.rs:172:9:174:9 | ...::Hello {...} | variables.rs:175:9:175:38 | ...::Hello {...} | no-match | | variables.rs:173:17:173:35 | [match(true)] id_variable | variables.rs:174:14:174:22 | print_i64 | match | -| variables.rs:173:31:173:31 | 3 | variables.rs:173:31:173:31 | LiteralPat | | -| variables.rs:173:31:173:31 | LiteralPat | variables.rs:173:35:173:35 | 7 | match | -| variables.rs:173:31:173:31 | LiteralPat | variables.rs:175:9:175:38 | RecordPat | no-match | +| variables.rs:173:31:173:31 | 3 | variables.rs:173:31:173:31 | 3 | | +| variables.rs:173:31:173:31 | 3 | variables.rs:173:35:173:35 | 7 | match | +| variables.rs:173:31:173:31 | 3 | variables.rs:175:9:175:38 | ...::Hello {...} | no-match | | variables.rs:173:31:173:35 | RangePat | variables.rs:173:31:173:31 | 3 | match | -| variables.rs:173:31:173:35 | RangePat | variables.rs:175:9:175:38 | RecordPat | no-match | -| variables.rs:173:35:173:35 | 7 | variables.rs:173:35:173:35 | LiteralPat | | -| variables.rs:173:35:173:35 | LiteralPat | variables.rs:173:17:173:35 | [match(true)] id_variable | match | -| variables.rs:173:35:173:35 | LiteralPat | variables.rs:175:9:175:38 | RecordPat | no-match | +| variables.rs:173:31:173:35 | RangePat | variables.rs:175:9:175:38 | ...::Hello {...} | no-match | +| variables.rs:173:35:173:35 | 7 | variables.rs:173:17:173:35 | [match(true)] id_variable | match | +| variables.rs:173:35:173:35 | 7 | variables.rs:173:35:173:35 | 7 | | +| variables.rs:173:35:173:35 | 7 | variables.rs:175:9:175:38 | ...::Hello {...} | no-match | | variables.rs:174:14:174:22 | print_i64 | variables.rs:174:24:174:34 | id_variable | | -| variables.rs:174:14:174:35 | CallExpr | variables.rs:171:5:180:5 | MatchExpr | | -| variables.rs:174:24:174:34 | id_variable | variables.rs:174:14:174:35 | CallExpr | | -| variables.rs:175:9:175:38 | RecordPat | variables.rs:175:30:175:36 | RangePat | match | -| variables.rs:175:9:175:38 | RecordPat | variables.rs:178:9:178:29 | RecordPat | no-match | -| variables.rs:175:30:175:31 | 10 | variables.rs:175:30:175:31 | LiteralPat | | -| variables.rs:175:30:175:31 | LiteralPat | variables.rs:175:35:175:36 | 12 | match | -| variables.rs:175:30:175:31 | LiteralPat | variables.rs:178:9:178:29 | RecordPat | no-match | +| variables.rs:174:14:174:35 | print_i64(...) | variables.rs:171:5:180:5 | match msg { ... } | | +| variables.rs:174:24:174:34 | id_variable | variables.rs:174:14:174:35 | print_i64(...) | | +| variables.rs:175:9:175:38 | ...::Hello {...} | variables.rs:175:30:175:36 | RangePat | match | +| variables.rs:175:9:175:38 | ...::Hello {...} | variables.rs:178:9:178:29 | ...::Hello {...} | no-match | +| variables.rs:175:30:175:31 | 10 | variables.rs:175:30:175:31 | 10 | | +| variables.rs:175:30:175:31 | 10 | variables.rs:175:35:175:36 | 12 | match | +| variables.rs:175:30:175:31 | 10 | variables.rs:178:9:178:29 | ...::Hello {...} | no-match | | variables.rs:175:30:175:36 | RangePat | variables.rs:175:30:175:31 | 10 | match | -| variables.rs:175:30:175:36 | RangePat | variables.rs:178:9:178:29 | RecordPat | no-match | -| variables.rs:175:35:175:36 | 12 | variables.rs:175:35:175:36 | LiteralPat | | -| variables.rs:175:35:175:36 | LiteralPat | variables.rs:176:22:176:51 | MacroStmts | match | -| variables.rs:175:35:175:36 | LiteralPat | variables.rs:178:9:178:29 | RecordPat | no-match | -| variables.rs:175:43:177:9 | BlockExpr | variables.rs:171:5:180:5 | MatchExpr | | -| variables.rs:176:13:176:52 | $crate::io::_print | variables.rs:176:22:176:51 | "Found an id in another range\\n" | | -| variables.rs:176:13:176:52 | MacroExpr | variables.rs:175:43:177:9 | BlockExpr | | -| variables.rs:176:22:176:51 | "Found an id in another range\\n" | variables.rs:176:22:176:51 | FormatArgsExpr | | -| variables.rs:176:22:176:51 | BlockExpr | variables.rs:176:13:176:52 | MacroExpr | | -| variables.rs:176:22:176:51 | CallExpr | variables.rs:176:22:176:51 | BlockExpr | | -| variables.rs:176:22:176:51 | ExprStmt | variables.rs:176:13:176:52 | $crate::io::_print | | +| variables.rs:175:30:175:36 | RangePat | variables.rs:178:9:178:29 | ...::Hello {...} | no-match | +| variables.rs:175:35:175:36 | 12 | variables.rs:175:35:175:36 | 12 | | +| variables.rs:175:35:175:36 | 12 | variables.rs:176:22:176:51 | MacroStmts | match | +| variables.rs:175:35:175:36 | 12 | variables.rs:178:9:178:29 | ...::Hello {...} | no-match | +| variables.rs:175:43:177:9 | { ... } | variables.rs:171:5:180:5 | match msg { ... } | | +| variables.rs:176:13:176:52 | ...::_print | variables.rs:176:22:176:51 | "Found an id in another range\\... | | +| variables.rs:176:13:176:52 | MacroExpr | variables.rs:175:43:177:9 | { ... } | | +| variables.rs:176:22:176:51 | "Found an id in another range\\... | variables.rs:176:22:176:51 | FormatArgsExpr | | +| variables.rs:176:22:176:51 | ...::_print(...) | variables.rs:176:22:176:51 | { ... } | | +| variables.rs:176:22:176:51 | ExprStmt | variables.rs:176:13:176:52 | ...::_print | | | variables.rs:176:22:176:51 | FormatArgsExpr | variables.rs:176:22:176:51 | MacroExpr | | -| variables.rs:176:22:176:51 | MacroExpr | variables.rs:176:22:176:51 | CallExpr | | +| variables.rs:176:22:176:51 | MacroExpr | variables.rs:176:22:176:51 | ...::_print(...) | | | variables.rs:176:22:176:51 | MacroStmts | variables.rs:176:22:176:51 | ExprStmt | | -| variables.rs:178:9:178:29 | RecordPat | variables.rs:178:26:178:27 | id | match | +| variables.rs:176:22:176:51 | { ... } | variables.rs:176:13:176:52 | MacroExpr | | +| variables.rs:178:9:178:29 | ...::Hello {...} | variables.rs:178:26:178:27 | id | match | | variables.rs:178:26:178:27 | id | variables.rs:179:13:179:21 | print_i64 | match | | variables.rs:179:13:179:21 | print_i64 | variables.rs:179:23:179:24 | id | | -| variables.rs:179:13:179:25 | CallExpr | variables.rs:171:5:180:5 | MatchExpr | | -| variables.rs:179:23:179:24 | id | variables.rs:179:13:179:25 | CallExpr | | -| variables.rs:188:1:194:1 | enter match_pattern5 | variables.rs:189:5:189:34 | LetStmt | | -| variables.rs:188:1:194:1 | exit match_pattern5 (normal) | variables.rs:188:1:194:1 | exit match_pattern5 | | -| variables.rs:188:21:194:1 | BlockExpr | variables.rs:188:1:194:1 | exit match_pattern5 (normal) | | -| variables.rs:189:5:189:34 | LetStmt | variables.rs:189:18:189:29 | Either::Left | | +| variables.rs:179:13:179:25 | print_i64(...) | variables.rs:171:5:180:5 | match msg { ... } | | +| variables.rs:179:23:179:24 | id | variables.rs:179:13:179:25 | print_i64(...) | | +| variables.rs:188:1:194:1 | enter fn match_pattern5 | variables.rs:189:5:189:34 | let ... = ... | | +| variables.rs:188:1:194:1 | exit fn match_pattern5 (normal) | variables.rs:188:1:194:1 | exit fn match_pattern5 | | +| variables.rs:188:21:194:1 | { ... } | variables.rs:188:1:194:1 | exit fn match_pattern5 (normal) | | +| variables.rs:189:5:189:34 | let ... = ... | variables.rs:189:18:189:29 | ...::Left | | | variables.rs:189:9:189:14 | either | variables.rs:190:11:190:16 | either | match | -| variables.rs:189:18:189:29 | Either::Left | variables.rs:189:31:189:32 | 32 | | -| variables.rs:189:18:189:33 | CallExpr | variables.rs:189:9:189:14 | either | | -| variables.rs:189:31:189:32 | 32 | variables.rs:189:18:189:33 | CallExpr | | -| variables.rs:190:5:193:5 | MatchExpr | variables.rs:188:21:194:1 | BlockExpr | | +| variables.rs:189:18:189:29 | ...::Left | variables.rs:189:31:189:32 | 32 | | +| variables.rs:189:18:189:33 | ...::Left(...) | variables.rs:189:9:189:14 | either | | +| variables.rs:189:31:189:32 | 32 | variables.rs:189:18:189:33 | ...::Left(...) | | +| variables.rs:190:5:193:5 | match either { ... } | variables.rs:188:21:194:1 | { ... } | | | variables.rs:190:11:190:16 | either | variables.rs:191:9:191:24 | TupleStructPat | | | variables.rs:191:9:191:24 | TupleStructPat | variables.rs:191:22:191:23 | a3 | match | | variables.rs:191:9:191:24 | TupleStructPat | variables.rs:191:28:191:44 | TupleStructPat | no-match | -| variables.rs:191:9:191:44 | [match(true)] OrPat | variables.rs:192:16:192:24 | print_i64 | match | -| variables.rs:191:22:191:23 | a3 | variables.rs:191:9:191:44 | [match(true)] OrPat | match | +| variables.rs:191:9:191:44 | [match(true)] ... \| ... | variables.rs:192:16:192:24 | print_i64 | match | +| variables.rs:191:22:191:23 | a3 | variables.rs:191:9:191:44 | [match(true)] ... \| ... | match | | variables.rs:191:28:191:44 | TupleStructPat | variables.rs:191:42:191:43 | a3 | match | -| variables.rs:191:42:191:43 | a3 | variables.rs:191:9:191:44 | [match(true)] OrPat | match | +| variables.rs:191:42:191:43 | a3 | variables.rs:191:9:191:44 | [match(true)] ... \| ... | match | | variables.rs:192:16:192:24 | print_i64 | variables.rs:192:26:192:27 | a3 | | -| variables.rs:192:16:192:28 | CallExpr | variables.rs:190:5:193:5 | MatchExpr | | -| variables.rs:192:26:192:27 | a3 | variables.rs:192:16:192:28 | CallExpr | | -| variables.rs:202:1:216:1 | enter match_pattern6 | variables.rs:203:5:203:37 | LetStmt | | -| variables.rs:202:1:216:1 | exit match_pattern6 (normal) | variables.rs:202:1:216:1 | exit match_pattern6 | | -| variables.rs:202:21:216:1 | BlockExpr | variables.rs:202:1:216:1 | exit match_pattern6 (normal) | | -| variables.rs:203:5:203:37 | LetStmt | variables.rs:203:14:203:32 | ThreeValued::Second | | +| variables.rs:192:16:192:28 | print_i64(...) | variables.rs:190:5:193:5 | match either { ... } | | +| variables.rs:192:26:192:27 | a3 | variables.rs:192:16:192:28 | print_i64(...) | | +| variables.rs:202:1:216:1 | enter fn match_pattern6 | variables.rs:203:5:203:37 | let ... = ... | | +| variables.rs:202:1:216:1 | exit fn match_pattern6 (normal) | variables.rs:202:1:216:1 | exit fn match_pattern6 | | +| variables.rs:202:21:216:1 | { ... } | variables.rs:202:1:216:1 | exit fn match_pattern6 (normal) | | +| variables.rs:203:5:203:37 | let ... = ... | variables.rs:203:14:203:32 | ...::Second | | | variables.rs:203:9:203:10 | tv | variables.rs:204:5:207:5 | ExprStmt | match | -| variables.rs:203:14:203:32 | ThreeValued::Second | variables.rs:203:34:203:35 | 62 | | -| variables.rs:203:14:203:36 | CallExpr | variables.rs:203:9:203:10 | tv | | -| variables.rs:203:34:203:35 | 62 | variables.rs:203:14:203:36 | CallExpr | | +| variables.rs:203:14:203:32 | ...::Second | variables.rs:203:34:203:35 | 62 | | +| variables.rs:203:14:203:36 | ...::Second(...) | variables.rs:203:9:203:10 | tv | | +| variables.rs:203:34:203:35 | 62 | variables.rs:203:14:203:36 | ...::Second(...) | | | variables.rs:204:5:207:5 | ExprStmt | variables.rs:204:11:204:12 | tv | | -| variables.rs:204:5:207:5 | MatchExpr | variables.rs:208:5:211:5 | ExprStmt | | +| variables.rs:204:5:207:5 | match tv { ... } | variables.rs:208:5:211:5 | ExprStmt | | | variables.rs:204:11:204:12 | tv | variables.rs:205:9:205:30 | TupleStructPat | | | variables.rs:205:9:205:30 | TupleStructPat | variables.rs:205:28:205:29 | a4 | match | | variables.rs:205:9:205:30 | TupleStructPat | variables.rs:205:34:205:56 | TupleStructPat | no-match | -| variables.rs:205:9:205:81 | [match(true)] OrPat | variables.rs:206:16:206:24 | print_i64 | match | -| variables.rs:205:28:205:29 | a4 | variables.rs:205:9:205:81 | [match(true)] OrPat | match | +| variables.rs:205:9:205:81 | [match(true)] ... \| ... \| ... | variables.rs:206:16:206:24 | print_i64 | match | +| variables.rs:205:28:205:29 | a4 | variables.rs:205:9:205:81 | [match(true)] ... \| ... \| ... | match | | variables.rs:205:34:205:56 | TupleStructPat | variables.rs:205:54:205:55 | a4 | match | | variables.rs:205:34:205:56 | TupleStructPat | variables.rs:205:60:205:81 | TupleStructPat | no-match | -| variables.rs:205:54:205:55 | a4 | variables.rs:205:9:205:81 | [match(true)] OrPat | match | +| variables.rs:205:54:205:55 | a4 | variables.rs:205:9:205:81 | [match(true)] ... \| ... \| ... | match | | variables.rs:205:60:205:81 | TupleStructPat | variables.rs:205:79:205:80 | a4 | match | -| variables.rs:205:79:205:80 | a4 | variables.rs:205:9:205:81 | [match(true)] OrPat | match | +| variables.rs:205:79:205:80 | a4 | variables.rs:205:9:205:81 | [match(true)] ... \| ... \| ... | match | | variables.rs:206:16:206:24 | print_i64 | variables.rs:206:26:206:27 | a4 | | -| variables.rs:206:16:206:28 | CallExpr | variables.rs:204:5:207:5 | MatchExpr | | -| variables.rs:206:26:206:27 | a4 | variables.rs:206:16:206:28 | CallExpr | | +| variables.rs:206:16:206:28 | print_i64(...) | variables.rs:204:5:207:5 | match tv { ... } | | +| variables.rs:206:26:206:27 | a4 | variables.rs:206:16:206:28 | print_i64(...) | | | variables.rs:208:5:211:5 | ExprStmt | variables.rs:208:11:208:12 | tv | | -| variables.rs:208:5:211:5 | MatchExpr | variables.rs:212:11:212:12 | tv | | +| variables.rs:208:5:211:5 | match tv { ... } | variables.rs:212:11:212:12 | tv | | | variables.rs:208:11:208:12 | tv | variables.rs:209:10:209:31 | TupleStructPat | | -| variables.rs:209:9:209:83 | [match(true)] OrPat | variables.rs:210:16:210:24 | print_i64 | match | +| variables.rs:209:9:209:83 | [match(true)] ... \| ... | variables.rs:210:16:210:24 | print_i64 | match | | variables.rs:209:10:209:31 | TupleStructPat | variables.rs:209:29:209:30 | a5 | match | | variables.rs:209:10:209:31 | TupleStructPat | variables.rs:209:35:209:57 | TupleStructPat | no-match | -| variables.rs:209:10:209:57 | [match(false)] OrPat | variables.rs:209:62:209:83 | TupleStructPat | no-match | -| variables.rs:209:10:209:57 | [match(true)] OrPat | variables.rs:209:9:209:83 | [match(true)] OrPat | match | -| variables.rs:209:29:209:30 | a5 | variables.rs:209:10:209:57 | [match(true)] OrPat | match | -| variables.rs:209:35:209:57 | TupleStructPat | variables.rs:209:10:209:57 | [match(false)] OrPat | no-match | +| variables.rs:209:10:209:57 | [match(false)] ... \| ... | variables.rs:209:62:209:83 | TupleStructPat | no-match | +| variables.rs:209:10:209:57 | [match(true)] ... \| ... | variables.rs:209:9:209:83 | [match(true)] ... \| ... | match | +| variables.rs:209:29:209:30 | a5 | variables.rs:209:10:209:57 | [match(true)] ... \| ... | match | +| variables.rs:209:35:209:57 | TupleStructPat | variables.rs:209:10:209:57 | [match(false)] ... \| ... | no-match | | variables.rs:209:35:209:57 | TupleStructPat | variables.rs:209:55:209:56 | a5 | match | -| variables.rs:209:55:209:56 | a5 | variables.rs:209:10:209:57 | [match(true)] OrPat | match | +| variables.rs:209:55:209:56 | a5 | variables.rs:209:10:209:57 | [match(true)] ... \| ... | match | | variables.rs:209:62:209:83 | TupleStructPat | variables.rs:209:81:209:82 | a5 | match | -| variables.rs:209:81:209:82 | a5 | variables.rs:209:9:209:83 | [match(true)] OrPat | match | +| variables.rs:209:81:209:82 | a5 | variables.rs:209:9:209:83 | [match(true)] ... \| ... | match | | variables.rs:210:16:210:24 | print_i64 | variables.rs:210:26:210:27 | a5 | | -| variables.rs:210:16:210:28 | CallExpr | variables.rs:208:5:211:5 | MatchExpr | | -| variables.rs:210:26:210:27 | a5 | variables.rs:210:16:210:28 | CallExpr | | -| variables.rs:212:5:215:5 | MatchExpr | variables.rs:202:21:216:1 | BlockExpr | | +| variables.rs:210:16:210:28 | print_i64(...) | variables.rs:208:5:211:5 | match tv { ... } | | +| variables.rs:210:26:210:27 | a5 | variables.rs:210:16:210:28 | print_i64(...) | | +| variables.rs:212:5:215:5 | match tv { ... } | variables.rs:202:21:216:1 | { ... } | | | variables.rs:212:11:212:12 | tv | variables.rs:213:9:213:30 | TupleStructPat | | | variables.rs:213:9:213:30 | TupleStructPat | variables.rs:213:28:213:29 | a6 | match | | variables.rs:213:9:213:30 | TupleStructPat | variables.rs:213:35:213:57 | TupleStructPat | no-match | -| variables.rs:213:9:213:83 | [match(true)] OrPat | variables.rs:214:16:214:24 | print_i64 | match | -| variables.rs:213:28:213:29 | a6 | variables.rs:213:9:213:83 | [match(true)] OrPat | match | +| variables.rs:213:9:213:83 | [match(true)] ... \| ... | variables.rs:214:16:214:24 | print_i64 | match | +| variables.rs:213:28:213:29 | a6 | variables.rs:213:9:213:83 | [match(true)] ... \| ... | match | | variables.rs:213:35:213:57 | TupleStructPat | variables.rs:213:55:213:56 | a6 | match | | variables.rs:213:35:213:57 | TupleStructPat | variables.rs:213:61:213:82 | TupleStructPat | no-match | -| variables.rs:213:35:213:82 | [match(true)] OrPat | variables.rs:213:9:213:83 | [match(true)] OrPat | match | -| variables.rs:213:55:213:56 | a6 | variables.rs:213:35:213:82 | [match(true)] OrPat | match | +| variables.rs:213:35:213:82 | [match(true)] ... \| ... | variables.rs:213:9:213:83 | [match(true)] ... \| ... | match | +| variables.rs:213:55:213:56 | a6 | variables.rs:213:35:213:82 | [match(true)] ... \| ... | match | | variables.rs:213:61:213:82 | TupleStructPat | variables.rs:213:80:213:81 | a6 | match | -| variables.rs:213:80:213:81 | a6 | variables.rs:213:35:213:82 | [match(true)] OrPat | match | +| variables.rs:213:80:213:81 | a6 | variables.rs:213:35:213:82 | [match(true)] ... \| ... | match | | variables.rs:214:16:214:24 | print_i64 | variables.rs:214:26:214:27 | a6 | | -| variables.rs:214:16:214:28 | CallExpr | variables.rs:212:5:215:5 | MatchExpr | | -| variables.rs:214:26:214:27 | a6 | variables.rs:214:16:214:28 | CallExpr | | -| variables.rs:218:1:226:1 | enter match_pattern7 | variables.rs:219:5:219:34 | LetStmt | | -| variables.rs:218:1:226:1 | exit match_pattern7 (normal) | variables.rs:218:1:226:1 | exit match_pattern7 | | -| variables.rs:218:21:226:1 | BlockExpr | variables.rs:218:1:226:1 | exit match_pattern7 (normal) | | -| variables.rs:219:5:219:34 | LetStmt | variables.rs:219:18:219:29 | Either::Left | | +| variables.rs:214:16:214:28 | print_i64(...) | variables.rs:212:5:215:5 | match tv { ... } | | +| variables.rs:214:26:214:27 | a6 | variables.rs:214:16:214:28 | print_i64(...) | | +| variables.rs:218:1:226:1 | enter fn match_pattern7 | variables.rs:219:5:219:34 | let ... = ... | | +| variables.rs:218:1:226:1 | exit fn match_pattern7 (normal) | variables.rs:218:1:226:1 | exit fn match_pattern7 | | +| variables.rs:218:21:226:1 | { ... } | variables.rs:218:1:226:1 | exit fn match_pattern7 (normal) | | +| variables.rs:219:5:219:34 | let ... = ... | variables.rs:219:18:219:29 | ...::Left | | | variables.rs:219:9:219:14 | either | variables.rs:220:11:220:16 | either | match | -| variables.rs:219:18:219:29 | Either::Left | variables.rs:219:31:219:32 | 32 | | -| variables.rs:219:18:219:33 | CallExpr | variables.rs:219:9:219:14 | either | | -| variables.rs:219:31:219:32 | 32 | variables.rs:219:18:219:33 | CallExpr | | -| variables.rs:220:5:225:5 | MatchExpr | variables.rs:218:21:226:1 | BlockExpr | | +| variables.rs:219:18:219:29 | ...::Left | variables.rs:219:31:219:32 | 32 | | +| variables.rs:219:18:219:33 | ...::Left(...) | variables.rs:219:9:219:14 | either | | +| variables.rs:219:31:219:32 | 32 | variables.rs:219:18:219:33 | ...::Left(...) | | +| variables.rs:220:5:225:5 | match either { ... } | variables.rs:218:21:226:1 | { ... } | | | variables.rs:220:11:220:16 | either | variables.rs:221:9:221:24 | TupleStructPat | | | variables.rs:221:9:221:24 | TupleStructPat | variables.rs:221:22:221:23 | a7 | match | | variables.rs:221:9:221:24 | TupleStructPat | variables.rs:221:28:221:44 | TupleStructPat | no-match | -| variables.rs:221:9:221:44 | [match(false)] OrPat | variables.rs:224:9:224:9 | WildcardPat | no-match | -| variables.rs:221:9:221:44 | [match(true)] OrPat | variables.rs:222:16:222:17 | a7 | match | -| variables.rs:221:22:221:23 | a7 | variables.rs:221:9:221:44 | [match(true)] OrPat | match | -| variables.rs:221:28:221:44 | TupleStructPat | variables.rs:221:9:221:44 | [match(false)] OrPat | no-match | +| variables.rs:221:9:221:44 | [match(false)] ... \| ... | variables.rs:224:9:224:9 | _ | no-match | +| variables.rs:221:9:221:44 | [match(true)] ... \| ... | variables.rs:222:16:222:17 | a7 | match | +| variables.rs:221:22:221:23 | a7 | variables.rs:221:9:221:44 | [match(true)] ... \| ... | match | +| variables.rs:221:28:221:44 | TupleStructPat | variables.rs:221:9:221:44 | [match(false)] ... \| ... | no-match | | variables.rs:221:28:221:44 | TupleStructPat | variables.rs:221:42:221:43 | a7 | match | -| variables.rs:221:42:221:43 | a7 | variables.rs:221:9:221:44 | [match(true)] OrPat | match | +| variables.rs:221:42:221:43 | a7 | variables.rs:221:9:221:44 | [match(true)] ... \| ... | match | | variables.rs:222:16:222:17 | a7 | variables.rs:222:21:222:21 | 0 | | | variables.rs:222:16:222:21 | ... > ... | variables.rs:223:16:223:24 | print_i64 | true | -| variables.rs:222:16:222:21 | ... > ... | variables.rs:224:9:224:9 | WildcardPat | false | +| variables.rs:222:16:222:21 | ... > ... | variables.rs:224:9:224:9 | _ | false | | variables.rs:222:21:222:21 | 0 | variables.rs:222:16:222:21 | ... > ... | | | variables.rs:223:16:223:24 | print_i64 | variables.rs:223:26:223:27 | a7 | | -| variables.rs:223:16:223:28 | CallExpr | variables.rs:220:5:225:5 | MatchExpr | | -| variables.rs:223:26:223:27 | a7 | variables.rs:223:16:223:28 | CallExpr | | -| variables.rs:224:9:224:9 | WildcardPat | variables.rs:224:14:224:15 | TupleExpr | match | -| variables.rs:224:14:224:15 | TupleExpr | variables.rs:220:5:225:5 | MatchExpr | | -| variables.rs:228:1:243:1 | enter match_pattern8 | variables.rs:229:5:229:34 | LetStmt | | -| variables.rs:228:1:243:1 | exit match_pattern8 (normal) | variables.rs:228:1:243:1 | exit match_pattern8 | | -| variables.rs:228:21:243:1 | BlockExpr | variables.rs:228:1:243:1 | exit match_pattern8 (normal) | | -| variables.rs:229:5:229:34 | LetStmt | variables.rs:229:18:229:29 | Either::Left | | +| variables.rs:223:16:223:28 | print_i64(...) | variables.rs:220:5:225:5 | match either { ... } | | +| variables.rs:223:26:223:27 | a7 | variables.rs:223:16:223:28 | print_i64(...) | | +| variables.rs:224:9:224:9 | _ | variables.rs:224:14:224:15 | TupleExpr | match | +| variables.rs:224:14:224:15 | TupleExpr | variables.rs:220:5:225:5 | match either { ... } | | +| variables.rs:228:1:243:1 | enter fn match_pattern8 | variables.rs:229:5:229:34 | let ... = ... | | +| variables.rs:228:1:243:1 | exit fn match_pattern8 (normal) | variables.rs:228:1:243:1 | exit fn match_pattern8 | | +| variables.rs:228:21:243:1 | { ... } | variables.rs:228:1:243:1 | exit fn match_pattern8 (normal) | | +| variables.rs:229:5:229:34 | let ... = ... | variables.rs:229:18:229:29 | ...::Left | | | variables.rs:229:9:229:14 | either | variables.rs:231:11:231:16 | either | match | -| variables.rs:229:18:229:29 | Either::Left | variables.rs:229:31:229:32 | 32 | | -| variables.rs:229:18:229:33 | CallExpr | variables.rs:229:9:229:14 | either | | -| variables.rs:229:31:229:32 | 32 | variables.rs:229:18:229:33 | CallExpr | | -| variables.rs:231:5:242:5 | MatchExpr | variables.rs:228:21:243:1 | BlockExpr | | +| variables.rs:229:18:229:29 | ...::Left | variables.rs:229:31:229:32 | 32 | | +| variables.rs:229:18:229:33 | ...::Left(...) | variables.rs:229:9:229:14 | either | | +| variables.rs:229:31:229:32 | 32 | variables.rs:229:18:229:33 | ...::Left(...) | | +| variables.rs:231:5:242:5 | match either { ... } | variables.rs:228:21:243:1 | { ... } | | | variables.rs:231:11:231:16 | either | variables.rs:233:14:233:30 | TupleStructPat | | | variables.rs:232:9:233:52 | [match(true)] e | variables.rs:235:13:235:27 | ExprStmt | match | | variables.rs:233:14:233:30 | TupleStructPat | variables.rs:233:27:233:29 | a11 | match | | variables.rs:233:14:233:30 | TupleStructPat | variables.rs:233:34:233:51 | TupleStructPat | no-match | -| variables.rs:233:14:233:51 | [match(false)] OrPat | variables.rs:241:9:241:9 | WildcardPat | no-match | -| variables.rs:233:14:233:51 | [match(true)] OrPat | variables.rs:232:9:233:52 | [match(true)] e | match | -| variables.rs:233:27:233:29 | a11 | variables.rs:233:14:233:51 | [match(true)] OrPat | match | -| variables.rs:233:34:233:51 | TupleStructPat | variables.rs:233:14:233:51 | [match(false)] OrPat | no-match | +| variables.rs:233:14:233:51 | [match(false)] ... \| ... | variables.rs:241:9:241:9 | _ | no-match | +| variables.rs:233:14:233:51 | [match(true)] ... \| ... | variables.rs:232:9:233:52 | [match(true)] e | match | +| variables.rs:233:27:233:29 | a11 | variables.rs:233:14:233:51 | [match(true)] ... \| ... | match | +| variables.rs:233:34:233:51 | TupleStructPat | variables.rs:233:14:233:51 | [match(false)] ... \| ... | no-match | | variables.rs:233:34:233:51 | TupleStructPat | variables.rs:233:48:233:50 | a11 | match | -| variables.rs:233:48:233:50 | a11 | variables.rs:233:14:233:51 | [match(true)] OrPat | match | -| variables.rs:234:12:240:9 | BlockExpr | variables.rs:231:5:242:5 | MatchExpr | | +| variables.rs:233:48:233:50 | a11 | variables.rs:233:14:233:51 | [match(true)] ... \| ... | match | +| variables.rs:234:12:240:9 | { ... } | variables.rs:231:5:242:5 | match either { ... } | | | variables.rs:235:13:235:21 | print_i64 | variables.rs:235:23:235:25 | a11 | | -| variables.rs:235:13:235:26 | CallExpr | variables.rs:236:16:237:15 | LetExpr | | +| variables.rs:235:13:235:26 | print_i64(...) | variables.rs:236:16:237:15 | let ... = e | | | variables.rs:235:13:235:27 | ExprStmt | variables.rs:235:13:235:21 | print_i64 | | -| variables.rs:235:23:235:25 | a11 | variables.rs:235:13:235:26 | CallExpr | | -| variables.rs:236:13:239:13 | IfExpr | variables.rs:234:12:240:9 | BlockExpr | | -| variables.rs:236:16:237:15 | LetExpr | variables.rs:237:15:237:15 | e | | -| variables.rs:236:20:236:36 | TupleStructPat | variables.rs:236:13:239:13 | IfExpr | no-match | +| variables.rs:235:23:235:25 | a11 | variables.rs:235:13:235:26 | print_i64(...) | | +| variables.rs:236:13:239:13 | if ... {...} | variables.rs:234:12:240:9 | { ... } | | +| variables.rs:236:16:237:15 | let ... = e | variables.rs:237:15:237:15 | e | | +| variables.rs:236:20:236:36 | TupleStructPat | variables.rs:236:13:239:13 | if ... {...} | no-match | | variables.rs:236:20:236:36 | TupleStructPat | variables.rs:236:33:236:35 | a12 | match | | variables.rs:236:33:236:35 | a12 | variables.rs:238:17:238:32 | ExprStmt | match | | variables.rs:237:15:237:15 | e | variables.rs:236:20:236:36 | TupleStructPat | | -| variables.rs:237:17:239:13 | BlockExpr | variables.rs:236:13:239:13 | IfExpr | | +| variables.rs:237:17:239:13 | { ... } | variables.rs:236:13:239:13 | if ... {...} | | | variables.rs:238:17:238:25 | print_i64 | variables.rs:238:28:238:30 | a12 | | -| variables.rs:238:17:238:31 | CallExpr | variables.rs:237:17:239:13 | BlockExpr | | +| variables.rs:238:17:238:31 | print_i64(...) | variables.rs:237:17:239:13 | { ... } | | | variables.rs:238:17:238:32 | ExprStmt | variables.rs:238:17:238:25 | print_i64 | | -| variables.rs:238:27:238:30 | * ... | variables.rs:238:17:238:31 | CallExpr | | +| variables.rs:238:27:238:30 | * ... | variables.rs:238:17:238:31 | print_i64(...) | | | variables.rs:238:28:238:30 | a12 | variables.rs:238:27:238:30 | * ... | | -| variables.rs:241:9:241:9 | WildcardPat | variables.rs:241:14:241:15 | TupleExpr | match | -| variables.rs:241:14:241:15 | TupleExpr | variables.rs:231:5:242:5 | MatchExpr | | -| variables.rs:252:1:258:1 | enter match_pattern9 | variables.rs:253:5:253:36 | LetStmt | | -| variables.rs:252:1:258:1 | exit match_pattern9 (normal) | variables.rs:252:1:258:1 | exit match_pattern9 | | -| variables.rs:252:21:258:1 | BlockExpr | variables.rs:252:1:258:1 | exit match_pattern9 (normal) | | -| variables.rs:253:5:253:36 | LetStmt | variables.rs:253:14:253:31 | FourValued::Second | | +| variables.rs:241:9:241:9 | _ | variables.rs:241:14:241:15 | TupleExpr | match | +| variables.rs:241:14:241:15 | TupleExpr | variables.rs:231:5:242:5 | match either { ... } | | +| variables.rs:252:1:258:1 | enter fn match_pattern9 | variables.rs:253:5:253:36 | let ... = ... | | +| variables.rs:252:1:258:1 | exit fn match_pattern9 (normal) | variables.rs:252:1:258:1 | exit fn match_pattern9 | | +| variables.rs:252:21:258:1 | { ... } | variables.rs:252:1:258:1 | exit fn match_pattern9 (normal) | | +| variables.rs:253:5:253:36 | let ... = ... | variables.rs:253:14:253:31 | ...::Second | | | variables.rs:253:9:253:10 | fv | variables.rs:254:11:254:12 | fv | match | -| variables.rs:253:14:253:31 | FourValued::Second | variables.rs:253:33:253:34 | 62 | | -| variables.rs:253:14:253:35 | CallExpr | variables.rs:253:9:253:10 | fv | | -| variables.rs:253:33:253:34 | 62 | variables.rs:253:14:253:35 | CallExpr | | -| variables.rs:254:5:257:5 | MatchExpr | variables.rs:252:21:258:1 | BlockExpr | | +| variables.rs:253:14:253:31 | ...::Second | variables.rs:253:33:253:34 | 62 | | +| variables.rs:253:14:253:35 | ...::Second(...) | variables.rs:253:9:253:10 | fv | | +| variables.rs:253:33:253:34 | 62 | variables.rs:253:14:253:35 | ...::Second(...) | | +| variables.rs:254:5:257:5 | match fv { ... } | variables.rs:252:21:258:1 | { ... } | | | variables.rs:254:11:254:12 | fv | variables.rs:255:9:255:30 | TupleStructPat | | | variables.rs:255:9:255:30 | TupleStructPat | variables.rs:255:27:255:29 | a13 | match | | variables.rs:255:9:255:30 | TupleStructPat | variables.rs:255:35:255:57 | TupleStructPat | no-match | -| variables.rs:255:9:255:109 | [match(true)] OrPat | variables.rs:256:16:256:24 | print_i64 | match | -| variables.rs:255:27:255:29 | a13 | variables.rs:255:9:255:109 | [match(true)] OrPat | match | +| variables.rs:255:9:255:109 | [match(true)] ... \| ... \| ... | variables.rs:256:16:256:24 | print_i64 | match | +| variables.rs:255:27:255:29 | a13 | variables.rs:255:9:255:109 | [match(true)] ... \| ... \| ... | match | | variables.rs:255:35:255:57 | TupleStructPat | variables.rs:255:54:255:56 | a13 | match | | variables.rs:255:35:255:57 | TupleStructPat | variables.rs:255:61:255:82 | TupleStructPat | no-match | -| variables.rs:255:35:255:82 | [match(false)] OrPat | variables.rs:255:87:255:109 | TupleStructPat | no-match | -| variables.rs:255:35:255:82 | [match(true)] OrPat | variables.rs:255:9:255:109 | [match(true)] OrPat | match | -| variables.rs:255:54:255:56 | a13 | variables.rs:255:35:255:82 | [match(true)] OrPat | match | -| variables.rs:255:61:255:82 | TupleStructPat | variables.rs:255:35:255:82 | [match(false)] OrPat | no-match | +| variables.rs:255:35:255:82 | [match(false)] ... \| ... | variables.rs:255:87:255:109 | TupleStructPat | no-match | +| variables.rs:255:35:255:82 | [match(true)] ... \| ... | variables.rs:255:9:255:109 | [match(true)] ... \| ... \| ... | match | +| variables.rs:255:54:255:56 | a13 | variables.rs:255:35:255:82 | [match(true)] ... \| ... | match | +| variables.rs:255:61:255:82 | TupleStructPat | variables.rs:255:35:255:82 | [match(false)] ... \| ... | no-match | | variables.rs:255:61:255:82 | TupleStructPat | variables.rs:255:79:255:81 | a13 | match | -| variables.rs:255:79:255:81 | a13 | variables.rs:255:35:255:82 | [match(true)] OrPat | match | +| variables.rs:255:79:255:81 | a13 | variables.rs:255:35:255:82 | [match(true)] ... \| ... | match | | variables.rs:255:87:255:109 | TupleStructPat | variables.rs:255:106:255:108 | a13 | match | -| variables.rs:255:106:255:108 | a13 | variables.rs:255:9:255:109 | [match(true)] OrPat | match | +| variables.rs:255:106:255:108 | a13 | variables.rs:255:9:255:109 | [match(true)] ... \| ... \| ... | match | | variables.rs:256:16:256:24 | print_i64 | variables.rs:256:26:256:28 | a13 | | -| variables.rs:256:16:256:29 | CallExpr | variables.rs:254:5:257:5 | MatchExpr | | -| variables.rs:256:26:256:28 | a13 | variables.rs:256:16:256:29 | CallExpr | | -| variables.rs:260:1:269:1 | enter param_pattern1 | variables.rs:261:5:261:6 | a8 | | -| variables.rs:260:1:269:1 | exit param_pattern1 (normal) | variables.rs:260:1:269:1 | exit param_pattern1 | | -| variables.rs:261:5:261:6 | a8 | variables.rs:261:5:261:12 | Param | match | -| variables.rs:261:5:261:12 | Param | variables.rs:262:5:265:5 | TuplePat | | +| variables.rs:256:16:256:29 | print_i64(...) | variables.rs:254:5:257:5 | match fv { ... } | | +| variables.rs:256:26:256:28 | a13 | variables.rs:256:16:256:29 | print_i64(...) | | +| variables.rs:260:1:269:1 | enter fn param_pattern1 | variables.rs:261:5:261:6 | a8 | | +| variables.rs:260:1:269:1 | exit fn param_pattern1 (normal) | variables.rs:260:1:269:1 | exit fn param_pattern1 | | +| variables.rs:261:5:261:6 | a8 | variables.rs:261:5:261:12 | ...: ... | match | +| variables.rs:261:5:261:12 | ...: ... | variables.rs:262:5:265:5 | TuplePat | | | variables.rs:262:5:265:5 | TuplePat | variables.rs:263:9:263:10 | b3 | match | -| variables.rs:262:5:265:19 | Param | variables.rs:266:5:266:18 | ExprStmt | | +| variables.rs:262:5:265:19 | ...: ... | variables.rs:266:5:266:18 | ExprStmt | | | variables.rs:263:9:263:10 | b3 | variables.rs:264:9:264:10 | c1 | match | -| variables.rs:264:9:264:10 | c1 | variables.rs:262:5:265:19 | Param | match | -| variables.rs:265:28:269:1 | BlockExpr | variables.rs:260:1:269:1 | exit param_pattern1 (normal) | | +| variables.rs:264:9:264:10 | c1 | variables.rs:262:5:265:19 | ...: ... | match | +| variables.rs:265:28:269:1 | { ... } | variables.rs:260:1:269:1 | exit fn param_pattern1 (normal) | | | variables.rs:266:5:266:13 | print_str | variables.rs:266:15:266:16 | a8 | | -| variables.rs:266:5:266:17 | CallExpr | variables.rs:267:5:267:18 | ExprStmt | | +| variables.rs:266:5:266:17 | print_str(...) | variables.rs:267:5:267:18 | ExprStmt | | | variables.rs:266:5:266:18 | ExprStmt | variables.rs:266:5:266:13 | print_str | | -| variables.rs:266:15:266:16 | a8 | variables.rs:266:5:266:17 | CallExpr | | +| variables.rs:266:15:266:16 | a8 | variables.rs:266:5:266:17 | print_str(...) | | | variables.rs:267:5:267:13 | print_str | variables.rs:267:15:267:16 | b3 | | -| variables.rs:267:5:267:17 | CallExpr | variables.rs:268:5:268:18 | ExprStmt | | +| variables.rs:267:5:267:17 | print_str(...) | variables.rs:268:5:268:18 | ExprStmt | | | variables.rs:267:5:267:18 | ExprStmt | variables.rs:267:5:267:13 | print_str | | -| variables.rs:267:15:267:16 | b3 | variables.rs:267:5:267:17 | CallExpr | | +| variables.rs:267:15:267:16 | b3 | variables.rs:267:5:267:17 | print_str(...) | | | variables.rs:268:5:268:13 | print_str | variables.rs:268:15:268:16 | c1 | | -| variables.rs:268:5:268:17 | CallExpr | variables.rs:265:28:269:1 | BlockExpr | | +| variables.rs:268:5:268:17 | print_str(...) | variables.rs:265:28:269:1 | { ... } | | | variables.rs:268:5:268:18 | ExprStmt | variables.rs:268:5:268:13 | print_str | | -| variables.rs:268:15:268:16 | c1 | variables.rs:268:5:268:17 | CallExpr | | -| variables.rs:271:1:275:1 | enter param_pattern2 | variables.rs:272:6:272:21 | TupleStructPat | | -| variables.rs:271:1:275:1 | exit param_pattern2 (normal) | variables.rs:271:1:275:1 | exit param_pattern2 | | -| variables.rs:272:5:272:50 | Param | variables.rs:274:5:274:18 | ExprStmt | | +| variables.rs:268:15:268:16 | c1 | variables.rs:268:5:268:17 | print_str(...) | | +| variables.rs:271:1:275:1 | enter fn param_pattern2 | variables.rs:272:6:272:21 | TupleStructPat | | +| variables.rs:271:1:275:1 | exit fn param_pattern2 (normal) | variables.rs:271:1:275:1 | exit fn param_pattern2 | | +| variables.rs:272:5:272:50 | ...: Either | variables.rs:274:5:274:18 | ExprStmt | | | variables.rs:272:6:272:21 | TupleStructPat | variables.rs:272:19:272:20 | a9 | match | | variables.rs:272:6:272:21 | TupleStructPat | variables.rs:272:25:272:41 | TupleStructPat | no-match | -| variables.rs:272:6:272:41 | [match(true)] OrPat | variables.rs:272:5:272:50 | Param | match | -| variables.rs:272:19:272:20 | a9 | variables.rs:272:6:272:41 | [match(true)] OrPat | match | +| variables.rs:272:6:272:41 | [match(true)] ... \| ... | variables.rs:272:5:272:50 | ...: Either | match | +| variables.rs:272:19:272:20 | a9 | variables.rs:272:6:272:41 | [match(true)] ... \| ... | match | | variables.rs:272:25:272:41 | TupleStructPat | variables.rs:272:39:272:40 | a9 | match | -| variables.rs:272:39:272:40 | a9 | variables.rs:272:6:272:41 | [match(true)] OrPat | match | -| variables.rs:273:9:275:1 | BlockExpr | variables.rs:271:1:275:1 | exit param_pattern2 (normal) | | +| variables.rs:272:39:272:40 | a9 | variables.rs:272:6:272:41 | [match(true)] ... \| ... | match | +| variables.rs:273:9:275:1 | { ... } | variables.rs:271:1:275:1 | exit fn param_pattern2 (normal) | | | variables.rs:274:5:274:13 | print_i64 | variables.rs:274:15:274:16 | a9 | | -| variables.rs:274:5:274:17 | CallExpr | variables.rs:273:9:275:1 | BlockExpr | | +| variables.rs:274:5:274:17 | print_i64(...) | variables.rs:273:9:275:1 | { ... } | | | variables.rs:274:5:274:18 | ExprStmt | variables.rs:274:5:274:13 | print_i64 | | -| variables.rs:274:15:274:16 | a9 | variables.rs:274:5:274:17 | CallExpr | | -| variables.rs:277:1:312:1 | enter destruct_assignment | variables.rs:278:5:282:18 | LetStmt | | -| variables.rs:277:1:312:1 | exit destruct_assignment (normal) | variables.rs:277:1:312:1 | exit destruct_assignment | | -| variables.rs:277:26:312:1 | BlockExpr | variables.rs:277:1:312:1 | exit destruct_assignment (normal) | | -| variables.rs:278:5:282:18 | LetStmt | variables.rs:282:10:282:10 | 1 | | +| variables.rs:274:15:274:16 | a9 | variables.rs:274:5:274:17 | print_i64(...) | | +| variables.rs:277:1:312:1 | enter fn destruct_assignment | variables.rs:278:5:282:18 | let ... = ... | | +| variables.rs:277:1:312:1 | exit fn destruct_assignment (normal) | variables.rs:277:1:312:1 | exit fn destruct_assignment | | +| variables.rs:277:26:312:1 | { ... } | variables.rs:277:1:312:1 | exit fn destruct_assignment (normal) | | +| variables.rs:278:5:282:18 | let ... = ... | variables.rs:282:10:282:10 | 1 | | | variables.rs:278:9:282:5 | TuplePat | variables.rs:279:9:279:15 | a10 | match | | variables.rs:279:9:279:15 | a10 | variables.rs:280:9:280:14 | b4 | match | | variables.rs:280:9:280:14 | b4 | variables.rs:281:9:281:14 | c2 | match | @@ -609,17 +609,17 @@ edges | variables.rs:282:13:282:13 | 2 | variables.rs:282:16:282:16 | 3 | | | variables.rs:282:16:282:16 | 3 | variables.rs:282:9:282:17 | TupleExpr | | | variables.rs:283:5:283:13 | print_i64 | variables.rs:283:15:283:17 | a10 | | -| variables.rs:283:5:283:18 | CallExpr | variables.rs:284:5:284:18 | ExprStmt | | +| variables.rs:283:5:283:18 | print_i64(...) | variables.rs:284:5:284:18 | ExprStmt | | | variables.rs:283:5:283:19 | ExprStmt | variables.rs:283:5:283:13 | print_i64 | | -| variables.rs:283:15:283:17 | a10 | variables.rs:283:5:283:18 | CallExpr | | +| variables.rs:283:15:283:17 | a10 | variables.rs:283:5:283:18 | print_i64(...) | | | variables.rs:284:5:284:13 | print_i64 | variables.rs:284:15:284:16 | b4 | | -| variables.rs:284:5:284:17 | CallExpr | variables.rs:285:5:285:18 | ExprStmt | | +| variables.rs:284:5:284:17 | print_i64(...) | variables.rs:285:5:285:18 | ExprStmt | | | variables.rs:284:5:284:18 | ExprStmt | variables.rs:284:5:284:13 | print_i64 | | -| variables.rs:284:15:284:16 | b4 | variables.rs:284:5:284:17 | CallExpr | | +| variables.rs:284:15:284:16 | b4 | variables.rs:284:5:284:17 | print_i64(...) | | | variables.rs:285:5:285:13 | print_i64 | variables.rs:285:15:285:16 | c2 | | -| variables.rs:285:5:285:17 | CallExpr | variables.rs:287:5:295:6 | ExprStmt | | +| variables.rs:285:5:285:17 | print_i64(...) | variables.rs:287:5:295:6 | ExprStmt | | | variables.rs:285:5:285:18 | ExprStmt | variables.rs:285:5:285:13 | print_i64 | | -| variables.rs:285:15:285:16 | c2 | variables.rs:285:5:285:17 | CallExpr | | +| variables.rs:285:15:285:16 | c2 | variables.rs:285:5:285:17 | print_i64(...) | | | variables.rs:287:5:291:5 | TupleExpr | variables.rs:292:9:292:11 | a10 | | | variables.rs:287:5:295:5 | ... = ... | variables.rs:296:5:296:19 | ExprStmt | | | variables.rs:287:5:295:6 | ExprStmt | variables.rs:288:9:288:10 | c2 | | @@ -631,105 +631,105 @@ edges | variables.rs:293:9:293:10 | b4 | variables.rs:294:9:294:10 | c2 | | | variables.rs:294:9:294:10 | c2 | variables.rs:291:9:295:5 | TupleExpr | | | variables.rs:296:5:296:13 | print_i64 | variables.rs:296:15:296:17 | a10 | | -| variables.rs:296:5:296:18 | CallExpr | variables.rs:297:5:297:18 | ExprStmt | | +| variables.rs:296:5:296:18 | print_i64(...) | variables.rs:297:5:297:18 | ExprStmt | | | variables.rs:296:5:296:19 | ExprStmt | variables.rs:296:5:296:13 | print_i64 | | -| variables.rs:296:15:296:17 | a10 | variables.rs:296:5:296:18 | CallExpr | | +| variables.rs:296:15:296:17 | a10 | variables.rs:296:5:296:18 | print_i64(...) | | | variables.rs:297:5:297:13 | print_i64 | variables.rs:297:15:297:16 | b4 | | -| variables.rs:297:5:297:17 | CallExpr | variables.rs:298:5:298:18 | ExprStmt | | +| variables.rs:297:5:297:17 | print_i64(...) | variables.rs:298:5:298:18 | ExprStmt | | | variables.rs:297:5:297:18 | ExprStmt | variables.rs:297:5:297:13 | print_i64 | | -| variables.rs:297:15:297:16 | b4 | variables.rs:297:5:297:17 | CallExpr | | +| variables.rs:297:15:297:16 | b4 | variables.rs:297:5:297:17 | print_i64(...) | | | variables.rs:298:5:298:13 | print_i64 | variables.rs:298:15:298:16 | c2 | | -| variables.rs:298:5:298:17 | CallExpr | variables.rs:300:5:308:5 | ExprStmt | | +| variables.rs:298:5:298:17 | print_i64(...) | variables.rs:300:5:308:5 | ExprStmt | | | variables.rs:298:5:298:18 | ExprStmt | variables.rs:298:5:298:13 | print_i64 | | -| variables.rs:298:15:298:16 | c2 | variables.rs:298:5:298:17 | CallExpr | | +| variables.rs:298:15:298:16 | c2 | variables.rs:298:5:298:17 | print_i64(...) | | | variables.rs:300:5:308:5 | ExprStmt | variables.rs:300:12:300:12 | 4 | | -| variables.rs:300:5:308:5 | MatchExpr | variables.rs:310:5:310:19 | ExprStmt | | +| variables.rs:300:5:308:5 | match ... { ... } | variables.rs:310:5:310:19 | ExprStmt | | | variables.rs:300:11:300:16 | TupleExpr | variables.rs:301:9:304:9 | TuplePat | | | variables.rs:300:12:300:12 | 4 | variables.rs:300:15:300:15 | 5 | | | variables.rs:300:15:300:15 | 5 | variables.rs:300:11:300:16 | TupleExpr | | | variables.rs:301:9:304:9 | TuplePat | variables.rs:302:13:302:15 | a10 | match | | variables.rs:302:13:302:15 | a10 | variables.rs:303:13:303:14 | b4 | match | | variables.rs:303:13:303:14 | b4 | variables.rs:305:13:305:27 | ExprStmt | match | -| variables.rs:304:14:307:9 | BlockExpr | variables.rs:300:5:308:5 | MatchExpr | | +| variables.rs:304:14:307:9 | { ... } | variables.rs:300:5:308:5 | match ... { ... } | | | variables.rs:305:13:305:21 | print_i64 | variables.rs:305:23:305:25 | a10 | | -| variables.rs:305:13:305:26 | CallExpr | variables.rs:306:13:306:26 | ExprStmt | | +| variables.rs:305:13:305:26 | print_i64(...) | variables.rs:306:13:306:26 | ExprStmt | | | variables.rs:305:13:305:27 | ExprStmt | variables.rs:305:13:305:21 | print_i64 | | -| variables.rs:305:23:305:25 | a10 | variables.rs:305:13:305:26 | CallExpr | | +| variables.rs:305:23:305:25 | a10 | variables.rs:305:13:305:26 | print_i64(...) | | | variables.rs:306:13:306:21 | print_i64 | variables.rs:306:23:306:24 | b4 | | -| variables.rs:306:13:306:25 | CallExpr | variables.rs:304:14:307:9 | BlockExpr | | +| variables.rs:306:13:306:25 | print_i64(...) | variables.rs:304:14:307:9 | { ... } | | | variables.rs:306:13:306:26 | ExprStmt | variables.rs:306:13:306:21 | print_i64 | | -| variables.rs:306:23:306:24 | b4 | variables.rs:306:13:306:25 | CallExpr | | +| variables.rs:306:23:306:24 | b4 | variables.rs:306:13:306:25 | print_i64(...) | | | variables.rs:310:5:310:13 | print_i64 | variables.rs:310:15:310:17 | a10 | | -| variables.rs:310:5:310:18 | CallExpr | variables.rs:311:5:311:18 | ExprStmt | | +| variables.rs:310:5:310:18 | print_i64(...) | variables.rs:311:5:311:18 | ExprStmt | | | variables.rs:310:5:310:19 | ExprStmt | variables.rs:310:5:310:13 | print_i64 | | -| variables.rs:310:15:310:17 | a10 | variables.rs:310:5:310:18 | CallExpr | | +| variables.rs:310:15:310:17 | a10 | variables.rs:310:5:310:18 | print_i64(...) | | | variables.rs:311:5:311:13 | print_i64 | variables.rs:311:15:311:16 | b4 | | -| variables.rs:311:5:311:17 | CallExpr | variables.rs:277:26:312:1 | BlockExpr | | +| variables.rs:311:5:311:17 | print_i64(...) | variables.rs:277:26:312:1 | { ... } | | | variables.rs:311:5:311:18 | ExprStmt | variables.rs:311:5:311:13 | print_i64 | | -| variables.rs:311:15:311:16 | b4 | variables.rs:311:5:311:17 | CallExpr | | -| variables.rs:314:1:329:1 | enter closure_variable | variables.rs:315:5:317:10 | LetStmt | | -| variables.rs:314:1:329:1 | exit closure_variable (normal) | variables.rs:314:1:329:1 | exit closure_variable | | -| variables.rs:314:23:329:1 | BlockExpr | variables.rs:314:1:329:1 | exit closure_variable (normal) | | -| variables.rs:315:5:317:10 | LetStmt | variables.rs:316:9:317:9 | ClosureExpr | | -| variables.rs:315:9:315:23 | example_closure | variables.rs:318:5:319:27 | LetStmt | match | -| variables.rs:316:9:317:9 | ClosureExpr | variables.rs:315:9:315:23 | example_closure | | -| variables.rs:316:9:317:9 | enter ClosureExpr | variables.rs:316:10:316:10 | x | | -| variables.rs:316:9:317:9 | exit ClosureExpr (normal) | variables.rs:316:9:317:9 | exit ClosureExpr | | -| variables.rs:316:10:316:10 | x | variables.rs:316:10:316:15 | Param | match | -| variables.rs:316:10:316:15 | Param | variables.rs:317:9:317:9 | x | | -| variables.rs:317:9:317:9 | x | variables.rs:316:9:317:9 | exit ClosureExpr (normal) | | -| variables.rs:318:5:319:27 | LetStmt | variables.rs:319:9:319:23 | example_closure | | +| variables.rs:311:15:311:16 | b4 | variables.rs:311:5:311:17 | print_i64(...) | | +| variables.rs:314:1:329:1 | enter fn closure_variable | variables.rs:315:5:317:10 | let ... = ... | | +| variables.rs:314:1:329:1 | exit fn closure_variable (normal) | variables.rs:314:1:329:1 | exit fn closure_variable | | +| variables.rs:314:23:329:1 | { ... } | variables.rs:314:1:329:1 | exit fn closure_variable (normal) | | +| variables.rs:315:5:317:10 | let ... = ... | variables.rs:316:9:317:9 | \|...\| x | | +| variables.rs:315:9:315:23 | example_closure | variables.rs:318:5:319:27 | let ... = ... | match | +| variables.rs:316:9:317:9 | \|...\| x | variables.rs:315:9:315:23 | example_closure | | +| variables.rs:316:9:317:9 | enter \|...\| x | variables.rs:316:10:316:10 | x | | +| variables.rs:316:9:317:9 | exit \|...\| x (normal) | variables.rs:316:9:317:9 | exit \|...\| x | | +| variables.rs:316:10:316:10 | x | variables.rs:316:10:316:15 | ...: i64 | match | +| variables.rs:316:10:316:15 | ...: i64 | variables.rs:317:9:317:9 | x | | +| variables.rs:317:9:317:9 | x | variables.rs:316:9:317:9 | exit \|...\| x (normal) | | +| variables.rs:318:5:319:27 | let ... = ... | variables.rs:319:9:319:23 | example_closure | | | variables.rs:318:9:318:10 | n1 | variables.rs:320:5:320:18 | ExprStmt | match | | variables.rs:319:9:319:23 | example_closure | variables.rs:319:25:319:25 | 5 | | -| variables.rs:319:9:319:26 | CallExpr | variables.rs:318:9:318:10 | n1 | | -| variables.rs:319:25:319:25 | 5 | variables.rs:319:9:319:26 | CallExpr | | +| variables.rs:319:9:319:26 | example_closure(...) | variables.rs:318:9:318:10 | n1 | | +| variables.rs:319:25:319:25 | 5 | variables.rs:319:9:319:26 | example_closure(...) | | | variables.rs:320:5:320:13 | print_i64 | variables.rs:320:15:320:16 | n1 | | -| variables.rs:320:5:320:17 | CallExpr | variables.rs:322:5:322:25 | ExprStmt | | +| variables.rs:320:5:320:17 | print_i64(...) | variables.rs:322:5:322:25 | ExprStmt | | | variables.rs:320:5:320:18 | ExprStmt | variables.rs:320:5:320:13 | print_i64 | | -| variables.rs:320:15:320:16 | n1 | variables.rs:320:5:320:17 | CallExpr | | -| variables.rs:322:5:322:22 | immutable_variable | variables.rs:322:5:322:24 | CallExpr | | -| variables.rs:322:5:322:24 | CallExpr | variables.rs:323:5:325:10 | LetStmt | | +| variables.rs:320:15:320:16 | n1 | variables.rs:320:5:320:17 | print_i64(...) | | +| variables.rs:322:5:322:22 | immutable_variable | variables.rs:322:5:322:24 | immutable_variable(...) | | +| variables.rs:322:5:322:24 | immutable_variable(...) | variables.rs:323:5:325:10 | let ... = ... | | | variables.rs:322:5:322:25 | ExprStmt | variables.rs:322:5:322:22 | immutable_variable | | -| variables.rs:323:5:325:10 | LetStmt | variables.rs:324:9:325:9 | ClosureExpr | | -| variables.rs:323:9:323:26 | immutable_variable | variables.rs:326:5:327:30 | LetStmt | match | -| variables.rs:324:9:325:9 | ClosureExpr | variables.rs:323:9:323:26 | immutable_variable | | -| variables.rs:324:9:325:9 | enter ClosureExpr | variables.rs:324:10:324:10 | x | | -| variables.rs:324:9:325:9 | exit ClosureExpr (normal) | variables.rs:324:9:325:9 | exit ClosureExpr | | -| variables.rs:324:10:324:10 | x | variables.rs:324:10:324:15 | Param | match | -| variables.rs:324:10:324:15 | Param | variables.rs:325:9:325:9 | x | | -| variables.rs:325:9:325:9 | x | variables.rs:324:9:325:9 | exit ClosureExpr (normal) | | -| variables.rs:326:5:327:30 | LetStmt | variables.rs:327:9:327:26 | immutable_variable | | +| variables.rs:323:5:325:10 | let ... = ... | variables.rs:324:9:325:9 | \|...\| x | | +| variables.rs:323:9:323:26 | immutable_variable | variables.rs:326:5:327:30 | let ... = ... | match | +| variables.rs:324:9:325:9 | \|...\| x | variables.rs:323:9:323:26 | immutable_variable | | +| variables.rs:324:9:325:9 | enter \|...\| x | variables.rs:324:10:324:10 | x | | +| variables.rs:324:9:325:9 | exit \|...\| x (normal) | variables.rs:324:9:325:9 | exit \|...\| x | | +| variables.rs:324:10:324:10 | x | variables.rs:324:10:324:15 | ...: i64 | match | +| variables.rs:324:10:324:15 | ...: i64 | variables.rs:325:9:325:9 | x | | +| variables.rs:325:9:325:9 | x | variables.rs:324:9:325:9 | exit \|...\| x (normal) | | +| variables.rs:326:5:327:30 | let ... = ... | variables.rs:327:9:327:26 | immutable_variable | | | variables.rs:326:9:326:10 | n2 | variables.rs:328:5:328:18 | ExprStmt | match | | variables.rs:327:9:327:26 | immutable_variable | variables.rs:327:28:327:28 | 6 | | -| variables.rs:327:9:327:29 | CallExpr | variables.rs:326:9:326:10 | n2 | | -| variables.rs:327:28:327:28 | 6 | variables.rs:327:9:327:29 | CallExpr | | +| variables.rs:327:9:327:29 | immutable_variable(...) | variables.rs:326:9:326:10 | n2 | | +| variables.rs:327:28:327:28 | 6 | variables.rs:327:9:327:29 | immutable_variable(...) | | | variables.rs:328:5:328:13 | print_i64 | variables.rs:328:15:328:16 | n2 | | -| variables.rs:328:5:328:17 | CallExpr | variables.rs:314:23:329:1 | BlockExpr | | +| variables.rs:328:5:328:17 | print_i64(...) | variables.rs:314:23:329:1 | { ... } | | | variables.rs:328:5:328:18 | ExprStmt | variables.rs:328:5:328:13 | print_i64 | | -| variables.rs:328:15:328:16 | n2 | variables.rs:328:5:328:17 | CallExpr | | -| variables.rs:331:1:338:1 | enter for_variable | variables.rs:332:5:332:42 | LetStmt | | -| variables.rs:331:1:338:1 | exit for_variable (normal) | variables.rs:331:1:338:1 | exit for_variable | | -| variables.rs:331:19:338:1 | BlockExpr | variables.rs:331:1:338:1 | exit for_variable (normal) | | -| variables.rs:332:5:332:42 | LetStmt | variables.rs:332:15:332:22 | "apples" | | +| variables.rs:328:15:328:16 | n2 | variables.rs:328:5:328:17 | print_i64(...) | | +| variables.rs:331:1:338:1 | enter fn for_variable | variables.rs:332:5:332:42 | let ... = ... | | +| variables.rs:331:1:338:1 | exit fn for_variable (normal) | variables.rs:331:1:338:1 | exit fn for_variable | | +| variables.rs:331:19:338:1 | { ... } | variables.rs:331:1:338:1 | exit fn for_variable (normal) | | +| variables.rs:332:5:332:42 | let ... = ... | variables.rs:332:15:332:22 | "apples" | | | variables.rs:332:9:332:9 | v | variables.rs:335:12:335:12 | v | match | -| variables.rs:332:13:332:41 | RefExpr | variables.rs:332:9:332:9 | v | | -| variables.rs:332:14:332:41 | ArrayExpr | variables.rs:332:13:332:41 | RefExpr | | +| variables.rs:332:13:332:41 | &... | variables.rs:332:9:332:9 | v | | +| variables.rs:332:14:332:41 | [...] | variables.rs:332:13:332:41 | &... | | | variables.rs:332:15:332:22 | "apples" | variables.rs:332:25:332:30 | "cake" | | | variables.rs:332:25:332:30 | "cake" | variables.rs:332:33:332:40 | "coffee" | | -| variables.rs:332:33:332:40 | "coffee" | variables.rs:332:14:332:41 | ArrayExpr | | -| variables.rs:334:5:337:5 | ForExpr | variables.rs:331:19:338:1 | BlockExpr | | -| variables.rs:334:9:334:12 | text | variables.rs:334:5:337:5 | ForExpr | no-match | +| variables.rs:332:33:332:40 | "coffee" | variables.rs:332:14:332:41 | [...] | | +| variables.rs:334:5:337:5 | for ... in ... { ... } | variables.rs:331:19:338:1 | { ... } | | +| variables.rs:334:9:334:12 | text | variables.rs:334:5:337:5 | for ... in ... { ... } | no-match | | variables.rs:334:9:334:12 | text | variables.rs:336:9:336:24 | ExprStmt | match | | variables.rs:335:12:335:12 | v | variables.rs:334:9:334:12 | text | | -| variables.rs:335:14:337:5 | BlockExpr | variables.rs:334:9:334:12 | text | | +| variables.rs:335:14:337:5 | { ... } | variables.rs:334:9:334:12 | text | | | variables.rs:336:9:336:17 | print_str | variables.rs:336:19:336:22 | text | | -| variables.rs:336:9:336:23 | CallExpr | variables.rs:335:14:337:5 | BlockExpr | | +| variables.rs:336:9:336:23 | print_str(...) | variables.rs:335:14:337:5 | { ... } | | | variables.rs:336:9:336:24 | ExprStmt | variables.rs:336:9:336:17 | print_str | | -| variables.rs:336:19:336:22 | text | variables.rs:336:9:336:23 | CallExpr | | -| variables.rs:340:1:346:1 | enter add_assign | variables.rs:341:5:341:18 | LetStmt | | -| variables.rs:340:1:346:1 | exit add_assign (normal) | variables.rs:340:1:346:1 | exit add_assign | | -| variables.rs:340:17:346:1 | BlockExpr | variables.rs:340:1:346:1 | exit add_assign (normal) | | -| variables.rs:341:5:341:18 | LetStmt | variables.rs:341:17:341:17 | 0 | | +| variables.rs:336:19:336:22 | text | variables.rs:336:9:336:23 | print_str(...) | | +| variables.rs:340:1:346:1 | enter fn add_assign | variables.rs:341:5:341:18 | let ... = 0 | | +| variables.rs:340:1:346:1 | exit fn add_assign (normal) | variables.rs:340:1:346:1 | exit fn add_assign | | +| variables.rs:340:17:346:1 | { ... } | variables.rs:340:1:346:1 | exit fn add_assign (normal) | | +| variables.rs:341:5:341:18 | let ... = 0 | variables.rs:341:17:341:17 | 0 | | | variables.rs:341:9:341:13 | a | variables.rs:342:5:342:11 | ExprStmt | match | | variables.rs:341:17:341:17 | 0 | variables.rs:341:9:341:13 | a | | | variables.rs:342:5:342:5 | a | variables.rs:342:10:342:10 | 1 | | @@ -737,41 +737,41 @@ edges | variables.rs:342:5:342:11 | ExprStmt | variables.rs:342:5:342:5 | a | | | variables.rs:342:10:342:10 | 1 | variables.rs:342:5:342:10 | ... += ... | | | variables.rs:343:5:343:13 | print_i64 | variables.rs:343:15:343:15 | a | | -| variables.rs:343:5:343:16 | CallExpr | variables.rs:344:5:344:28 | ExprStmt | | +| variables.rs:343:5:343:16 | print_i64(...) | variables.rs:344:5:344:28 | ExprStmt | | | variables.rs:343:5:343:17 | ExprStmt | variables.rs:343:5:343:13 | print_i64 | | -| variables.rs:343:15:343:15 | a | variables.rs:343:5:343:16 | CallExpr | | +| variables.rs:343:15:343:15 | a | variables.rs:343:5:343:16 | print_i64(...) | | | variables.rs:344:5:344:27 | ... .add_assign(...) | variables.rs:345:5:345:17 | ExprStmt | | | variables.rs:344:5:344:28 | ExprStmt | variables.rs:344:11:344:11 | a | | -| variables.rs:344:6:344:11 | RefExpr | variables.rs:344:25:344:26 | 10 | | -| variables.rs:344:11:344:11 | a | variables.rs:344:6:344:11 | RefExpr | | +| variables.rs:344:6:344:11 | &mut a | variables.rs:344:25:344:26 | 10 | | +| variables.rs:344:11:344:11 | a | variables.rs:344:6:344:11 | &mut a | | | variables.rs:344:25:344:26 | 10 | variables.rs:344:5:344:27 | ... .add_assign(...) | | | variables.rs:345:5:345:13 | print_i64 | variables.rs:345:15:345:15 | a | | -| variables.rs:345:5:345:16 | CallExpr | variables.rs:340:17:346:1 | BlockExpr | | +| variables.rs:345:5:345:16 | print_i64(...) | variables.rs:340:17:346:1 | { ... } | | | variables.rs:345:5:345:17 | ExprStmt | variables.rs:345:5:345:13 | print_i64 | | -| variables.rs:345:15:345:15 | a | variables.rs:345:5:345:16 | CallExpr | | -| variables.rs:348:1:354:1 | enter mutate | variables.rs:349:5:349:18 | LetStmt | | -| variables.rs:348:1:354:1 | exit mutate (normal) | variables.rs:348:1:354:1 | exit mutate | | -| variables.rs:348:13:354:1 | BlockExpr | variables.rs:348:1:354:1 | exit mutate (normal) | | -| variables.rs:349:5:349:18 | LetStmt | variables.rs:349:17:349:17 | 1 | | -| variables.rs:349:9:349:13 | i | variables.rs:350:5:351:15 | LetStmt | match | +| variables.rs:345:15:345:15 | a | variables.rs:345:5:345:16 | print_i64(...) | | +| variables.rs:348:1:354:1 | enter fn mutate | variables.rs:349:5:349:18 | let ... = 1 | | +| variables.rs:348:1:354:1 | exit fn mutate (normal) | variables.rs:348:1:354:1 | exit fn mutate | | +| variables.rs:348:13:354:1 | { ... } | variables.rs:348:1:354:1 | exit fn mutate (normal) | | +| variables.rs:349:5:349:18 | let ... = 1 | variables.rs:349:17:349:17 | 1 | | +| variables.rs:349:9:349:13 | i | variables.rs:350:5:351:15 | let ... = ... | match | | variables.rs:349:17:349:17 | 1 | variables.rs:349:9:349:13 | i | | -| variables.rs:350:5:351:15 | LetStmt | variables.rs:351:14:351:14 | i | | +| variables.rs:350:5:351:15 | let ... = ... | variables.rs:351:14:351:14 | i | | | variables.rs:350:9:350:13 | ref_i | variables.rs:352:5:352:15 | ExprStmt | match | -| variables.rs:351:9:351:14 | RefExpr | variables.rs:350:9:350:13 | ref_i | | -| variables.rs:351:14:351:14 | i | variables.rs:351:9:351:14 | RefExpr | | +| variables.rs:351:9:351:14 | &mut i | variables.rs:350:9:350:13 | ref_i | | +| variables.rs:351:14:351:14 | i | variables.rs:351:9:351:14 | &mut i | | | variables.rs:352:5:352:10 | * ... | variables.rs:352:14:352:14 | 2 | | | variables.rs:352:5:352:14 | ... = ... | variables.rs:353:5:353:17 | ExprStmt | | | variables.rs:352:5:352:15 | ExprStmt | variables.rs:352:6:352:10 | ref_i | | | variables.rs:352:6:352:10 | ref_i | variables.rs:352:5:352:10 | * ... | | | variables.rs:352:14:352:14 | 2 | variables.rs:352:5:352:14 | ... = ... | | | variables.rs:353:5:353:13 | print_i64 | variables.rs:353:15:353:15 | i | | -| variables.rs:353:5:353:16 | CallExpr | variables.rs:348:13:354:1 | BlockExpr | | +| variables.rs:353:5:353:16 | print_i64(...) | variables.rs:348:13:354:1 | { ... } | | | variables.rs:353:5:353:17 | ExprStmt | variables.rs:353:5:353:13 | print_i64 | | -| variables.rs:353:15:353:15 | i | variables.rs:353:5:353:16 | CallExpr | | -| variables.rs:356:1:361:1 | enter mutate_param | variables.rs:356:17:356:17 | x | | -| variables.rs:356:1:361:1 | exit mutate_param (normal) | variables.rs:356:1:361:1 | exit mutate_param | | -| variables.rs:356:17:356:17 | x | variables.rs:356:17:356:28 | Param | match | -| variables.rs:356:17:356:28 | Param | variables.rs:357:5:359:11 | ExprStmt | | +| variables.rs:353:15:353:15 | i | variables.rs:353:5:353:16 | print_i64(...) | | +| variables.rs:356:1:361:1 | enter fn mutate_param | variables.rs:356:17:356:17 | x | | +| variables.rs:356:1:361:1 | exit fn mutate_param (normal) | variables.rs:356:1:361:1 | exit fn mutate_param | | +| variables.rs:356:17:356:17 | x | variables.rs:356:17:356:28 | ...: ... | match | +| variables.rs:356:17:356:28 | ...: ... | variables.rs:357:5:359:11 | ExprStmt | | | variables.rs:357:5:357:6 | * ... | variables.rs:358:10:358:10 | x | | | variables.rs:357:5:359:10 | ... = ... | variables.rs:360:5:360:13 | ExprStmt | | | variables.rs:357:5:359:11 | ExprStmt | variables.rs:357:6:357:6 | x | | @@ -781,16 +781,16 @@ edges | variables.rs:358:10:358:10 | x | variables.rs:358:9:358:10 | * ... | | | variables.rs:359:9:359:10 | * ... | variables.rs:358:9:359:10 | ... + ... | | | variables.rs:359:10:359:10 | x | variables.rs:359:9:359:10 | * ... | | -| variables.rs:360:5:360:12 | ReturnExpr | variables.rs:356:1:361:1 | exit mutate_param (normal) | return | +| variables.rs:360:5:360:12 | return x | variables.rs:356:1:361:1 | exit fn mutate_param (normal) | return | | variables.rs:360:5:360:13 | ExprStmt | variables.rs:360:12:360:12 | x | | -| variables.rs:360:12:360:12 | x | variables.rs:360:5:360:12 | ReturnExpr | | -| variables.rs:363:1:369:1 | enter mutate_param2 | variables.rs:363:22:363:22 | x | | -| variables.rs:363:1:369:1 | exit mutate_param2 (normal) | variables.rs:363:1:369:1 | exit mutate_param2 | | -| variables.rs:363:22:363:22 | x | variables.rs:363:22:363:36 | Param | match | -| variables.rs:363:22:363:36 | Param | variables.rs:363:39:363:39 | y | | -| variables.rs:363:39:363:39 | y | variables.rs:363:39:363:57 | Param | match | -| variables.rs:363:39:363:57 | Param | variables.rs:364:5:366:11 | ExprStmt | | -| variables.rs:363:60:369:1 | BlockExpr | variables.rs:363:1:369:1 | exit mutate_param2 (normal) | | +| variables.rs:360:12:360:12 | x | variables.rs:360:5:360:12 | return x | | +| variables.rs:363:1:369:1 | enter fn mutate_param2 | variables.rs:363:22:363:22 | x | | +| variables.rs:363:1:369:1 | exit fn mutate_param2 (normal) | variables.rs:363:1:369:1 | exit fn mutate_param2 | | +| variables.rs:363:22:363:22 | x | variables.rs:363:22:363:36 | ...: ... | match | +| variables.rs:363:22:363:36 | ...: ... | variables.rs:363:39:363:39 | y | | +| variables.rs:363:39:363:39 | y | variables.rs:363:39:363:57 | ...: ... | match | +| variables.rs:363:39:363:57 | ...: ... | variables.rs:364:5:366:11 | ExprStmt | | +| variables.rs:363:60:369:1 | { ... } | variables.rs:363:1:369:1 | exit fn mutate_param2 (normal) | | | variables.rs:364:5:364:6 | * ... | variables.rs:365:10:365:10 | x | | | variables.rs:364:5:366:10 | ... = ... | variables.rs:367:5:368:10 | ExprStmt | | | variables.rs:364:5:366:11 | ExprStmt | variables.rs:364:6:364:6 | x | | @@ -801,45 +801,45 @@ edges | variables.rs:366:9:366:10 | * ... | variables.rs:365:9:366:10 | ... + ... | | | variables.rs:366:10:366:10 | x | variables.rs:366:9:366:10 | * ... | | | variables.rs:367:5:367:6 | * ... | variables.rs:368:9:368:9 | x | | -| variables.rs:367:5:368:9 | ... = ... | variables.rs:363:60:369:1 | BlockExpr | | +| variables.rs:367:5:368:9 | ... = ... | variables.rs:363:60:369:1 | { ... } | | | variables.rs:367:5:368:10 | ExprStmt | variables.rs:367:6:367:6 | y | | | variables.rs:367:6:367:6 | y | variables.rs:367:5:367:6 | * ... | | | variables.rs:368:9:368:9 | x | variables.rs:367:5:368:9 | ... = ... | | -| variables.rs:371:1:389:1 | enter mutate_arg | variables.rs:372:5:372:18 | LetStmt | | -| variables.rs:371:1:389:1 | exit mutate_arg (normal) | variables.rs:371:1:389:1 | exit mutate_arg | | -| variables.rs:371:17:389:1 | BlockExpr | variables.rs:371:1:389:1 | exit mutate_arg (normal) | | -| variables.rs:372:5:372:18 | LetStmt | variables.rs:372:17:372:17 | 2 | | -| variables.rs:372:9:372:13 | x | variables.rs:373:5:374:29 | LetStmt | match | +| variables.rs:371:1:389:1 | enter fn mutate_arg | variables.rs:372:5:372:18 | let ... = 2 | | +| variables.rs:371:1:389:1 | exit fn mutate_arg (normal) | variables.rs:371:1:389:1 | exit fn mutate_arg | | +| variables.rs:371:17:389:1 | { ... } | variables.rs:371:1:389:1 | exit fn mutate_arg (normal) | | +| variables.rs:372:5:372:18 | let ... = 2 | variables.rs:372:17:372:17 | 2 | | +| variables.rs:372:9:372:13 | x | variables.rs:373:5:374:29 | let ... = ... | match | | variables.rs:372:17:372:17 | 2 | variables.rs:372:9:372:13 | x | | -| variables.rs:373:5:374:29 | LetStmt | variables.rs:374:9:374:20 | mutate_param | | +| variables.rs:373:5:374:29 | let ... = ... | variables.rs:374:9:374:20 | mutate_param | | | variables.rs:373:9:373:9 | y | variables.rs:375:5:375:12 | ExprStmt | match | | variables.rs:374:9:374:20 | mutate_param | variables.rs:374:27:374:27 | x | | -| variables.rs:374:9:374:28 | CallExpr | variables.rs:373:9:373:9 | y | | -| variables.rs:374:22:374:27 | RefExpr | variables.rs:374:9:374:28 | CallExpr | | -| variables.rs:374:27:374:27 | x | variables.rs:374:22:374:27 | RefExpr | | +| variables.rs:374:9:374:28 | mutate_param(...) | variables.rs:373:9:373:9 | y | | +| variables.rs:374:22:374:27 | &mut x | variables.rs:374:9:374:28 | mutate_param(...) | | +| variables.rs:374:27:374:27 | x | variables.rs:374:22:374:27 | &mut x | | | variables.rs:375:5:375:6 | * ... | variables.rs:375:10:375:11 | 10 | | | variables.rs:375:5:375:11 | ... = ... | variables.rs:377:5:377:17 | ExprStmt | | | variables.rs:375:5:375:12 | ExprStmt | variables.rs:375:6:375:6 | y | | | variables.rs:375:6:375:6 | y | variables.rs:375:5:375:6 | * ... | | | variables.rs:375:10:375:11 | 10 | variables.rs:375:5:375:11 | ... = ... | | | variables.rs:377:5:377:13 | print_i64 | variables.rs:377:15:377:15 | x | | -| variables.rs:377:5:377:16 | CallExpr | variables.rs:379:5:379:18 | LetStmt | | +| variables.rs:377:5:377:16 | print_i64(...) | variables.rs:379:5:379:18 | let ... = 4 | | | variables.rs:377:5:377:17 | ExprStmt | variables.rs:377:5:377:13 | print_i64 | | -| variables.rs:377:15:377:15 | x | variables.rs:377:5:377:16 | CallExpr | | -| variables.rs:379:5:379:18 | LetStmt | variables.rs:379:17:379:17 | 4 | | -| variables.rs:379:9:379:13 | z | variables.rs:380:5:381:20 | LetStmt | match | +| variables.rs:377:15:377:15 | x | variables.rs:377:5:377:16 | print_i64(...) | | +| variables.rs:379:5:379:18 | let ... = 4 | variables.rs:379:17:379:17 | 4 | | +| variables.rs:379:9:379:13 | z | variables.rs:380:5:381:20 | let ... = ... | match | | variables.rs:379:17:379:17 | 4 | variables.rs:379:9:379:13 | z | | -| variables.rs:380:5:381:20 | LetStmt | variables.rs:381:19:381:19 | x | | +| variables.rs:380:5:381:20 | let ... = ... | variables.rs:381:19:381:19 | x | | | variables.rs:380:9:380:9 | w | variables.rs:382:5:385:6 | ExprStmt | match | -| variables.rs:381:9:381:19 | RefExpr | variables.rs:380:9:380:9 | w | | -| variables.rs:381:14:381:19 | RefExpr | variables.rs:381:9:381:19 | RefExpr | | -| variables.rs:381:19:381:19 | x | variables.rs:381:14:381:19 | RefExpr | | +| variables.rs:381:9:381:19 | &mut ... | variables.rs:380:9:380:9 | w | | +| variables.rs:381:14:381:19 | &mut x | variables.rs:381:9:381:19 | &mut ... | | +| variables.rs:381:19:381:19 | x | variables.rs:381:14:381:19 | &mut x | | | variables.rs:382:5:382:17 | mutate_param2 | variables.rs:383:14:383:14 | z | | -| variables.rs:382:5:385:5 | CallExpr | variables.rs:386:5:386:13 | ExprStmt | | +| variables.rs:382:5:385:5 | mutate_param2(...) | variables.rs:386:5:386:13 | ExprStmt | | | variables.rs:382:5:385:6 | ExprStmt | variables.rs:382:5:382:17 | mutate_param2 | | -| variables.rs:383:9:383:14 | RefExpr | variables.rs:384:9:384:9 | w | | -| variables.rs:383:14:383:14 | z | variables.rs:383:9:383:14 | RefExpr | | -| variables.rs:384:9:384:9 | w | variables.rs:382:5:385:5 | CallExpr | | +| variables.rs:383:9:383:14 | &mut z | variables.rs:384:9:384:9 | w | | +| variables.rs:383:14:383:14 | z | variables.rs:383:9:383:14 | &mut z | | +| variables.rs:384:9:384:9 | w | variables.rs:382:5:385:5 | mutate_param2(...) | | | variables.rs:386:5:386:7 | * ... | variables.rs:386:11:386:12 | 11 | | | variables.rs:386:5:386:12 | ... = ... | variables.rs:388:5:388:17 | ExprStmt | | | variables.rs:386:5:386:13 | ExprStmt | variables.rs:386:7:386:7 | w | | @@ -847,426 +847,426 @@ edges | variables.rs:386:7:386:7 | w | variables.rs:386:6:386:7 | * ... | | | variables.rs:386:11:386:12 | 11 | variables.rs:386:5:386:12 | ... = ... | | | variables.rs:388:5:388:13 | print_i64 | variables.rs:388:15:388:15 | z | | -| variables.rs:388:5:388:16 | CallExpr | variables.rs:371:17:389:1 | BlockExpr | | +| variables.rs:388:5:388:16 | print_i64(...) | variables.rs:371:17:389:1 | { ... } | | | variables.rs:388:5:388:17 | ExprStmt | variables.rs:388:5:388:13 | print_i64 | | -| variables.rs:388:15:388:15 | z | variables.rs:388:5:388:16 | CallExpr | | -| variables.rs:391:1:397:1 | enter alias | variables.rs:392:5:392:18 | LetStmt | | -| variables.rs:391:1:397:1 | exit alias (normal) | variables.rs:391:1:397:1 | exit alias | | -| variables.rs:391:12:397:1 | BlockExpr | variables.rs:391:1:397:1 | exit alias (normal) | | -| variables.rs:392:5:392:18 | LetStmt | variables.rs:392:17:392:17 | 1 | | -| variables.rs:392:9:392:13 | x | variables.rs:393:5:394:15 | LetStmt | match | +| variables.rs:388:15:388:15 | z | variables.rs:388:5:388:16 | print_i64(...) | | +| variables.rs:391:1:397:1 | enter fn alias | variables.rs:392:5:392:18 | let ... = 1 | | +| variables.rs:391:1:397:1 | exit fn alias (normal) | variables.rs:391:1:397:1 | exit fn alias | | +| variables.rs:391:12:397:1 | { ... } | variables.rs:391:1:397:1 | exit fn alias (normal) | | +| variables.rs:392:5:392:18 | let ... = 1 | variables.rs:392:17:392:17 | 1 | | +| variables.rs:392:9:392:13 | x | variables.rs:393:5:394:15 | let ... = ... | match | | variables.rs:392:17:392:17 | 1 | variables.rs:392:9:392:13 | x | | -| variables.rs:393:5:394:15 | LetStmt | variables.rs:394:14:394:14 | x | | +| variables.rs:393:5:394:15 | let ... = ... | variables.rs:394:14:394:14 | x | | | variables.rs:393:9:393:9 | y | variables.rs:395:5:395:11 | ExprStmt | match | -| variables.rs:394:9:394:14 | RefExpr | variables.rs:393:9:393:9 | y | | -| variables.rs:394:14:394:14 | x | variables.rs:394:9:394:14 | RefExpr | | +| variables.rs:394:9:394:14 | &mut x | variables.rs:393:9:393:9 | y | | +| variables.rs:394:14:394:14 | x | variables.rs:394:9:394:14 | &mut x | | | variables.rs:395:5:395:6 | * ... | variables.rs:395:10:395:10 | 2 | | | variables.rs:395:5:395:10 | ... = ... | variables.rs:396:5:396:17 | ExprStmt | | | variables.rs:395:5:395:11 | ExprStmt | variables.rs:395:6:395:6 | y | | | variables.rs:395:6:395:6 | y | variables.rs:395:5:395:6 | * ... | | | variables.rs:395:10:395:10 | 2 | variables.rs:395:5:395:10 | ... = ... | | | variables.rs:396:5:396:13 | print_i64 | variables.rs:396:15:396:15 | x | | -| variables.rs:396:5:396:16 | CallExpr | variables.rs:391:12:397:1 | BlockExpr | | +| variables.rs:396:5:396:16 | print_i64(...) | variables.rs:391:12:397:1 | { ... } | | | variables.rs:396:5:396:17 | ExprStmt | variables.rs:396:5:396:13 | print_i64 | | -| variables.rs:396:15:396:15 | x | variables.rs:396:5:396:16 | CallExpr | | -| variables.rs:399:1:407:1 | enter capture_immut | variables.rs:400:5:400:16 | LetStmt | | -| variables.rs:399:1:407:1 | exit capture_immut (normal) | variables.rs:399:1:407:1 | exit capture_immut | | -| variables.rs:399:20:407:1 | BlockExpr | variables.rs:399:1:407:1 | exit capture_immut (normal) | | -| variables.rs:400:5:400:16 | LetStmt | variables.rs:400:13:400:15 | 100 | | -| variables.rs:400:9:400:9 | x | variables.rs:402:5:404:6 | LetStmt | match | +| variables.rs:396:15:396:15 | x | variables.rs:396:5:396:16 | print_i64(...) | | +| variables.rs:399:1:407:1 | enter fn capture_immut | variables.rs:400:5:400:16 | let ... = 100 | | +| variables.rs:399:1:407:1 | exit fn capture_immut (normal) | variables.rs:399:1:407:1 | exit fn capture_immut | | +| variables.rs:399:20:407:1 | { ... } | variables.rs:399:1:407:1 | exit fn capture_immut (normal) | | +| variables.rs:400:5:400:16 | let ... = 100 | variables.rs:400:13:400:15 | 100 | | +| variables.rs:400:9:400:9 | x | variables.rs:402:5:404:6 | let ... = ... | match | | variables.rs:400:13:400:15 | 100 | variables.rs:400:9:400:9 | x | | -| variables.rs:402:5:404:6 | LetStmt | variables.rs:402:15:404:5 | ClosureExpr | | +| variables.rs:402:5:404:6 | let ... = ... | variables.rs:402:15:404:5 | \|...\| ... | | | variables.rs:402:9:402:11 | cap | variables.rs:405:5:405:10 | ExprStmt | match | -| variables.rs:402:15:404:5 | ClosureExpr | variables.rs:402:9:402:11 | cap | | -| variables.rs:402:15:404:5 | enter ClosureExpr | variables.rs:403:9:403:21 | ExprStmt | | -| variables.rs:402:15:404:5 | exit ClosureExpr (normal) | variables.rs:402:15:404:5 | exit ClosureExpr | | -| variables.rs:402:18:404:5 | BlockExpr | variables.rs:402:15:404:5 | exit ClosureExpr (normal) | | +| variables.rs:402:15:404:5 | \|...\| ... | variables.rs:402:9:402:11 | cap | | +| variables.rs:402:15:404:5 | enter \|...\| ... | variables.rs:403:9:403:21 | ExprStmt | | +| variables.rs:402:15:404:5 | exit \|...\| ... (normal) | variables.rs:402:15:404:5 | exit \|...\| ... | | +| variables.rs:402:18:404:5 | { ... } | variables.rs:402:15:404:5 | exit \|...\| ... (normal) | | | variables.rs:403:9:403:17 | print_i64 | variables.rs:403:19:403:19 | x | | -| variables.rs:403:9:403:20 | CallExpr | variables.rs:402:18:404:5 | BlockExpr | | +| variables.rs:403:9:403:20 | print_i64(...) | variables.rs:402:18:404:5 | { ... } | | | variables.rs:403:9:403:21 | ExprStmt | variables.rs:403:9:403:17 | print_i64 | | -| variables.rs:403:19:403:19 | x | variables.rs:403:9:403:20 | CallExpr | | -| variables.rs:405:5:405:7 | cap | variables.rs:405:5:405:9 | CallExpr | | -| variables.rs:405:5:405:9 | CallExpr | variables.rs:406:5:406:17 | ExprStmt | | +| variables.rs:403:19:403:19 | x | variables.rs:403:9:403:20 | print_i64(...) | | +| variables.rs:405:5:405:7 | cap | variables.rs:405:5:405:9 | cap(...) | | +| variables.rs:405:5:405:9 | cap(...) | variables.rs:406:5:406:17 | ExprStmt | | | variables.rs:405:5:405:10 | ExprStmt | variables.rs:405:5:405:7 | cap | | | variables.rs:406:5:406:13 | print_i64 | variables.rs:406:15:406:15 | x | | -| variables.rs:406:5:406:16 | CallExpr | variables.rs:399:20:407:1 | BlockExpr | | +| variables.rs:406:5:406:16 | print_i64(...) | variables.rs:399:20:407:1 | { ... } | | | variables.rs:406:5:406:17 | ExprStmt | variables.rs:406:5:406:13 | print_i64 | | -| variables.rs:406:15:406:15 | x | variables.rs:406:5:406:16 | CallExpr | | -| variables.rs:409:1:433:1 | enter capture_mut | variables.rs:410:5:410:18 | LetStmt | | -| variables.rs:409:1:433:1 | exit capture_mut (normal) | variables.rs:409:1:433:1 | exit capture_mut | | -| variables.rs:409:18:433:1 | BlockExpr | variables.rs:409:1:433:1 | exit capture_mut (normal) | | -| variables.rs:410:5:410:18 | LetStmt | variables.rs:410:17:410:17 | 1 | | -| variables.rs:410:9:410:13 | x | variables.rs:412:5:414:6 | LetStmt | match | +| variables.rs:406:15:406:15 | x | variables.rs:406:5:406:16 | print_i64(...) | | +| variables.rs:409:1:433:1 | enter fn capture_mut | variables.rs:410:5:410:18 | let ... = 1 | | +| variables.rs:409:1:433:1 | exit fn capture_mut (normal) | variables.rs:409:1:433:1 | exit fn capture_mut | | +| variables.rs:409:18:433:1 | { ... } | variables.rs:409:1:433:1 | exit fn capture_mut (normal) | | +| variables.rs:410:5:410:18 | let ... = 1 | variables.rs:410:17:410:17 | 1 | | +| variables.rs:410:9:410:13 | x | variables.rs:412:5:414:6 | let ... = ... | match | | variables.rs:410:17:410:17 | 1 | variables.rs:410:9:410:13 | x | | -| variables.rs:412:5:414:6 | LetStmt | variables.rs:412:20:414:5 | ClosureExpr | | +| variables.rs:412:5:414:6 | let ... = ... | variables.rs:412:20:414:5 | \|...\| ... | | | variables.rs:412:9:412:16 | closure1 | variables.rs:415:5:415:15 | ExprStmt | match | -| variables.rs:412:20:414:5 | ClosureExpr | variables.rs:412:9:412:16 | closure1 | | -| variables.rs:412:20:414:5 | enter ClosureExpr | variables.rs:413:9:413:21 | ExprStmt | | -| variables.rs:412:20:414:5 | exit ClosureExpr (normal) | variables.rs:412:20:414:5 | exit ClosureExpr | | -| variables.rs:412:23:414:5 | BlockExpr | variables.rs:412:20:414:5 | exit ClosureExpr (normal) | | +| variables.rs:412:20:414:5 | \|...\| ... | variables.rs:412:9:412:16 | closure1 | | +| variables.rs:412:20:414:5 | enter \|...\| ... | variables.rs:413:9:413:21 | ExprStmt | | +| variables.rs:412:20:414:5 | exit \|...\| ... (normal) | variables.rs:412:20:414:5 | exit \|...\| ... | | +| variables.rs:412:23:414:5 | { ... } | variables.rs:412:20:414:5 | exit \|...\| ... (normal) | | | variables.rs:413:9:413:17 | print_i64 | variables.rs:413:19:413:19 | x | | -| variables.rs:413:9:413:20 | CallExpr | variables.rs:412:23:414:5 | BlockExpr | | +| variables.rs:413:9:413:20 | print_i64(...) | variables.rs:412:23:414:5 | { ... } | | | variables.rs:413:9:413:21 | ExprStmt | variables.rs:413:9:413:17 | print_i64 | | -| variables.rs:413:19:413:19 | x | variables.rs:413:9:413:20 | CallExpr | | -| variables.rs:415:5:415:12 | closure1 | variables.rs:415:5:415:14 | CallExpr | | -| variables.rs:415:5:415:14 | CallExpr | variables.rs:416:5:416:17 | ExprStmt | | +| variables.rs:413:19:413:19 | x | variables.rs:413:9:413:20 | print_i64(...) | | +| variables.rs:415:5:415:12 | closure1 | variables.rs:415:5:415:14 | closure1(...) | | +| variables.rs:415:5:415:14 | closure1(...) | variables.rs:416:5:416:17 | ExprStmt | | | variables.rs:415:5:415:15 | ExprStmt | variables.rs:415:5:415:12 | closure1 | | | variables.rs:416:5:416:13 | print_i64 | variables.rs:416:15:416:15 | x | | -| variables.rs:416:5:416:16 | CallExpr | variables.rs:418:5:418:18 | LetStmt | | +| variables.rs:416:5:416:16 | print_i64(...) | variables.rs:418:5:418:18 | let ... = 2 | | | variables.rs:416:5:416:17 | ExprStmt | variables.rs:416:5:416:13 | print_i64 | | -| variables.rs:416:15:416:15 | x | variables.rs:416:5:416:16 | CallExpr | | -| variables.rs:418:5:418:18 | LetStmt | variables.rs:418:17:418:17 | 2 | | -| variables.rs:418:9:418:13 | y | variables.rs:420:5:422:6 | LetStmt | match | +| variables.rs:416:15:416:15 | x | variables.rs:416:5:416:16 | print_i64(...) | | +| variables.rs:418:5:418:18 | let ... = 2 | variables.rs:418:17:418:17 | 2 | | +| variables.rs:418:9:418:13 | y | variables.rs:420:5:422:6 | let ... = ... | match | | variables.rs:418:17:418:17 | 2 | variables.rs:418:9:418:13 | y | | -| variables.rs:420:5:422:6 | LetStmt | variables.rs:420:24:422:5 | ClosureExpr | | +| variables.rs:420:5:422:6 | let ... = ... | variables.rs:420:24:422:5 | \|...\| ... | | | variables.rs:420:9:420:20 | closure2 | variables.rs:423:5:423:15 | ExprStmt | match | -| variables.rs:420:24:422:5 | ClosureExpr | variables.rs:420:9:420:20 | closure2 | | -| variables.rs:420:24:422:5 | enter ClosureExpr | variables.rs:421:9:421:14 | ExprStmt | | -| variables.rs:420:24:422:5 | exit ClosureExpr (normal) | variables.rs:420:24:422:5 | exit ClosureExpr | | -| variables.rs:420:27:422:5 | BlockExpr | variables.rs:420:24:422:5 | exit ClosureExpr (normal) | | +| variables.rs:420:24:422:5 | \|...\| ... | variables.rs:420:9:420:20 | closure2 | | +| variables.rs:420:24:422:5 | enter \|...\| ... | variables.rs:421:9:421:14 | ExprStmt | | +| variables.rs:420:24:422:5 | exit \|...\| ... (normal) | variables.rs:420:24:422:5 | exit \|...\| ... | | +| variables.rs:420:27:422:5 | { ... } | variables.rs:420:24:422:5 | exit \|...\| ... (normal) | | | variables.rs:421:9:421:9 | y | variables.rs:421:13:421:13 | 3 | | -| variables.rs:421:9:421:13 | ... = ... | variables.rs:420:27:422:5 | BlockExpr | | +| variables.rs:421:9:421:13 | ... = ... | variables.rs:420:27:422:5 | { ... } | | | variables.rs:421:9:421:14 | ExprStmt | variables.rs:421:9:421:9 | y | | | variables.rs:421:13:421:13 | 3 | variables.rs:421:9:421:13 | ... = ... | | -| variables.rs:423:5:423:12 | closure2 | variables.rs:423:5:423:14 | CallExpr | | -| variables.rs:423:5:423:14 | CallExpr | variables.rs:424:5:424:17 | ExprStmt | | +| variables.rs:423:5:423:12 | closure2 | variables.rs:423:5:423:14 | closure2(...) | | +| variables.rs:423:5:423:14 | closure2(...) | variables.rs:424:5:424:17 | ExprStmt | | | variables.rs:423:5:423:15 | ExprStmt | variables.rs:423:5:423:12 | closure2 | | | variables.rs:424:5:424:13 | print_i64 | variables.rs:424:15:424:15 | y | | -| variables.rs:424:5:424:16 | CallExpr | variables.rs:426:5:426:18 | LetStmt | | +| variables.rs:424:5:424:16 | print_i64(...) | variables.rs:426:5:426:18 | let ... = 2 | | | variables.rs:424:5:424:17 | ExprStmt | variables.rs:424:5:424:13 | print_i64 | | -| variables.rs:424:15:424:15 | y | variables.rs:424:5:424:16 | CallExpr | | -| variables.rs:426:5:426:18 | LetStmt | variables.rs:426:17:426:17 | 2 | | -| variables.rs:426:9:426:13 | z | variables.rs:428:5:430:6 | LetStmt | match | +| variables.rs:424:15:424:15 | y | variables.rs:424:5:424:16 | print_i64(...) | | +| variables.rs:426:5:426:18 | let ... = 2 | variables.rs:426:17:426:17 | 2 | | +| variables.rs:426:9:426:13 | z | variables.rs:428:5:430:6 | let ... = ... | match | | variables.rs:426:17:426:17 | 2 | variables.rs:426:9:426:13 | z | | -| variables.rs:428:5:430:6 | LetStmt | variables.rs:428:24:430:5 | ClosureExpr | | +| variables.rs:428:5:430:6 | let ... = ... | variables.rs:428:24:430:5 | \|...\| ... | | | variables.rs:428:9:428:20 | closure3 | variables.rs:431:5:431:15 | ExprStmt | match | -| variables.rs:428:24:430:5 | ClosureExpr | variables.rs:428:9:428:20 | closure3 | | -| variables.rs:428:24:430:5 | enter ClosureExpr | variables.rs:429:9:429:24 | ExprStmt | | -| variables.rs:428:24:430:5 | exit ClosureExpr (normal) | variables.rs:428:24:430:5 | exit ClosureExpr | | -| variables.rs:428:27:430:5 | BlockExpr | variables.rs:428:24:430:5 | exit ClosureExpr (normal) | | +| variables.rs:428:24:430:5 | \|...\| ... | variables.rs:428:9:428:20 | closure3 | | +| variables.rs:428:24:430:5 | enter \|...\| ... | variables.rs:429:9:429:24 | ExprStmt | | +| variables.rs:428:24:430:5 | exit \|...\| ... (normal) | variables.rs:428:24:430:5 | exit \|...\| ... | | +| variables.rs:428:27:430:5 | { ... } | variables.rs:428:24:430:5 | exit \|...\| ... (normal) | | | variables.rs:429:9:429:9 | z | variables.rs:429:22:429:22 | 1 | | -| variables.rs:429:9:429:23 | ... .add_assign(...) | variables.rs:428:27:430:5 | BlockExpr | | +| variables.rs:429:9:429:23 | ... .add_assign(...) | variables.rs:428:27:430:5 | { ... } | | | variables.rs:429:9:429:24 | ExprStmt | variables.rs:429:9:429:9 | z | | | variables.rs:429:22:429:22 | 1 | variables.rs:429:9:429:23 | ... .add_assign(...) | | -| variables.rs:431:5:431:12 | closure3 | variables.rs:431:5:431:14 | CallExpr | | -| variables.rs:431:5:431:14 | CallExpr | variables.rs:432:5:432:17 | ExprStmt | | +| variables.rs:431:5:431:12 | closure3 | variables.rs:431:5:431:14 | closure3(...) | | +| variables.rs:431:5:431:14 | closure3(...) | variables.rs:432:5:432:17 | ExprStmt | | | variables.rs:431:5:431:15 | ExprStmt | variables.rs:431:5:431:12 | closure3 | | | variables.rs:432:5:432:13 | print_i64 | variables.rs:432:15:432:15 | z | | -| variables.rs:432:5:432:16 | CallExpr | variables.rs:409:18:433:1 | BlockExpr | | +| variables.rs:432:5:432:16 | print_i64(...) | variables.rs:409:18:433:1 | { ... } | | | variables.rs:432:5:432:17 | ExprStmt | variables.rs:432:5:432:13 | print_i64 | | -| variables.rs:432:15:432:15 | z | variables.rs:432:5:432:16 | CallExpr | | -| variables.rs:435:1:443:1 | enter async_block_capture | variables.rs:436:5:436:23 | LetStmt | | -| variables.rs:435:1:443:1 | exit async_block_capture (normal) | variables.rs:435:1:443:1 | exit async_block_capture | | -| variables.rs:435:32:443:1 | BlockExpr | variables.rs:435:1:443:1 | exit async_block_capture (normal) | | -| variables.rs:436:5:436:23 | LetStmt | variables.rs:436:22:436:22 | 0 | | -| variables.rs:436:9:436:13 | i | variables.rs:437:5:439:6 | LetStmt | match | +| variables.rs:432:15:432:15 | z | variables.rs:432:5:432:16 | print_i64(...) | | +| variables.rs:435:1:443:1 | enter fn async_block_capture | variables.rs:436:5:436:23 | let ... = 0 | | +| variables.rs:435:1:443:1 | exit fn async_block_capture (normal) | variables.rs:435:1:443:1 | exit fn async_block_capture | | +| variables.rs:435:32:443:1 | { ... } | variables.rs:435:1:443:1 | exit fn async_block_capture (normal) | | +| variables.rs:436:5:436:23 | let ... = 0 | variables.rs:436:22:436:22 | 0 | | +| variables.rs:436:9:436:13 | i | variables.rs:437:5:439:6 | let ... = ... | match | | variables.rs:436:22:436:22 | 0 | variables.rs:436:9:436:13 | i | | -| variables.rs:437:5:439:6 | LetStmt | variables.rs:437:17:439:5 | BlockExpr | | +| variables.rs:437:5:439:6 | let ... = ... | variables.rs:437:17:439:5 | { ... } | | | variables.rs:437:9:437:13 | block | variables.rs:441:5:441:16 | ExprStmt | match | -| variables.rs:437:17:439:5 | BlockExpr | variables.rs:437:9:437:13 | block | | -| variables.rs:437:17:439:5 | enter BlockExpr | variables.rs:438:9:438:14 | ExprStmt | | -| variables.rs:437:17:439:5 | exit BlockExpr (normal) | variables.rs:437:17:439:5 | exit BlockExpr | | +| variables.rs:437:17:439:5 | enter { ... } | variables.rs:438:9:438:14 | ExprStmt | | +| variables.rs:437:17:439:5 | exit { ... } (normal) | variables.rs:437:17:439:5 | exit { ... } | | +| variables.rs:437:17:439:5 | { ... } | variables.rs:437:9:437:13 | block | | | variables.rs:438:9:438:9 | i | variables.rs:438:13:438:13 | 1 | | -| variables.rs:438:9:438:13 | ... = ... | variables.rs:437:17:439:5 | exit BlockExpr (normal) | | +| variables.rs:438:9:438:13 | ... = ... | variables.rs:437:17:439:5 | exit { ... } (normal) | | | variables.rs:438:9:438:14 | ExprStmt | variables.rs:438:9:438:9 | i | | | variables.rs:438:13:438:13 | 1 | variables.rs:438:9:438:13 | ... = ... | | -| variables.rs:441:5:441:9 | block | variables.rs:441:5:441:15 | AwaitExpr | | -| variables.rs:441:5:441:15 | AwaitExpr | variables.rs:442:5:442:17 | ExprStmt | | +| variables.rs:441:5:441:9 | block | variables.rs:441:5:441:15 | await block | | +| variables.rs:441:5:441:15 | await block | variables.rs:442:5:442:17 | ExprStmt | | | variables.rs:441:5:441:16 | ExprStmt | variables.rs:441:5:441:9 | block | | | variables.rs:442:5:442:13 | print_i64 | variables.rs:442:15:442:15 | i | | -| variables.rs:442:5:442:16 | CallExpr | variables.rs:435:32:443:1 | BlockExpr | | +| variables.rs:442:5:442:16 | print_i64(...) | variables.rs:435:32:443:1 | { ... } | | | variables.rs:442:5:442:17 | ExprStmt | variables.rs:442:5:442:13 | print_i64 | | -| variables.rs:442:15:442:15 | i | variables.rs:442:5:442:16 | CallExpr | | -| variables.rs:445:1:459:1 | enter phi | variables.rs:445:8:445:8 | b | | -| variables.rs:445:1:459:1 | exit phi (normal) | variables.rs:445:1:459:1 | exit phi | | -| variables.rs:445:8:445:8 | b | variables.rs:445:8:445:15 | Param | match | -| variables.rs:445:8:445:15 | Param | variables.rs:446:5:446:18 | LetStmt | | -| variables.rs:445:18:459:1 | BlockExpr | variables.rs:445:1:459:1 | exit phi (normal) | | -| variables.rs:446:5:446:18 | LetStmt | variables.rs:446:17:446:17 | 1 | | +| variables.rs:442:15:442:15 | i | variables.rs:442:5:442:16 | print_i64(...) | | +| variables.rs:445:1:459:1 | enter fn phi | variables.rs:445:8:445:8 | b | | +| variables.rs:445:1:459:1 | exit fn phi (normal) | variables.rs:445:1:459:1 | exit fn phi | | +| variables.rs:445:8:445:8 | b | variables.rs:445:8:445:15 | ...: bool | match | +| variables.rs:445:8:445:15 | ...: bool | variables.rs:446:5:446:18 | let ... = 1 | | +| variables.rs:445:18:459:1 | { ... } | variables.rs:445:1:459:1 | exit fn phi (normal) | | +| variables.rs:446:5:446:18 | let ... = 1 | variables.rs:446:17:446:17 | 1 | | | variables.rs:446:9:446:13 | x | variables.rs:447:5:447:17 | ExprStmt | match | | variables.rs:446:17:446:17 | 1 | variables.rs:446:9:446:13 | x | | | variables.rs:447:5:447:13 | print_i64 | variables.rs:447:15:447:15 | x | | -| variables.rs:447:5:447:16 | CallExpr | variables.rs:448:5:448:21 | ExprStmt | | +| variables.rs:447:5:447:16 | print_i64(...) | variables.rs:448:5:448:21 | ExprStmt | | | variables.rs:447:5:447:17 | ExprStmt | variables.rs:447:5:447:13 | print_i64 | | -| variables.rs:447:15:447:15 | x | variables.rs:447:5:447:16 | CallExpr | | +| variables.rs:447:15:447:15 | x | variables.rs:447:5:447:16 | print_i64(...) | | | variables.rs:448:5:448:13 | print_i64 | variables.rs:448:15:448:15 | x | | -| variables.rs:448:5:448:20 | CallExpr | variables.rs:449:5:457:5 | ExprStmt | | +| variables.rs:448:5:448:20 | print_i64(...) | variables.rs:449:5:457:5 | ExprStmt | | | variables.rs:448:5:448:21 | ExprStmt | variables.rs:448:5:448:13 | print_i64 | | | variables.rs:448:15:448:15 | x | variables.rs:448:19:448:19 | 1 | | -| variables.rs:448:15:448:19 | ... + ... | variables.rs:448:5:448:20 | CallExpr | | +| variables.rs:448:15:448:19 | ... + ... | variables.rs:448:5:448:20 | print_i64(...) | | | variables.rs:448:19:448:19 | 1 | variables.rs:448:15:448:19 | ... + ... | | | variables.rs:449:5:457:5 | ExprStmt | variables.rs:449:8:449:8 | b | | -| variables.rs:449:5:457:5 | IfExpr | variables.rs:458:5:458:17 | ExprStmt | | +| variables.rs:449:5:457:5 | if b {...} else {...} | variables.rs:458:5:458:17 | ExprStmt | | | variables.rs:449:8:449:8 | b | variables.rs:450:9:450:14 | ExprStmt | true | | variables.rs:449:8:449:8 | b | variables.rs:454:9:454:14 | ExprStmt | false | -| variables.rs:449:10:453:5 | BlockExpr | variables.rs:449:5:457:5 | IfExpr | | +| variables.rs:449:10:453:5 | { ... } | variables.rs:449:5:457:5 | if b {...} else {...} | | | variables.rs:450:9:450:9 | x | variables.rs:450:13:450:13 | 2 | | | variables.rs:450:9:450:13 | ... = ... | variables.rs:451:9:451:21 | ExprStmt | | | variables.rs:450:9:450:14 | ExprStmt | variables.rs:450:9:450:9 | x | | | variables.rs:450:13:450:13 | 2 | variables.rs:450:9:450:13 | ... = ... | | | variables.rs:451:9:451:17 | print_i64 | variables.rs:451:19:451:19 | x | | -| variables.rs:451:9:451:20 | CallExpr | variables.rs:452:9:452:25 | ExprStmt | | +| variables.rs:451:9:451:20 | print_i64(...) | variables.rs:452:9:452:25 | ExprStmt | | | variables.rs:451:9:451:21 | ExprStmt | variables.rs:451:9:451:17 | print_i64 | | -| variables.rs:451:19:451:19 | x | variables.rs:451:9:451:20 | CallExpr | | +| variables.rs:451:19:451:19 | x | variables.rs:451:9:451:20 | print_i64(...) | | | variables.rs:452:9:452:17 | print_i64 | variables.rs:452:19:452:19 | x | | -| variables.rs:452:9:452:24 | CallExpr | variables.rs:449:10:453:5 | BlockExpr | | +| variables.rs:452:9:452:24 | print_i64(...) | variables.rs:449:10:453:5 | { ... } | | | variables.rs:452:9:452:25 | ExprStmt | variables.rs:452:9:452:17 | print_i64 | | | variables.rs:452:19:452:19 | x | variables.rs:452:23:452:23 | 1 | | -| variables.rs:452:19:452:23 | ... + ... | variables.rs:452:9:452:24 | CallExpr | | +| variables.rs:452:19:452:23 | ... + ... | variables.rs:452:9:452:24 | print_i64(...) | | | variables.rs:452:23:452:23 | 1 | variables.rs:452:19:452:23 | ... + ... | | -| variables.rs:453:12:457:5 | BlockExpr | variables.rs:449:5:457:5 | IfExpr | | +| variables.rs:453:12:457:5 | { ... } | variables.rs:449:5:457:5 | if b {...} else {...} | | | variables.rs:454:9:454:9 | x | variables.rs:454:13:454:13 | 3 | | | variables.rs:454:9:454:13 | ... = ... | variables.rs:455:9:455:21 | ExprStmt | | | variables.rs:454:9:454:14 | ExprStmt | variables.rs:454:9:454:9 | x | | | variables.rs:454:13:454:13 | 3 | variables.rs:454:9:454:13 | ... = ... | | | variables.rs:455:9:455:17 | print_i64 | variables.rs:455:19:455:19 | x | | -| variables.rs:455:9:455:20 | CallExpr | variables.rs:456:9:456:25 | ExprStmt | | +| variables.rs:455:9:455:20 | print_i64(...) | variables.rs:456:9:456:25 | ExprStmt | | | variables.rs:455:9:455:21 | ExprStmt | variables.rs:455:9:455:17 | print_i64 | | -| variables.rs:455:19:455:19 | x | variables.rs:455:9:455:20 | CallExpr | | +| variables.rs:455:19:455:19 | x | variables.rs:455:9:455:20 | print_i64(...) | | | variables.rs:456:9:456:17 | print_i64 | variables.rs:456:19:456:19 | x | | -| variables.rs:456:9:456:24 | CallExpr | variables.rs:453:12:457:5 | BlockExpr | | +| variables.rs:456:9:456:24 | print_i64(...) | variables.rs:453:12:457:5 | { ... } | | | variables.rs:456:9:456:25 | ExprStmt | variables.rs:456:9:456:17 | print_i64 | | | variables.rs:456:19:456:19 | x | variables.rs:456:23:456:23 | 1 | | -| variables.rs:456:19:456:23 | ... + ... | variables.rs:456:9:456:24 | CallExpr | | +| variables.rs:456:19:456:23 | ... + ... | variables.rs:456:9:456:24 | print_i64(...) | | | variables.rs:456:23:456:23 | 1 | variables.rs:456:19:456:23 | ... + ... | | | variables.rs:458:5:458:13 | print_i64 | variables.rs:458:15:458:15 | x | | -| variables.rs:458:5:458:16 | CallExpr | variables.rs:445:18:459:1 | BlockExpr | | +| variables.rs:458:5:458:16 | print_i64(...) | variables.rs:445:18:459:1 | { ... } | | | variables.rs:458:5:458:17 | ExprStmt | variables.rs:458:5:458:13 | print_i64 | | -| variables.rs:458:15:458:15 | x | variables.rs:458:5:458:16 | CallExpr | | -| variables.rs:461:1:474:1 | enter phi_read | variables.rs:461:13:461:14 | b1 | | -| variables.rs:461:1:474:1 | exit phi_read (normal) | variables.rs:461:1:474:1 | exit phi_read | | -| variables.rs:461:13:461:14 | b1 | variables.rs:461:13:461:21 | Param | match | -| variables.rs:461:13:461:21 | Param | variables.rs:461:24:461:25 | b2 | | -| variables.rs:461:24:461:25 | b2 | variables.rs:461:24:461:32 | Param | match | -| variables.rs:461:24:461:32 | Param | variables.rs:462:5:462:14 | LetStmt | | -| variables.rs:461:35:474:1 | BlockExpr | variables.rs:461:1:474:1 | exit phi_read (normal) | | -| variables.rs:462:5:462:14 | LetStmt | variables.rs:462:13:462:13 | 1 | | +| variables.rs:458:15:458:15 | x | variables.rs:458:5:458:16 | print_i64(...) | | +| variables.rs:461:1:474:1 | enter fn phi_read | variables.rs:461:13:461:14 | b1 | | +| variables.rs:461:1:474:1 | exit fn phi_read (normal) | variables.rs:461:1:474:1 | exit fn phi_read | | +| variables.rs:461:13:461:14 | b1 | variables.rs:461:13:461:21 | ...: bool | match | +| variables.rs:461:13:461:21 | ...: bool | variables.rs:461:24:461:25 | b2 | | +| variables.rs:461:24:461:25 | b2 | variables.rs:461:24:461:32 | ...: bool | match | +| variables.rs:461:24:461:32 | ...: bool | variables.rs:462:5:462:14 | let ... = 1 | | +| variables.rs:461:35:474:1 | { ... } | variables.rs:461:1:474:1 | exit fn phi_read (normal) | | +| variables.rs:462:5:462:14 | let ... = 1 | variables.rs:462:13:462:13 | 1 | | | variables.rs:462:9:462:9 | x | variables.rs:463:5:467:5 | ExprStmt | match | | variables.rs:462:13:462:13 | 1 | variables.rs:462:9:462:9 | x | | | variables.rs:463:5:467:5 | ExprStmt | variables.rs:463:8:463:9 | b1 | | -| variables.rs:463:5:467:5 | IfExpr | variables.rs:469:8:469:9 | b2 | | +| variables.rs:463:5:467:5 | if b1 {...} else {...} | variables.rs:469:8:469:9 | b2 | | | variables.rs:463:8:463:9 | b1 | variables.rs:464:9:464:21 | ExprStmt | true | | variables.rs:463:8:463:9 | b1 | variables.rs:466:9:466:21 | ExprStmt | false | -| variables.rs:463:11:465:5 | BlockExpr | variables.rs:463:5:467:5 | IfExpr | | +| variables.rs:463:11:465:5 | { ... } | variables.rs:463:5:467:5 | if b1 {...} else {...} | | | variables.rs:464:9:464:17 | print_i64 | variables.rs:464:19:464:19 | x | | -| variables.rs:464:9:464:20 | CallExpr | variables.rs:463:11:465:5 | BlockExpr | | +| variables.rs:464:9:464:20 | print_i64(...) | variables.rs:463:11:465:5 | { ... } | | | variables.rs:464:9:464:21 | ExprStmt | variables.rs:464:9:464:17 | print_i64 | | -| variables.rs:464:19:464:19 | x | variables.rs:464:9:464:20 | CallExpr | | -| variables.rs:465:12:467:5 | BlockExpr | variables.rs:463:5:467:5 | IfExpr | | +| variables.rs:464:19:464:19 | x | variables.rs:464:9:464:20 | print_i64(...) | | +| variables.rs:465:12:467:5 | { ... } | variables.rs:463:5:467:5 | if b1 {...} else {...} | | | variables.rs:466:9:466:17 | print_i64 | variables.rs:466:19:466:19 | x | | -| variables.rs:466:9:466:20 | CallExpr | variables.rs:465:12:467:5 | BlockExpr | | +| variables.rs:466:9:466:20 | print_i64(...) | variables.rs:465:12:467:5 | { ... } | | | variables.rs:466:9:466:21 | ExprStmt | variables.rs:466:9:466:17 | print_i64 | | -| variables.rs:466:19:466:19 | x | variables.rs:466:9:466:20 | CallExpr | | -| variables.rs:469:5:473:5 | IfExpr | variables.rs:461:35:474:1 | BlockExpr | | +| variables.rs:466:19:466:19 | x | variables.rs:466:9:466:20 | print_i64(...) | | +| variables.rs:469:5:473:5 | if b2 {...} else {...} | variables.rs:461:35:474:1 | { ... } | | | variables.rs:469:8:469:9 | b2 | variables.rs:470:9:470:21 | ExprStmt | true | | variables.rs:469:8:469:9 | b2 | variables.rs:472:9:472:21 | ExprStmt | false | -| variables.rs:469:11:471:5 | BlockExpr | variables.rs:469:5:473:5 | IfExpr | | +| variables.rs:469:11:471:5 | { ... } | variables.rs:469:5:473:5 | if b2 {...} else {...} | | | variables.rs:470:9:470:17 | print_i64 | variables.rs:470:19:470:19 | x | | -| variables.rs:470:9:470:20 | CallExpr | variables.rs:469:11:471:5 | BlockExpr | | +| variables.rs:470:9:470:20 | print_i64(...) | variables.rs:469:11:471:5 | { ... } | | | variables.rs:470:9:470:21 | ExprStmt | variables.rs:470:9:470:17 | print_i64 | | -| variables.rs:470:19:470:19 | x | variables.rs:470:9:470:20 | CallExpr | | -| variables.rs:471:12:473:5 | BlockExpr | variables.rs:469:5:473:5 | IfExpr | | +| variables.rs:470:19:470:19 | x | variables.rs:470:9:470:20 | print_i64(...) | | +| variables.rs:471:12:473:5 | { ... } | variables.rs:469:5:473:5 | if b2 {...} else {...} | | | variables.rs:472:9:472:17 | print_i64 | variables.rs:472:19:472:19 | x | | -| variables.rs:472:9:472:20 | CallExpr | variables.rs:471:12:473:5 | BlockExpr | | +| variables.rs:472:9:472:20 | print_i64(...) | variables.rs:471:12:473:5 | { ... } | | | variables.rs:472:9:472:21 | ExprStmt | variables.rs:472:9:472:17 | print_i64 | | -| variables.rs:472:19:472:19 | x | variables.rs:472:9:472:20 | CallExpr | | -| variables.rs:482:5:484:5 | enter my_get | variables.rs:482:20:482:23 | self | | -| variables.rs:482:5:484:5 | exit my_get (normal) | variables.rs:482:5:484:5 | exit my_get | | +| variables.rs:472:19:472:19 | x | variables.rs:472:9:472:20 | print_i64(...) | | +| variables.rs:482:5:484:5 | enter fn my_get | variables.rs:482:20:482:23 | self | | +| variables.rs:482:5:484:5 | exit fn my_get (normal) | variables.rs:482:5:484:5 | exit fn my_get | | | variables.rs:482:15:482:23 | SelfParam | variables.rs:483:9:483:24 | ExprStmt | | | variables.rs:482:20:482:23 | self | variables.rs:482:15:482:23 | SelfParam | | -| variables.rs:483:9:483:23 | ReturnExpr | variables.rs:482:5:484:5 | exit my_get (normal) | return | +| variables.rs:483:9:483:23 | return ... | variables.rs:482:5:484:5 | exit fn my_get (normal) | return | | variables.rs:483:9:483:24 | ExprStmt | variables.rs:483:16:483:19 | self | | -| variables.rs:483:16:483:19 | self | variables.rs:483:16:483:23 | FieldExpr | | -| variables.rs:483:16:483:23 | FieldExpr | variables.rs:483:9:483:23 | ReturnExpr | | -| variables.rs:487:1:494:1 | enter structs | variables.rs:488:5:488:36 | LetStmt | | -| variables.rs:487:1:494:1 | exit structs (normal) | variables.rs:487:1:494:1 | exit structs | | -| variables.rs:487:14:494:1 | BlockExpr | variables.rs:487:1:494:1 | exit structs (normal) | | -| variables.rs:488:5:488:36 | LetStmt | variables.rs:488:33:488:33 | 1 | | +| variables.rs:483:16:483:19 | self | variables.rs:483:16:483:23 | self.val | | +| variables.rs:483:16:483:23 | self.val | variables.rs:483:9:483:23 | return ... | | +| variables.rs:487:1:494:1 | enter fn structs | variables.rs:488:5:488:36 | let ... = ... | | +| variables.rs:487:1:494:1 | exit fn structs (normal) | variables.rs:487:1:494:1 | exit fn structs | | +| variables.rs:487:14:494:1 | { ... } | variables.rs:487:1:494:1 | exit fn structs (normal) | | +| variables.rs:488:5:488:36 | let ... = ... | variables.rs:488:33:488:33 | 1 | | | variables.rs:488:9:488:13 | a | variables.rs:489:5:489:26 | ExprStmt | match | -| variables.rs:488:17:488:35 | RecordExpr | variables.rs:488:9:488:13 | a | | -| variables.rs:488:33:488:33 | 1 | variables.rs:488:17:488:35 | RecordExpr | | +| variables.rs:488:17:488:35 | MyStruct {...} | variables.rs:488:9:488:13 | a | | +| variables.rs:488:33:488:33 | 1 | variables.rs:488:17:488:35 | MyStruct {...} | | | variables.rs:489:5:489:13 | print_i64 | variables.rs:489:15:489:15 | a | | -| variables.rs:489:5:489:25 | CallExpr | variables.rs:490:5:490:14 | ExprStmt | | +| variables.rs:489:5:489:25 | print_i64(...) | variables.rs:490:5:490:14 | ExprStmt | | | variables.rs:489:5:489:26 | ExprStmt | variables.rs:489:5:489:13 | print_i64 | | | variables.rs:489:15:489:15 | a | variables.rs:489:15:489:24 | ... .my_get(...) | | -| variables.rs:489:15:489:24 | ... .my_get(...) | variables.rs:489:5:489:25 | CallExpr | | -| variables.rs:490:5:490:5 | a | variables.rs:490:5:490:9 | FieldExpr | | -| variables.rs:490:5:490:9 | FieldExpr | variables.rs:490:13:490:13 | 5 | | +| variables.rs:489:15:489:24 | ... .my_get(...) | variables.rs:489:5:489:25 | print_i64(...) | | +| variables.rs:490:5:490:5 | a | variables.rs:490:5:490:9 | a.val | | +| variables.rs:490:5:490:9 | a.val | variables.rs:490:13:490:13 | 5 | | | variables.rs:490:5:490:13 | ... = ... | variables.rs:491:5:491:26 | ExprStmt | | | variables.rs:490:5:490:14 | ExprStmt | variables.rs:490:5:490:5 | a | | | variables.rs:490:13:490:13 | 5 | variables.rs:490:5:490:13 | ... = ... | | | variables.rs:491:5:491:13 | print_i64 | variables.rs:491:15:491:15 | a | | -| variables.rs:491:5:491:25 | CallExpr | variables.rs:492:5:492:28 | ExprStmt | | +| variables.rs:491:5:491:25 | print_i64(...) | variables.rs:492:5:492:28 | ExprStmt | | | variables.rs:491:5:491:26 | ExprStmt | variables.rs:491:5:491:13 | print_i64 | | | variables.rs:491:15:491:15 | a | variables.rs:491:15:491:24 | ... .my_get(...) | | -| variables.rs:491:15:491:24 | ... .my_get(...) | variables.rs:491:5:491:25 | CallExpr | | +| variables.rs:491:15:491:24 | ... .my_get(...) | variables.rs:491:5:491:25 | print_i64(...) | | | variables.rs:492:5:492:5 | a | variables.rs:492:25:492:25 | 2 | | | variables.rs:492:5:492:27 | ... = ... | variables.rs:493:5:493:26 | ExprStmt | | | variables.rs:492:5:492:28 | ExprStmt | variables.rs:492:5:492:5 | a | | -| variables.rs:492:9:492:27 | RecordExpr | variables.rs:492:5:492:27 | ... = ... | | -| variables.rs:492:25:492:25 | 2 | variables.rs:492:9:492:27 | RecordExpr | | +| variables.rs:492:9:492:27 | MyStruct {...} | variables.rs:492:5:492:27 | ... = ... | | +| variables.rs:492:25:492:25 | 2 | variables.rs:492:9:492:27 | MyStruct {...} | | | variables.rs:493:5:493:13 | print_i64 | variables.rs:493:15:493:15 | a | | -| variables.rs:493:5:493:25 | CallExpr | variables.rs:487:14:494:1 | BlockExpr | | +| variables.rs:493:5:493:25 | print_i64(...) | variables.rs:487:14:494:1 | { ... } | | | variables.rs:493:5:493:26 | ExprStmt | variables.rs:493:5:493:13 | print_i64 | | | variables.rs:493:15:493:15 | a | variables.rs:493:15:493:24 | ... .my_get(...) | | -| variables.rs:493:15:493:24 | ... .my_get(...) | variables.rs:493:5:493:25 | CallExpr | | -| variables.rs:496:1:503:1 | enter ref_arg | variables.rs:497:5:497:15 | LetStmt | | -| variables.rs:496:1:503:1 | exit ref_arg (normal) | variables.rs:496:1:503:1 | exit ref_arg | | -| variables.rs:496:14:503:1 | BlockExpr | variables.rs:496:1:503:1 | exit ref_arg (normal) | | -| variables.rs:497:5:497:15 | LetStmt | variables.rs:497:13:497:14 | 16 | | +| variables.rs:493:15:493:24 | ... .my_get(...) | variables.rs:493:5:493:25 | print_i64(...) | | +| variables.rs:496:1:503:1 | enter fn ref_arg | variables.rs:497:5:497:15 | let ... = 16 | | +| variables.rs:496:1:503:1 | exit fn ref_arg (normal) | variables.rs:496:1:503:1 | exit fn ref_arg | | +| variables.rs:496:14:503:1 | { ... } | variables.rs:496:1:503:1 | exit fn ref_arg (normal) | | +| variables.rs:497:5:497:15 | let ... = 16 | variables.rs:497:13:497:14 | 16 | | | variables.rs:497:9:497:9 | x | variables.rs:498:5:498:22 | ExprStmt | match | | variables.rs:497:13:497:14 | 16 | variables.rs:497:9:497:9 | x | | | variables.rs:498:5:498:17 | print_i64_ref | variables.rs:498:20:498:20 | x | | -| variables.rs:498:5:498:21 | CallExpr | variables.rs:499:5:499:17 | ExprStmt | | +| variables.rs:498:5:498:21 | print_i64_ref(...) | variables.rs:499:5:499:17 | ExprStmt | | | variables.rs:498:5:498:22 | ExprStmt | variables.rs:498:5:498:17 | print_i64_ref | | -| variables.rs:498:19:498:20 | RefExpr | variables.rs:498:5:498:21 | CallExpr | | -| variables.rs:498:20:498:20 | x | variables.rs:498:19:498:20 | RefExpr | | +| variables.rs:498:19:498:20 | &x | variables.rs:498:5:498:21 | print_i64_ref(...) | | +| variables.rs:498:20:498:20 | x | variables.rs:498:19:498:20 | &x | | | variables.rs:499:5:499:13 | print_i64 | variables.rs:499:15:499:15 | x | | -| variables.rs:499:5:499:16 | CallExpr | variables.rs:501:5:501:15 | LetStmt | | +| variables.rs:499:5:499:16 | print_i64(...) | variables.rs:501:5:501:15 | let ... = 17 | | | variables.rs:499:5:499:17 | ExprStmt | variables.rs:499:5:499:13 | print_i64 | | -| variables.rs:499:15:499:15 | x | variables.rs:499:5:499:16 | CallExpr | | -| variables.rs:501:5:501:15 | LetStmt | variables.rs:501:13:501:14 | 17 | | +| variables.rs:499:15:499:15 | x | variables.rs:499:5:499:16 | print_i64(...) | | +| variables.rs:501:5:501:15 | let ... = 17 | variables.rs:501:13:501:14 | 17 | | | variables.rs:501:9:501:9 | z | variables.rs:502:5:502:22 | ExprStmt | match | | variables.rs:501:13:501:14 | 17 | variables.rs:501:9:501:9 | z | | | variables.rs:502:5:502:17 | print_i64_ref | variables.rs:502:20:502:20 | z | | -| variables.rs:502:5:502:21 | CallExpr | variables.rs:496:14:503:1 | BlockExpr | | +| variables.rs:502:5:502:21 | print_i64_ref(...) | variables.rs:496:14:503:1 | { ... } | | | variables.rs:502:5:502:22 | ExprStmt | variables.rs:502:5:502:17 | print_i64_ref | | -| variables.rs:502:19:502:20 | RefExpr | variables.rs:502:5:502:21 | CallExpr | | -| variables.rs:502:20:502:20 | z | variables.rs:502:19:502:20 | RefExpr | | -| variables.rs:510:3:512:3 | enter bar | variables.rs:510:15:510:18 | self | | -| variables.rs:510:3:512:3 | exit bar (normal) | variables.rs:510:3:512:3 | exit bar | | +| variables.rs:502:19:502:20 | &z | variables.rs:502:5:502:21 | print_i64_ref(...) | | +| variables.rs:502:20:502:20 | z | variables.rs:502:19:502:20 | &z | | +| variables.rs:510:3:512:3 | enter fn bar | variables.rs:510:15:510:18 | self | | +| variables.rs:510:3:512:3 | exit fn bar (normal) | variables.rs:510:3:512:3 | exit fn bar | | | variables.rs:510:10:510:18 | SelfParam | variables.rs:511:5:511:32 | ExprStmt | | | variables.rs:510:15:510:18 | self | variables.rs:510:10:510:18 | SelfParam | | -| variables.rs:510:21:512:3 | BlockExpr | variables.rs:510:3:512:3 | exit bar (normal) | | +| variables.rs:510:21:512:3 | { ... } | variables.rs:510:3:512:3 | exit fn bar (normal) | | | variables.rs:511:5:511:9 | * ... | variables.rs:511:29:511:29 | 3 | | -| variables.rs:511:5:511:31 | ... = ... | variables.rs:510:21:512:3 | BlockExpr | | +| variables.rs:511:5:511:31 | ... = ... | variables.rs:510:21:512:3 | { ... } | | | variables.rs:511:5:511:32 | ExprStmt | variables.rs:511:6:511:9 | self | | | variables.rs:511:6:511:9 | self | variables.rs:511:5:511:9 | * ... | | -| variables.rs:511:13:511:31 | RecordExpr | variables.rs:511:5:511:31 | ... = ... | | -| variables.rs:511:29:511:29 | 3 | variables.rs:511:13:511:31 | RecordExpr | | -| variables.rs:515:1:520:1 | enter ref_methodcall_receiver | variables.rs:516:3:516:34 | LetStmt | | -| variables.rs:515:1:520:1 | exit ref_methodcall_receiver (normal) | variables.rs:515:1:520:1 | exit ref_methodcall_receiver | | -| variables.rs:515:30:520:1 | BlockExpr | variables.rs:515:1:520:1 | exit ref_methodcall_receiver (normal) | | -| variables.rs:516:3:516:34 | LetStmt | variables.rs:516:31:516:31 | 1 | | +| variables.rs:511:13:511:31 | MyStruct {...} | variables.rs:511:5:511:31 | ... = ... | | +| variables.rs:511:29:511:29 | 3 | variables.rs:511:13:511:31 | MyStruct {...} | | +| variables.rs:515:1:520:1 | enter fn ref_methodcall_receiver | variables.rs:516:3:516:34 | let ... = ... | | +| variables.rs:515:1:520:1 | exit fn ref_methodcall_receiver (normal) | variables.rs:515:1:520:1 | exit fn ref_methodcall_receiver | | +| variables.rs:515:30:520:1 | { ... } | variables.rs:515:1:520:1 | exit fn ref_methodcall_receiver (normal) | | +| variables.rs:516:3:516:34 | let ... = ... | variables.rs:516:31:516:31 | 1 | | | variables.rs:516:7:516:11 | a | variables.rs:517:3:517:10 | ExprStmt | match | -| variables.rs:516:15:516:33 | RecordExpr | variables.rs:516:7:516:11 | a | | -| variables.rs:516:31:516:31 | 1 | variables.rs:516:15:516:33 | RecordExpr | | +| variables.rs:516:15:516:33 | MyStruct {...} | variables.rs:516:7:516:11 | a | | +| variables.rs:516:31:516:31 | 1 | variables.rs:516:15:516:33 | MyStruct {...} | | | variables.rs:517:3:517:3 | a | variables.rs:517:3:517:9 | ... .bar(...) | | | variables.rs:517:3:517:9 | ... .bar(...) | variables.rs:519:3:519:19 | ExprStmt | | | variables.rs:517:3:517:10 | ExprStmt | variables.rs:517:3:517:3 | a | | | variables.rs:519:3:519:11 | print_i64 | variables.rs:519:13:519:13 | a | | -| variables.rs:519:3:519:18 | CallExpr | variables.rs:515:30:520:1 | BlockExpr | | +| variables.rs:519:3:519:18 | print_i64(...) | variables.rs:515:30:520:1 | { ... } | | | variables.rs:519:3:519:19 | ExprStmt | variables.rs:519:3:519:11 | print_i64 | | -| variables.rs:519:13:519:13 | a | variables.rs:519:13:519:17 | FieldExpr | | -| variables.rs:519:13:519:17 | FieldExpr | variables.rs:519:3:519:18 | CallExpr | | -| variables.rs:522:1:556:1 | enter main | variables.rs:523:5:523:25 | ExprStmt | | -| variables.rs:522:1:556:1 | exit main (normal) | variables.rs:522:1:556:1 | exit main | | -| variables.rs:522:11:556:1 | BlockExpr | variables.rs:522:1:556:1 | exit main (normal) | | -| variables.rs:523:5:523:22 | immutable_variable | variables.rs:523:5:523:24 | CallExpr | | -| variables.rs:523:5:523:24 | CallExpr | variables.rs:524:5:524:23 | ExprStmt | | +| variables.rs:519:13:519:13 | a | variables.rs:519:13:519:17 | a.val | | +| variables.rs:519:13:519:17 | a.val | variables.rs:519:3:519:18 | print_i64(...) | | +| variables.rs:522:1:556:1 | enter fn main | variables.rs:523:5:523:25 | ExprStmt | | +| variables.rs:522:1:556:1 | exit fn main (normal) | variables.rs:522:1:556:1 | exit fn main | | +| variables.rs:522:11:556:1 | { ... } | variables.rs:522:1:556:1 | exit fn main (normal) | | +| variables.rs:523:5:523:22 | immutable_variable | variables.rs:523:5:523:24 | immutable_variable(...) | | +| variables.rs:523:5:523:24 | immutable_variable(...) | variables.rs:524:5:524:23 | ExprStmt | | | variables.rs:523:5:523:25 | ExprStmt | variables.rs:523:5:523:22 | immutable_variable | | -| variables.rs:524:5:524:20 | mutable_variable | variables.rs:524:5:524:22 | CallExpr | | -| variables.rs:524:5:524:22 | CallExpr | variables.rs:525:5:525:40 | ExprStmt | | +| variables.rs:524:5:524:20 | mutable_variable | variables.rs:524:5:524:22 | mutable_variable(...) | | +| variables.rs:524:5:524:22 | mutable_variable(...) | variables.rs:525:5:525:40 | ExprStmt | | | variables.rs:524:5:524:23 | ExprStmt | variables.rs:524:5:524:20 | mutable_variable | | -| variables.rs:525:5:525:37 | mutable_variable_immutable_borrow | variables.rs:525:5:525:39 | CallExpr | | -| variables.rs:525:5:525:39 | CallExpr | variables.rs:526:5:526:23 | ExprStmt | | +| variables.rs:525:5:525:37 | mutable_variable_immutable_borrow | variables.rs:525:5:525:39 | mutable_variable_immutable_borrow(...) | | +| variables.rs:525:5:525:39 | mutable_variable_immutable_borrow(...) | variables.rs:526:5:526:23 | ExprStmt | | | variables.rs:525:5:525:40 | ExprStmt | variables.rs:525:5:525:37 | mutable_variable_immutable_borrow | | -| variables.rs:526:5:526:20 | variable_shadow1 | variables.rs:526:5:526:22 | CallExpr | | -| variables.rs:526:5:526:22 | CallExpr | variables.rs:527:5:527:23 | ExprStmt | | +| variables.rs:526:5:526:20 | variable_shadow1 | variables.rs:526:5:526:22 | variable_shadow1(...) | | +| variables.rs:526:5:526:22 | variable_shadow1(...) | variables.rs:527:5:527:23 | ExprStmt | | | variables.rs:526:5:526:23 | ExprStmt | variables.rs:526:5:526:20 | variable_shadow1 | | -| variables.rs:527:5:527:20 | variable_shadow2 | variables.rs:527:5:527:22 | CallExpr | | -| variables.rs:527:5:527:22 | CallExpr | variables.rs:528:5:528:19 | ExprStmt | | +| variables.rs:527:5:527:20 | variable_shadow2 | variables.rs:527:5:527:22 | variable_shadow2(...) | | +| variables.rs:527:5:527:22 | variable_shadow2(...) | variables.rs:528:5:528:19 | ExprStmt | | | variables.rs:527:5:527:23 | ExprStmt | variables.rs:527:5:527:20 | variable_shadow2 | | -| variables.rs:528:5:528:16 | let_pattern1 | variables.rs:528:5:528:18 | CallExpr | | -| variables.rs:528:5:528:18 | CallExpr | variables.rs:529:5:529:19 | ExprStmt | | +| variables.rs:528:5:528:16 | let_pattern1 | variables.rs:528:5:528:18 | let_pattern1(...) | | +| variables.rs:528:5:528:18 | let_pattern1(...) | variables.rs:529:5:529:19 | ExprStmt | | | variables.rs:528:5:528:19 | ExprStmt | variables.rs:528:5:528:16 | let_pattern1 | | -| variables.rs:529:5:529:16 | let_pattern2 | variables.rs:529:5:529:18 | CallExpr | | -| variables.rs:529:5:529:18 | CallExpr | variables.rs:530:5:530:19 | ExprStmt | | +| variables.rs:529:5:529:16 | let_pattern2 | variables.rs:529:5:529:18 | let_pattern2(...) | | +| variables.rs:529:5:529:18 | let_pattern2(...) | variables.rs:530:5:530:19 | ExprStmt | | | variables.rs:529:5:529:19 | ExprStmt | variables.rs:529:5:529:16 | let_pattern2 | | -| variables.rs:530:5:530:16 | let_pattern3 | variables.rs:530:5:530:18 | CallExpr | | -| variables.rs:530:5:530:18 | CallExpr | variables.rs:531:5:531:19 | ExprStmt | | +| variables.rs:530:5:530:16 | let_pattern3 | variables.rs:530:5:530:18 | let_pattern3(...) | | +| variables.rs:530:5:530:18 | let_pattern3(...) | variables.rs:531:5:531:19 | ExprStmt | | | variables.rs:530:5:530:19 | ExprStmt | variables.rs:530:5:530:16 | let_pattern3 | | -| variables.rs:531:5:531:16 | let_pattern4 | variables.rs:531:5:531:18 | CallExpr | | -| variables.rs:531:5:531:18 | CallExpr | variables.rs:532:5:532:21 | ExprStmt | | +| variables.rs:531:5:531:16 | let_pattern4 | variables.rs:531:5:531:18 | let_pattern4(...) | | +| variables.rs:531:5:531:18 | let_pattern4(...) | variables.rs:532:5:532:21 | ExprStmt | | | variables.rs:531:5:531:19 | ExprStmt | variables.rs:531:5:531:16 | let_pattern4 | | -| variables.rs:532:5:532:18 | match_pattern1 | variables.rs:532:5:532:20 | CallExpr | | -| variables.rs:532:5:532:20 | CallExpr | variables.rs:533:5:533:21 | ExprStmt | | +| variables.rs:532:5:532:18 | match_pattern1 | variables.rs:532:5:532:20 | match_pattern1(...) | | +| variables.rs:532:5:532:20 | match_pattern1(...) | variables.rs:533:5:533:21 | ExprStmt | | | variables.rs:532:5:532:21 | ExprStmt | variables.rs:532:5:532:18 | match_pattern1 | | -| variables.rs:533:5:533:18 | match_pattern2 | variables.rs:533:5:533:20 | CallExpr | | -| variables.rs:533:5:533:20 | CallExpr | variables.rs:534:5:534:21 | ExprStmt | | +| variables.rs:533:5:533:18 | match_pattern2 | variables.rs:533:5:533:20 | match_pattern2(...) | | +| variables.rs:533:5:533:20 | match_pattern2(...) | variables.rs:534:5:534:21 | ExprStmt | | | variables.rs:533:5:533:21 | ExprStmt | variables.rs:533:5:533:18 | match_pattern2 | | -| variables.rs:534:5:534:18 | match_pattern3 | variables.rs:534:5:534:20 | CallExpr | | -| variables.rs:534:5:534:20 | CallExpr | variables.rs:535:5:535:21 | ExprStmt | | +| variables.rs:534:5:534:18 | match_pattern3 | variables.rs:534:5:534:20 | match_pattern3(...) | | +| variables.rs:534:5:534:20 | match_pattern3(...) | variables.rs:535:5:535:21 | ExprStmt | | | variables.rs:534:5:534:21 | ExprStmt | variables.rs:534:5:534:18 | match_pattern3 | | -| variables.rs:535:5:535:18 | match_pattern4 | variables.rs:535:5:535:20 | CallExpr | | -| variables.rs:535:5:535:20 | CallExpr | variables.rs:536:5:536:21 | ExprStmt | | +| variables.rs:535:5:535:18 | match_pattern4 | variables.rs:535:5:535:20 | match_pattern4(...) | | +| variables.rs:535:5:535:20 | match_pattern4(...) | variables.rs:536:5:536:21 | ExprStmt | | | variables.rs:535:5:535:21 | ExprStmt | variables.rs:535:5:535:18 | match_pattern4 | | -| variables.rs:536:5:536:18 | match_pattern5 | variables.rs:536:5:536:20 | CallExpr | | -| variables.rs:536:5:536:20 | CallExpr | variables.rs:537:5:537:21 | ExprStmt | | +| variables.rs:536:5:536:18 | match_pattern5 | variables.rs:536:5:536:20 | match_pattern5(...) | | +| variables.rs:536:5:536:20 | match_pattern5(...) | variables.rs:537:5:537:21 | ExprStmt | | | variables.rs:536:5:536:21 | ExprStmt | variables.rs:536:5:536:18 | match_pattern5 | | -| variables.rs:537:5:537:18 | match_pattern6 | variables.rs:537:5:537:20 | CallExpr | | -| variables.rs:537:5:537:20 | CallExpr | variables.rs:538:5:538:21 | ExprStmt | | +| variables.rs:537:5:537:18 | match_pattern6 | variables.rs:537:5:537:20 | match_pattern6(...) | | +| variables.rs:537:5:537:20 | match_pattern6(...) | variables.rs:538:5:538:21 | ExprStmt | | | variables.rs:537:5:537:21 | ExprStmt | variables.rs:537:5:537:18 | match_pattern6 | | -| variables.rs:538:5:538:18 | match_pattern7 | variables.rs:538:5:538:20 | CallExpr | | -| variables.rs:538:5:538:20 | CallExpr | variables.rs:539:5:539:21 | ExprStmt | | +| variables.rs:538:5:538:18 | match_pattern7 | variables.rs:538:5:538:20 | match_pattern7(...) | | +| variables.rs:538:5:538:20 | match_pattern7(...) | variables.rs:539:5:539:21 | ExprStmt | | | variables.rs:538:5:538:21 | ExprStmt | variables.rs:538:5:538:18 | match_pattern7 | | -| variables.rs:539:5:539:18 | match_pattern8 | variables.rs:539:5:539:20 | CallExpr | | -| variables.rs:539:5:539:20 | CallExpr | variables.rs:540:5:540:21 | ExprStmt | | +| variables.rs:539:5:539:18 | match_pattern8 | variables.rs:539:5:539:20 | match_pattern8(...) | | +| variables.rs:539:5:539:20 | match_pattern8(...) | variables.rs:540:5:540:21 | ExprStmt | | | variables.rs:539:5:539:21 | ExprStmt | variables.rs:539:5:539:18 | match_pattern8 | | -| variables.rs:540:5:540:18 | match_pattern9 | variables.rs:540:5:540:20 | CallExpr | | -| variables.rs:540:5:540:20 | CallExpr | variables.rs:541:5:541:36 | ExprStmt | | +| variables.rs:540:5:540:18 | match_pattern9 | variables.rs:540:5:540:20 | match_pattern9(...) | | +| variables.rs:540:5:540:20 | match_pattern9(...) | variables.rs:541:5:541:36 | ExprStmt | | | variables.rs:540:5:540:21 | ExprStmt | variables.rs:540:5:540:18 | match_pattern9 | | | variables.rs:541:5:541:18 | param_pattern1 | variables.rs:541:20:541:22 | "a" | | -| variables.rs:541:5:541:35 | CallExpr | variables.rs:542:5:542:37 | ExprStmt | | +| variables.rs:541:5:541:35 | param_pattern1(...) | variables.rs:542:5:542:37 | ExprStmt | | | variables.rs:541:5:541:36 | ExprStmt | variables.rs:541:5:541:18 | param_pattern1 | | | variables.rs:541:20:541:22 | "a" | variables.rs:541:26:541:28 | "b" | | -| variables.rs:541:25:541:34 | TupleExpr | variables.rs:541:5:541:35 | CallExpr | | +| variables.rs:541:25:541:34 | TupleExpr | variables.rs:541:5:541:35 | param_pattern1(...) | | | variables.rs:541:26:541:28 | "b" | variables.rs:541:31:541:33 | "c" | | | variables.rs:541:31:541:33 | "c" | variables.rs:541:25:541:34 | TupleExpr | | -| variables.rs:542:5:542:18 | param_pattern2 | variables.rs:542:20:542:31 | Either::Left | | -| variables.rs:542:5:542:36 | CallExpr | variables.rs:543:5:543:26 | ExprStmt | | +| variables.rs:542:5:542:18 | param_pattern2 | variables.rs:542:20:542:31 | ...::Left | | +| variables.rs:542:5:542:36 | param_pattern2(...) | variables.rs:543:5:543:26 | ExprStmt | | | variables.rs:542:5:542:37 | ExprStmt | variables.rs:542:5:542:18 | param_pattern2 | | -| variables.rs:542:20:542:31 | Either::Left | variables.rs:542:33:542:34 | 45 | | -| variables.rs:542:20:542:35 | CallExpr | variables.rs:542:5:542:36 | CallExpr | | -| variables.rs:542:33:542:34 | 45 | variables.rs:542:20:542:35 | CallExpr | | -| variables.rs:543:5:543:23 | destruct_assignment | variables.rs:543:5:543:25 | CallExpr | | -| variables.rs:543:5:543:25 | CallExpr | variables.rs:544:5:544:23 | ExprStmt | | +| variables.rs:542:20:542:31 | ...::Left | variables.rs:542:33:542:34 | 45 | | +| variables.rs:542:20:542:35 | ...::Left(...) | variables.rs:542:5:542:36 | param_pattern2(...) | | +| variables.rs:542:33:542:34 | 45 | variables.rs:542:20:542:35 | ...::Left(...) | | +| variables.rs:543:5:543:23 | destruct_assignment | variables.rs:543:5:543:25 | destruct_assignment(...) | | +| variables.rs:543:5:543:25 | destruct_assignment(...) | variables.rs:544:5:544:23 | ExprStmt | | | variables.rs:543:5:543:26 | ExprStmt | variables.rs:543:5:543:23 | destruct_assignment | | -| variables.rs:544:5:544:20 | closure_variable | variables.rs:544:5:544:22 | CallExpr | | -| variables.rs:544:5:544:22 | CallExpr | variables.rs:545:5:545:19 | ExprStmt | | +| variables.rs:544:5:544:20 | closure_variable | variables.rs:544:5:544:22 | closure_variable(...) | | +| variables.rs:544:5:544:22 | closure_variable(...) | variables.rs:545:5:545:19 | ExprStmt | | | variables.rs:544:5:544:23 | ExprStmt | variables.rs:544:5:544:20 | closure_variable | | -| variables.rs:545:5:545:16 | for_variable | variables.rs:545:5:545:18 | CallExpr | | -| variables.rs:545:5:545:18 | CallExpr | variables.rs:546:5:546:17 | ExprStmt | | +| variables.rs:545:5:545:16 | for_variable | variables.rs:545:5:545:18 | for_variable(...) | | +| variables.rs:545:5:545:18 | for_variable(...) | variables.rs:546:5:546:17 | ExprStmt | | | variables.rs:545:5:545:19 | ExprStmt | variables.rs:545:5:545:16 | for_variable | | -| variables.rs:546:5:546:14 | add_assign | variables.rs:546:5:546:16 | CallExpr | | -| variables.rs:546:5:546:16 | CallExpr | variables.rs:547:5:547:13 | ExprStmt | | +| variables.rs:546:5:546:14 | add_assign | variables.rs:546:5:546:16 | add_assign(...) | | +| variables.rs:546:5:546:16 | add_assign(...) | variables.rs:547:5:547:13 | ExprStmt | | | variables.rs:546:5:546:17 | ExprStmt | variables.rs:546:5:546:14 | add_assign | | -| variables.rs:547:5:547:10 | mutate | variables.rs:547:5:547:12 | CallExpr | | -| variables.rs:547:5:547:12 | CallExpr | variables.rs:548:5:548:17 | ExprStmt | | +| variables.rs:547:5:547:10 | mutate | variables.rs:547:5:547:12 | mutate(...) | | +| variables.rs:547:5:547:12 | mutate(...) | variables.rs:548:5:548:17 | ExprStmt | | | variables.rs:547:5:547:13 | ExprStmt | variables.rs:547:5:547:10 | mutate | | -| variables.rs:548:5:548:14 | mutate_arg | variables.rs:548:5:548:16 | CallExpr | | -| variables.rs:548:5:548:16 | CallExpr | variables.rs:549:5:549:12 | ExprStmt | | +| variables.rs:548:5:548:14 | mutate_arg | variables.rs:548:5:548:16 | mutate_arg(...) | | +| variables.rs:548:5:548:16 | mutate_arg(...) | variables.rs:549:5:549:12 | ExprStmt | | | variables.rs:548:5:548:17 | ExprStmt | variables.rs:548:5:548:14 | mutate_arg | | -| variables.rs:549:5:549:9 | alias | variables.rs:549:5:549:11 | CallExpr | | -| variables.rs:549:5:549:11 | CallExpr | variables.rs:550:5:550:18 | ExprStmt | | +| variables.rs:549:5:549:9 | alias | variables.rs:549:5:549:11 | alias(...) | | +| variables.rs:549:5:549:11 | alias(...) | variables.rs:550:5:550:18 | ExprStmt | | | variables.rs:549:5:549:12 | ExprStmt | variables.rs:549:5:549:9 | alias | | -| variables.rs:550:5:550:15 | capture_mut | variables.rs:550:5:550:17 | CallExpr | | -| variables.rs:550:5:550:17 | CallExpr | variables.rs:551:5:551:20 | ExprStmt | | +| variables.rs:550:5:550:15 | capture_mut | variables.rs:550:5:550:17 | capture_mut(...) | | +| variables.rs:550:5:550:17 | capture_mut(...) | variables.rs:551:5:551:20 | ExprStmt | | | variables.rs:550:5:550:18 | ExprStmt | variables.rs:550:5:550:15 | capture_mut | | -| variables.rs:551:5:551:17 | capture_immut | variables.rs:551:5:551:19 | CallExpr | | -| variables.rs:551:5:551:19 | CallExpr | variables.rs:552:5:552:26 | ExprStmt | | +| variables.rs:551:5:551:17 | capture_immut | variables.rs:551:5:551:19 | capture_immut(...) | | +| variables.rs:551:5:551:19 | capture_immut(...) | variables.rs:552:5:552:26 | ExprStmt | | | variables.rs:551:5:551:20 | ExprStmt | variables.rs:551:5:551:17 | capture_immut | | -| variables.rs:552:5:552:23 | async_block_capture | variables.rs:552:5:552:25 | CallExpr | | -| variables.rs:552:5:552:25 | CallExpr | variables.rs:553:5:553:14 | ExprStmt | | +| variables.rs:552:5:552:23 | async_block_capture | variables.rs:552:5:552:25 | async_block_capture(...) | | +| variables.rs:552:5:552:25 | async_block_capture(...) | variables.rs:553:5:553:14 | ExprStmt | | | variables.rs:552:5:552:26 | ExprStmt | variables.rs:552:5:552:23 | async_block_capture | | -| variables.rs:553:5:553:11 | structs | variables.rs:553:5:553:13 | CallExpr | | -| variables.rs:553:5:553:13 | CallExpr | variables.rs:554:5:554:14 | ExprStmt | | +| variables.rs:553:5:553:11 | structs | variables.rs:553:5:553:13 | structs(...) | | +| variables.rs:553:5:553:13 | structs(...) | variables.rs:554:5:554:14 | ExprStmt | | | variables.rs:553:5:553:14 | ExprStmt | variables.rs:553:5:553:11 | structs | | -| variables.rs:554:5:554:11 | ref_arg | variables.rs:554:5:554:13 | CallExpr | | -| variables.rs:554:5:554:13 | CallExpr | variables.rs:555:5:555:30 | ExprStmt | | +| variables.rs:554:5:554:11 | ref_arg | variables.rs:554:5:554:13 | ref_arg(...) | | +| variables.rs:554:5:554:13 | ref_arg(...) | variables.rs:555:5:555:30 | ExprStmt | | | variables.rs:554:5:554:14 | ExprStmt | variables.rs:554:5:554:11 | ref_arg | | -| variables.rs:555:5:555:27 | ref_methodcall_receiver | variables.rs:555:5:555:29 | CallExpr | | -| variables.rs:555:5:555:29 | CallExpr | variables.rs:522:11:556:1 | BlockExpr | | +| variables.rs:555:5:555:27 | ref_methodcall_receiver | variables.rs:555:5:555:29 | ref_methodcall_receiver(...) | | +| variables.rs:555:5:555:29 | ref_methodcall_receiver(...) | variables.rs:522:11:556:1 | { ... } | | | variables.rs:555:5:555:30 | ExprStmt | variables.rs:555:5:555:27 | ref_methodcall_receiver | | breakTarget continueTarget diff --git a/rust/ql/test/library-tests/variables/Ssa.expected b/rust/ql/test/library-tests/variables/Ssa.expected index f17152793a3e..af3c96d95030 100644 --- a/rust/ql/test/library-tests/variables/Ssa.expected +++ b/rust/ql/test/library-tests/variables/Ssa.expected @@ -120,12 +120,12 @@ definition | variables.rs:418:9:418:13 | y | variables.rs:418:13:418:13 | y | | variables.rs:420:9:420:20 | closure2 | variables.rs:420:13:420:20 | closure2 | | variables.rs:421:9:421:9 | y | variables.rs:418:13:418:13 | y | -| variables.rs:423:5:423:14 | CallExpr | variables.rs:418:13:418:13 | y | +| variables.rs:423:5:423:14 | closure2(...) | variables.rs:418:13:418:13 | y | | variables.rs:428:9:428:20 | closure3 | variables.rs:428:13:428:20 | closure3 | | variables.rs:436:9:436:13 | i | variables.rs:436:13:436:13 | i | | variables.rs:437:9:437:13 | block | variables.rs:437:9:437:13 | block | | variables.rs:438:9:438:9 | i | variables.rs:436:13:436:13 | i | -| variables.rs:441:5:441:15 | AwaitExpr | variables.rs:436:13:436:13 | i | +| variables.rs:441:5:441:15 | await block | variables.rs:436:13:436:13 | i | | variables.rs:445:8:445:8 | b | variables.rs:445:8:445:8 | b | | variables.rs:446:9:446:13 | x | variables.rs:446:13:446:13 | x | | variables.rs:449:5:457:5 | phi | variables.rs:446:13:446:13 | x | @@ -239,10 +239,10 @@ read | variables.rs:412:9:412:16 | closure1 | variables.rs:412:9:412:16 | closure1 | variables.rs:415:5:415:12 | closure1 | | variables.rs:412:20:414:5 | x | variables.rs:410:13:410:13 | x | variables.rs:413:19:413:19 | x | | variables.rs:420:9:420:20 | closure2 | variables.rs:420:13:420:20 | closure2 | variables.rs:423:5:423:12 | closure2 | -| variables.rs:423:5:423:14 | CallExpr | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | +| variables.rs:423:5:423:14 | closure2(...) | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | | variables.rs:428:9:428:20 | closure3 | variables.rs:428:13:428:20 | closure3 | variables.rs:431:5:431:12 | closure3 | | variables.rs:437:9:437:13 | block | variables.rs:437:9:437:13 | block | variables.rs:441:5:441:9 | block | -| variables.rs:441:5:441:15 | AwaitExpr | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | +| variables.rs:441:5:441:15 | await block | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | | variables.rs:445:8:445:8 | b | variables.rs:445:8:445:8 | b | variables.rs:449:8:449:8 | b | | variables.rs:446:9:446:13 | x | variables.rs:446:13:446:13 | x | variables.rs:447:15:447:15 | x | | variables.rs:446:9:446:13 | x | variables.rs:446:13:446:13 | x | variables.rs:448:15:448:15 | x | @@ -343,10 +343,10 @@ firstRead | variables.rs:412:9:412:16 | closure1 | variables.rs:412:9:412:16 | closure1 | variables.rs:415:5:415:12 | closure1 | | variables.rs:412:20:414:5 | x | variables.rs:410:13:410:13 | x | variables.rs:413:19:413:19 | x | | variables.rs:420:9:420:20 | closure2 | variables.rs:420:13:420:20 | closure2 | variables.rs:423:5:423:12 | closure2 | -| variables.rs:423:5:423:14 | CallExpr | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | +| variables.rs:423:5:423:14 | closure2(...) | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | | variables.rs:428:9:428:20 | closure3 | variables.rs:428:13:428:20 | closure3 | variables.rs:431:5:431:12 | closure3 | | variables.rs:437:9:437:13 | block | variables.rs:437:9:437:13 | block | variables.rs:441:5:441:9 | block | -| variables.rs:441:5:441:15 | AwaitExpr | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | +| variables.rs:441:5:441:15 | await block | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | | variables.rs:445:8:445:8 | b | variables.rs:445:8:445:8 | b | variables.rs:449:8:449:8 | b | | variables.rs:446:9:446:13 | x | variables.rs:446:13:446:13 | x | variables.rs:447:15:447:15 | x | | variables.rs:449:5:457:5 | phi | variables.rs:446:13:446:13 | x | variables.rs:458:15:458:15 | x | @@ -443,10 +443,10 @@ lastRead | variables.rs:412:9:412:16 | closure1 | variables.rs:412:9:412:16 | closure1 | variables.rs:415:5:415:12 | closure1 | | variables.rs:412:20:414:5 | x | variables.rs:410:13:410:13 | x | variables.rs:413:19:413:19 | x | | variables.rs:420:9:420:20 | closure2 | variables.rs:420:13:420:20 | closure2 | variables.rs:423:5:423:12 | closure2 | -| variables.rs:423:5:423:14 | CallExpr | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | +| variables.rs:423:5:423:14 | closure2(...) | variables.rs:418:13:418:13 | y | variables.rs:424:15:424:15 | y | | variables.rs:428:9:428:20 | closure3 | variables.rs:428:13:428:20 | closure3 | variables.rs:431:5:431:12 | closure3 | | variables.rs:437:9:437:13 | block | variables.rs:437:9:437:13 | block | variables.rs:441:5:441:9 | block | -| variables.rs:441:5:441:15 | AwaitExpr | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | +| variables.rs:441:5:441:15 | await block | variables.rs:436:13:436:13 | i | variables.rs:442:15:442:15 | i | | variables.rs:445:8:445:8 | b | variables.rs:445:8:445:8 | b | variables.rs:449:8:449:8 | b | | variables.rs:446:9:446:13 | x | variables.rs:446:13:446:13 | x | variables.rs:448:15:448:15 | x | | variables.rs:449:5:457:5 | phi | variables.rs:446:13:446:13 | x | variables.rs:458:15:458:15 | x | diff --git a/rust/ql/test/library-tests/variables/variables.expected b/rust/ql/test/library-tests/variables/variables.expected index 6760f9bcdde3..d888734f3dc4 100644 --- a/rust/ql/test/library-tests/variables/variables.expected +++ b/rust/ql/test/library-tests/variables/variables.expected @@ -411,49 +411,49 @@ variableInitializer | variables.rs:37:9:37:10 | x3 | variables.rs:38:9:38:14 | ... + ... | | variables.rs:43:9:43:10 | x4 | variables.rs:43:14:43:16 | "a" | | variables.rs:46:13:46:14 | x4 | variables.rs:46:18:46:20 | "b" | -| variables.rs:75:9:75:10 | p1 | variables.rs:75:14:75:37 | RecordExpr | -| variables.rs:85:9:85:10 | s1 | variables.rs:85:14:85:41 | CallExpr | -| variables.rs:102:9:102:10 | s1 | variables.rs:102:14:102:41 | CallExpr | -| variables.rs:111:9:111:10 | x6 | variables.rs:111:14:111:20 | CallExpr | +| variables.rs:75:9:75:10 | p1 | variables.rs:75:14:75:37 | Point {...} | +| variables.rs:85:9:85:10 | s1 | variables.rs:85:14:85:41 | Some(...) | +| variables.rs:102:9:102:10 | s1 | variables.rs:102:14:102:41 | Some(...) | +| variables.rs:111:9:111:10 | x6 | variables.rs:111:14:111:20 | Some(...) | | variables.rs:112:9:112:10 | y1 | variables.rs:112:14:112:15 | 10 | | variables.rs:128:9:128:15 | numbers | variables.rs:128:19:128:35 | TupleExpr | -| variables.rs:155:9:155:10 | p2 | variables.rs:155:14:155:37 | RecordExpr | -| variables.rs:169:9:169:11 | msg | variables.rs:169:15:169:38 | RecordExpr | -| variables.rs:189:9:189:14 | either | variables.rs:189:18:189:33 | CallExpr | -| variables.rs:203:9:203:10 | tv | variables.rs:203:14:203:36 | CallExpr | -| variables.rs:219:9:219:14 | either | variables.rs:219:18:219:33 | CallExpr | -| variables.rs:229:9:229:14 | either | variables.rs:229:18:229:33 | CallExpr | -| variables.rs:253:9:253:10 | fv | variables.rs:253:14:253:35 | CallExpr | -| variables.rs:315:9:315:23 | example_closure | variables.rs:316:9:317:9 | ClosureExpr | -| variables.rs:318:9:318:10 | n1 | variables.rs:319:9:319:26 | CallExpr | -| variables.rs:323:9:323:26 | immutable_variable | variables.rs:324:9:325:9 | ClosureExpr | -| variables.rs:326:9:326:10 | n2 | variables.rs:327:9:327:29 | CallExpr | -| variables.rs:332:9:332:9 | v | variables.rs:332:13:332:41 | RefExpr | +| variables.rs:155:9:155:10 | p2 | variables.rs:155:14:155:37 | Point {...} | +| variables.rs:169:9:169:11 | msg | variables.rs:169:15:169:38 | ...::Hello {...} | +| variables.rs:189:9:189:14 | either | variables.rs:189:18:189:33 | ...::Left(...) | +| variables.rs:203:9:203:10 | tv | variables.rs:203:14:203:36 | ...::Second(...) | +| variables.rs:219:9:219:14 | either | variables.rs:219:18:219:33 | ...::Left(...) | +| variables.rs:229:9:229:14 | either | variables.rs:229:18:229:33 | ...::Left(...) | +| variables.rs:253:9:253:10 | fv | variables.rs:253:14:253:35 | ...::Second(...) | +| variables.rs:315:9:315:23 | example_closure | variables.rs:316:9:317:9 | \|...\| x | +| variables.rs:318:9:318:10 | n1 | variables.rs:319:9:319:26 | example_closure(...) | +| variables.rs:323:9:323:26 | immutable_variable | variables.rs:324:9:325:9 | \|...\| x | +| variables.rs:326:9:326:10 | n2 | variables.rs:327:9:327:29 | immutable_variable(...) | +| variables.rs:332:9:332:9 | v | variables.rs:332:13:332:41 | &... | | variables.rs:341:13:341:13 | a | variables.rs:341:17:341:17 | 0 | | variables.rs:349:13:349:13 | i | variables.rs:349:17:349:17 | 1 | -| variables.rs:350:9:350:13 | ref_i | variables.rs:351:9:351:14 | RefExpr | +| variables.rs:350:9:350:13 | ref_i | variables.rs:351:9:351:14 | &mut i | | variables.rs:372:13:372:13 | x | variables.rs:372:17:372:17 | 2 | -| variables.rs:373:9:373:9 | y | variables.rs:374:9:374:28 | CallExpr | +| variables.rs:373:9:373:9 | y | variables.rs:374:9:374:28 | mutate_param(...) | | variables.rs:379:13:379:13 | z | variables.rs:379:17:379:17 | 4 | -| variables.rs:380:9:380:9 | w | variables.rs:381:9:381:19 | RefExpr | +| variables.rs:380:9:380:9 | w | variables.rs:381:9:381:19 | &mut ... | | variables.rs:392:13:392:13 | x | variables.rs:392:17:392:17 | 1 | -| variables.rs:393:9:393:9 | y | variables.rs:394:9:394:14 | RefExpr | +| variables.rs:393:9:393:9 | y | variables.rs:394:9:394:14 | &mut x | | variables.rs:400:9:400:9 | x | variables.rs:400:13:400:15 | 100 | -| variables.rs:402:9:402:11 | cap | variables.rs:402:15:404:5 | ClosureExpr | +| variables.rs:402:9:402:11 | cap | variables.rs:402:15:404:5 | \|...\| ... | | variables.rs:410:13:410:13 | x | variables.rs:410:17:410:17 | 1 | -| variables.rs:412:9:412:16 | closure1 | variables.rs:412:20:414:5 | ClosureExpr | +| variables.rs:412:9:412:16 | closure1 | variables.rs:412:20:414:5 | \|...\| ... | | variables.rs:418:13:418:13 | y | variables.rs:418:17:418:17 | 2 | -| variables.rs:420:13:420:20 | closure2 | variables.rs:420:24:422:5 | ClosureExpr | +| variables.rs:420:13:420:20 | closure2 | variables.rs:420:24:422:5 | \|...\| ... | | variables.rs:426:13:426:13 | z | variables.rs:426:17:426:17 | 2 | -| variables.rs:428:13:428:20 | closure3 | variables.rs:428:24:430:5 | ClosureExpr | +| variables.rs:428:13:428:20 | closure3 | variables.rs:428:24:430:5 | \|...\| ... | | variables.rs:436:13:436:13 | i | variables.rs:436:22:436:22 | 0 | -| variables.rs:437:9:437:13 | block | variables.rs:437:17:439:5 | BlockExpr | +| variables.rs:437:9:437:13 | block | variables.rs:437:17:439:5 | { ... } | | variables.rs:446:13:446:13 | x | variables.rs:446:17:446:17 | 1 | | variables.rs:462:9:462:9 | x | variables.rs:462:13:462:13 | 1 | -| variables.rs:488:13:488:13 | a | variables.rs:488:17:488:35 | RecordExpr | +| variables.rs:488:13:488:13 | a | variables.rs:488:17:488:35 | MyStruct {...} | | variables.rs:497:9:497:9 | x | variables.rs:497:13:497:14 | 16 | | variables.rs:501:9:501:9 | z | variables.rs:501:13:501:14 | 17 | -| variables.rs:516:11:516:11 | a | variables.rs:516:15:516:33 | RecordExpr | +| variables.rs:516:11:516:11 | a | variables.rs:516:15:516:33 | MyStruct {...} | capturedVariable | variables.rs:400:9:400:9 | x | | variables.rs:410:13:410:13 | x | diff --git a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected index bdfa4a9792dd..5b4796faa8c5 100644 --- a/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/query-tests/diagnostics/CONSISTENCY/ExtractionConsistency.expected @@ -4,5 +4,4 @@ extractionWarning | does_not_compile.rs:2:13:2:12 | expected SEMICOLON | | does_not_compile.rs:2:21:2:20 | expected SEMICOLON | | does_not_compile.rs:2:26:2:25 | expected SEMICOLON | -| does_not_compile.rs:2:32:2:31 | expected field name or number | | error.rs:2:5:2:17 | An error! | diff --git a/rust/ql/test/query-tests/diagnostics/ExtractionWarnings.expected b/rust/ql/test/query-tests/diagnostics/ExtractionWarnings.expected index 1ebd7e232214..5ea7e808176e 100644 --- a/rust/ql/test/query-tests/diagnostics/ExtractionWarnings.expected +++ b/rust/ql/test/query-tests/diagnostics/ExtractionWarnings.expected @@ -3,5 +3,4 @@ | does_not_compile.rs:2:13:2:12 | expected SEMICOLON | Extraction warning in does_not_compile.rs with message expected SEMICOLON | 1 | | does_not_compile.rs:2:21:2:20 | expected SEMICOLON | Extraction warning in does_not_compile.rs with message expected SEMICOLON | 1 | | does_not_compile.rs:2:26:2:25 | expected SEMICOLON | Extraction warning in does_not_compile.rs with message expected SEMICOLON | 1 | -| does_not_compile.rs:2:32:2:31 | expected field name or number | Extraction warning in does_not_compile.rs with message expected field name or number | 1 | | error.rs:2:5:2:17 | An error! | Extraction warning in error.rs with message An error! | 1 | diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected index 69be8e0c6d05..b7bbd277be44 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStats.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStats.expected @@ -1,7 +1,7 @@ -| Elements extracted | 376 | +| Elements extracted | 375 | | Elements unextracted | 0 | | Extraction errors | 0 | -| Extraction warnings | 7 | +| Extraction warnings | 6 | | Files extracted - total | 8 | | Files extracted - with errors | 2 | | Files extracted - without errors | 6 | diff --git a/rust/ql/test/query-tests/diagnostics/does_not_compile.rs b/rust/ql/test/query-tests/diagnostics/does_not_compile.rs index 9aedaffcd93a..15f85e1ab4bf 100644 --- a/rust/ql/test/query-tests/diagnostics/does_not_compile.rs +++ b/rust/ql/test/query-tests/diagnostics/does_not_compile.rs @@ -1,3 +1,3 @@ pub fn my_func() { - This is not correct Rust code. + This is not correct Rust code } diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index 6e35019c1cbf..000000000000 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,7 +0,0 @@ -uniqueEnclosingCallable -| sqlx.rs:52:72:52:84 | remote_number | Node should have one enclosing callable but has 0. | -| sqlx.rs:56:74:56:86 | remote_string | Node should have one enclosing callable but has 0. | -| sqlx.rs:199:32:199:44 | enable_remote | Node should have one enclosing callable but has 0. | -uniqueNodeToString -| sqlx.rs:154:13:154:81 | (no string representation) | Node should have one toString but has 0. | -| sqlx.rs:156:17:156:86 | (no string representation) | Node should have one toString but has 0. | diff --git a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/DataFlowConsistency.expected b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/DataFlowConsistency.expected deleted file mode 100644 index 0a61a151c204..000000000000 --- a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/DataFlowConsistency.expected +++ /dev/null @@ -1,5 +0,0 @@ -uniqueEnclosingCallable -| main.rs:194:25:194:25 | x | Node should have one enclosing callable but has 0. | -| main.rs:198:28:198:28 | x | Node should have one enclosing callable but has 0. | -| main.rs:202:28:202:28 | x | Node should have one enclosing callable but has 0. | -| main.rs:206:28:206:28 | x | Node should have one enclosing callable but has 0. | diff --git a/rust/schema/annotations.py b/rust/schema/annotations.py index ae94b0604e7e..91a6d6add281 100644 --- a/rust/schema/annotations.py +++ b/rust/schema/annotations.py @@ -1,6 +1,19 @@ from misc.codegen.lib.schemadefs import * from .ast import * +class LabelableExpr(Expr): + """ + The base class for expressions that can be labeled (`LoopExpr`, `ForExpr`, `WhileExpr` or `BlockExpr`). + """ + label: optional[Label] | child + +class LoopingExpr(LabelableExpr): + """ + The base class for expressions that loop (`LoopExpr`, `ForExpr` or `WhileExpr`). + """ + loop_body: optional["BlockExpr"] | child + + @annotate(Module) @rust.doc_test_signature(None) @@ -68,6 +81,7 @@ class _: """ A path. For example: ```rust + use some_crate::some_module::some_item; foo::bar; ``` """ @@ -107,6 +121,7 @@ class PathExprBase(Expr): @annotate(PathExpr, replace_bases={Expr: PathExprBase}, cfg = True) +@qltest.test_with(Path) class _: """ A path expression. For example: @@ -151,7 +166,7 @@ class _: """ -@annotate(BlockExpr, cfg = True) +@annotate(BlockExpr, replace_bases={Expr: LabelableExpr}, cfg = True) class _: """ A block expression. For example: @@ -167,9 +182,10 @@ class _: } ``` """ + label: drop -@annotate(LoopExpr, cfg = True) +@annotate(LoopExpr, replace_bases={Expr: LoopingExpr}, cfg = True) class _: """ A loop expression. For example: @@ -195,6 +211,8 @@ class _: }; ``` """ + label: drop + loop_body: drop class CallExprBase(Expr): @@ -705,6 +723,7 @@ class _: @annotate(PathPat, cfg = True) +@qltest.test_with(Path) class _: """ A path pattern. For example: @@ -990,7 +1009,7 @@ class _: """ -@annotate(ForExpr, cfg = True) +@annotate(ForExpr, replace_bases={Expr: LoopingExpr}, cfg = True) class _: """ A ForExpr. For example: @@ -998,6 +1017,8 @@ class _: todo!() ``` """ + label: drop + loop_body: drop @annotate(ForType) @@ -1011,6 +1032,7 @@ class _: @annotate(FormatArgsArg) +@qltest.test_with(FormatArgsExpr) class _: """ A FormatArgsArg. For example: @@ -1025,9 +1047,14 @@ class _: """ A FormatArgsExpr. For example: ```rust - todo!() + format_args!("no args"); + format_args!("{} foo {:?}", 1, 2); + format_args!("{b} foo {a:?}", a=1, b=2); + let (x, y) = (1, 42); + format_args!("{x}, {y}"); ``` """ + formats: list["Format"] | child | synth @annotate(GenericArg) @@ -1348,21 +1375,21 @@ class _: @annotate(PathSegment) +@qltest.test_with(Path) class _: """ - A PathSegment. For example: - ```rust - todo!() - ``` + A path segment, which is one part of a whole path. """ @annotate(PathType) +@qltest.test_with(Path) class _: """ - A PathType. For example: + A type referring to a path. For example: ```rust - todo!() + type X = std::collections::HashMap; + type Y = X::Item; ``` """ @@ -1744,7 +1771,7 @@ class _: """ -@annotate(WhileExpr, cfg = True) +@annotate(WhileExpr, replace_bases={Expr: LoopingExpr}, cfg = True) class _: """ A WhileExpr. For example: @@ -1752,6 +1779,8 @@ class _: todo!() ``` """ + label: drop + loop_body: drop @annotate(Function, add_bases=[Callable]) @@ -1766,14 +1795,15 @@ class _: attrs: drop -@qltest.skip @synth.on_arguments(parent="FormatArgsExpr", index=int, kind=int) +@qltest.test_with(FormatArgsExpr) class FormatTemplateVariableAccess(PathExprBase): pass -@qltest.skip @synth.on_arguments(parent=FormatArgsExpr, index=int, text=string, offset=int) +@qltest.test_with(FormatArgsExpr) + class Format(Locatable): """ A format element in a formatting template. For example the `{}` in: @@ -1783,10 +1813,11 @@ class Format(Locatable): """ parent: FormatArgsExpr index: int + argument: optional["FormatArgument"] | child -@qltest.skip @synth.on_arguments(parent=FormatArgsExpr, index=int, kind=int, name=string, positional=boolean, offset=int) +@qltest.test_with(FormatArgsExpr) class FormatArgument(Locatable): """ An argument in a format element in a formatting template. For example the `width`, `precision`, and `value` in: @@ -1799,6 +1830,7 @@ class FormatArgument(Locatable): ``` """ parent: Format + variable: optional[FormatTemplateVariableAccess] | child @annotate(Item) class _: