diff --git a/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/coroutine.ql b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/coroutine.ql new file mode 100644 index 000000000000..bb9ca91c04d6 --- /dev/null +++ b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/coroutine.ql @@ -0,0 +1,18 @@ +class Function extends @function { + string toString() { none() } +} + +class Type extends @type { + string toString() { none() } +} + +class Variable extends @variable { + string toString() { none() } +} + +from Function func, Type traits, Variable handle, Variable promise +where + coroutine(func, traits) and + coroutine_placeholder_variable(handle, 1, func) and + coroutine_placeholder_variable(promise, 2, func) +select func, traits, handle, promise diff --git a/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme new file mode 100644 index 000000000000..7ff6a6e53dbc --- /dev/null +++ b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme @@ -0,0 +1,2315 @@ + +/** + * 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: @functionorblock 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 +; + +@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 + ; + +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 +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock 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/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..0fea0ee7026c --- /dev/null +++ b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme @@ -0,0 +1,2319 @@ + +/** + * 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, + int handle: @variable ref, + int promise: @variable 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: @functionorblock 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 +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int 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 +; + +@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 + ; + +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 +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock 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/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties new file mode 100644 index 000000000000..cb2077596c33 --- /dev/null +++ b/cpp/downgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties @@ -0,0 +1,4 @@ +description: Improve handling of coroutine placeholder variables +compatibility: full +coroutine.rel: run coroutine.qlo +coroutine_placeholder_variable.rel: delete diff --git a/cpp/ql/lib/semmle/code/cpp/Variable.qll b/cpp/ql/lib/semmle/code/cpp/Variable.qll index 8d78dbd2c717..96bfabb4de07 100644 --- a/cpp/ql/lib/semmle/code/cpp/Variable.qll +++ b/cpp/ql/lib/semmle/code/cpp/Variable.qll @@ -409,11 +409,18 @@ class LocalVariable extends LocalScopeVariable, @localvariable { exists(ConditionDeclExpr e | e.getVariable() = this and e.getEnclosingFunction() = result) or orphaned_variables(underlyingElement(this), unresolveElement(result)) + or + coroutine_placeholder_variable(underlyingElement(this), _, unresolveElement(result)) } override predicate isStatic() { super.isStatic() or orphaned_variables(underlyingElement(this), _) } + + override predicate isCompilerGenerated() { + super.isCompilerGenerated() or + coroutine_placeholder_variable(underlyingElement(this), _, _) + } } /** diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 0fea0ee7026c..7ff6a6e53dbc 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -384,11 +384,23 @@ function_return_type( */ coroutine( unique int function: @function ref, - int traits: @type ref, - int handle: @variable ref, - int promise: @variable 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, @@ -829,22 +841,6 @@ variable_template_argument_value( int arg_value: @expr ref ); -/* - Fixed point types - precision(1) = short, precision(2) = default, precision(3) = long - is_unsigned(1) = unsigned is_unsigned(2) = signed - is_fract_type(1) = declared with _Fract - saturating(1) = declared with _Sat -*/ -/* TODO -fixedpointtypes( - unique int id: @fixedpointtype, - int precision: int ref, - int is_unsigned: int ref, - int is_fract_type: int ref, - int saturating: int ref); -*/ - routinetypes( unique int id: @routinetype, int return_type: @type ref diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index 73e6d0bf9728..07045b0bd67a 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -98,7 +98,7 @@ @localvariable - 576947 + 576946 @enumconstant @@ -370,7 +370,7 @@ @usertype - 5234031 + 5234965 @mangledname @@ -468,10 +468,6 @@ @initialiser 1710781 - - @lambdacapture - 28011 - @address_of 438815 @@ -482,11 +478,11 @@ @array_to_pointer - 1430839 + 1430838 @parexpr - 3587480 + 3587479 @arithnegexpr @@ -522,7 +518,7 @@ @conditionalexpr - 657238 + 657237 @addexpr @@ -1360,6 +1356,10 @@ @c11_generic 8 + + @lambdacapture + 28011 + @stmt_expr 1486025 @@ -2148,7 +2148,7 @@ seconds - 9868 + 9149 @@ -2229,47 +2229,47 @@ 3 4 - 679 + 759 4 5 - 319 + 239 - 6 - 7 + 5 + 8 159 - 7 + 8 10 - 159 + 119 10 11 - 79 + 159 11 - 14 + 15 159 - 16 - 18 + 17 + 19 159 - 19 - 27 + 20 + 44 159 - 41 - 88 - 119 + 50 + 92 + 79 @@ -2337,42 +2337,42 @@ 3 4 - 1518 + 1478 4 5 - 319 + 279 5 6 - 199 + 239 6 7 - 399 + 479 7 8 - 119 + 39 8 - 10 + 9 279 - 10 - 28 - 279 + 9 + 24 + 239 - 28 - 86 - 199 + 25 + 88 + 279 @@ -2420,16 +2420,21 @@ 3 4 - 79 + 39 - 134 - 135 + 4 + 5 39 - 148 - 149 + 124 + 125 + 39 + + + 129 + 130 39 @@ -2446,27 +2451,27 @@ 1 2 - 5033 + 4394 2 3 - 2556 + 1757 3 4 - 1438 + 1518 4 - 16 - 759 + 5 + 998 - 27 + 5 46 - 79 + 479 @@ -2482,17 +2487,17 @@ 1 2 - 4314 + 4115 2 3 - 2237 + 1478 3 4 - 1638 + 1478 4 @@ -2501,13 +2506,13 @@ 5 - 11 - 759 + 6 + 559 - 16 - 76 - 119 + 6 + 75 + 719 @@ -2523,12 +2528,12 @@ 1 2 - 8230 + 7910 2 3 - 1638 + 1238 @@ -2872,7 +2877,7 @@ cpu_seconds - 7168 + 7100 elapsed_seconds @@ -2922,17 +2927,22 @@ 1 2 - 5779 + 5655 2 3 - 846 + 857 3 - 18 - 541 + 7 + 553 + + + 11 + 13 + 33 @@ -2948,7 +2958,7 @@ 1 2 - 6468 + 6400 2 @@ -2967,9 +2977,9 @@ 12 - 1 - 2 - 22 + 2 + 3 + 33 4 @@ -2977,18 +2987,13 @@ 11 - 5 - 6 - 11 - - - 9 - 10 + 8 + 9 11 - 12 - 13 + 13 + 14 22 @@ -2997,18 +3002,23 @@ 11 - 153 - 154 + 159 + 160 11 177 178 - 22 + 11 - 261 - 262 + 185 + 186 + 11 + + + 247 + 248 11 @@ -3023,9 +3033,9 @@ 12 - 1 - 2 - 22 + 2 + 3 + 33 4 @@ -3033,19 +3043,19 @@ 11 - 5 - 6 + 8 + 9 11 - 9 - 10 + 12 + 13 11 - 12 - 13 - 22 + 13 + 14 + 11 49 @@ -3053,23 +3063,23 @@ 11 - 106 - 107 + 112 + 113 11 - 127 - 128 + 124 + 125 11 - 135 - 136 + 145 + 146 11 - 236 - 237 + 218 + 219 11 @@ -12346,15 +12356,15 @@ inmacroexpansion - 109779198 + 109779137 id - 18027369 + 18027366 inv - 2700171 + 2700175 @@ -12368,32 +12378,32 @@ 1 3 - 1581956 + 1581965 3 5 - 1077799 + 1077798 5 6 - 1184884 + 1184883 6 7 - 4819927 + 4819923 7 8 - 6385963 + 6385959 8 9 - 2605255 + 2605253 9 @@ -12414,12 +12424,12 @@ 1 2 - 378424 + 378428 2 3 - 544108 + 544105 3 @@ -12429,7 +12439,7 @@ 4 7 - 200659 + 200660 7 @@ -12449,12 +12459,12 @@ 10 11 - 325487 + 325486 11 337 - 224847 + 224849 339 @@ -12474,15 +12484,15 @@ affectedbymacroexpansion - 35689096 + 35689082 id - 5156743 + 5156745 inv - 2784774 + 2784776 @@ -12496,12 +12506,12 @@ 1 2 - 2815934 + 2815933 2 3 - 560129 + 560132 3 @@ -12542,7 +12552,7 @@ 1 4 - 229116 + 229120 4 @@ -12557,7 +12567,7 @@ 9 12 - 251088 + 251087 12 @@ -13883,14 +13893,6 @@ traits 3 - - handle - 6 - - - promise - 6 - @@ -13909,38 +13911,6 @@ - - function - handle - - - 12 - - - 1 - 2 - 6 - - - - - - - function - promise - - - 12 - - - 1 - 2 - 6 - - - - - traits function @@ -13967,35 +13937,29 @@ + + + + coroutine_placeholder_variable + 18 + + + placeholder_variable + 18 + + + kind + 3 + + + function + 6 + + + - traits - handle - - - 12 - - - 1 - 2 - 1 - - - 2 - 3 - 1 - - - 3 - 4 - 1 - - - - - - - traits - promise + placeholder_variable + kind 12 @@ -14003,24 +13967,14 @@ 1 2 - 1 - - - 2 - 3 - 1 - - - 3 - 4 - 1 + 18 - handle + placeholder_variable function @@ -14029,70 +13983,54 @@ 1 2 - 6 - - - - - - - handle - traits - - - 12 - - - 1 - 2 - 6 + 18 - handle - promise + kind + placeholder_variable 12 - 1 - 2 - 6 + 6 + 7 + 3 - promise + kind function 12 - 1 - 2 - 6 + 6 + 7 + 3 - promise - traits + function + placeholder_variable 12 - 1 - 2 + 3 + 4 6 @@ -14100,15 +14038,15 @@ - promise - handle + function + kind 12 - 1 - 2 + 3 + 4 6 @@ -18313,7 +18251,7 @@ new - 122753 + 122752 old @@ -18739,11 +18677,11 @@ localvariables - 576947 + 576946 id - 576947 + 576946 type_id @@ -18765,7 +18703,7 @@ 1 2 - 576947 + 576946 @@ -18781,7 +18719,7 @@ 1 2 - 576947 + 576946 @@ -21817,11 +21755,11 @@ usertypes - 5234031 + 5234965 id - 5234031 + 5234965 name @@ -21843,7 +21781,7 @@ 1 2 - 5234031 + 5234965 @@ -21859,7 +21797,7 @@ 1 2 - 5234031 + 5234965 @@ -21916,12 +21854,12 @@ 2 3 - 125586 + 125120 3 7 - 14939 + 15406 @@ -21955,8 +21893,8 @@ 466 - 133 - 134 + 135 + 136 466 @@ -22021,8 +21959,8 @@ 466 - 41 - 42 + 43 + 44 466 @@ -22063,11 +22001,11 @@ usertypesize - 1706394 + 1707327 id - 1706394 + 1707327 size @@ -22089,7 +22027,7 @@ 1 2 - 1706394 + 1707327 @@ -22105,7 +22043,7 @@ 1 2 - 1706394 + 1707327 @@ -22160,7 +22098,7 @@ 740 - 2470 + 2472 933 @@ -22221,8 +22159,8 @@ 466 - 3209 - 3210 + 3211 + 3212 466 @@ -22333,11 +22271,11 @@ mangled_name - 9019378 + 9020312 id - 9019378 + 9020312 mangled_name @@ -22359,7 +22297,7 @@ 1 2 - 9019378 + 9020312 @@ -22375,7 +22313,7 @@ 1 2 - 9019378 + 9020312 @@ -22426,8 +22364,8 @@ 12 - 19319 - 19320 + 19321 + 19322 466 @@ -22465,22 +22403,22 @@ is_standard_layout_class - 1254001 + 1254935 id - 1254001 + 1254935 is_complete - 1645701 + 1646635 id - 1645701 + 1646635 @@ -22998,15 +22936,15 @@ is_proxy_class_for - 62093 + 63026 id - 62093 + 63026 templ_param_id - 62093 + 63026 @@ -23020,7 +22958,7 @@ 1 2 - 62093 + 63026 @@ -23036,7 +22974,7 @@ 1 2 - 62093 + 63026 @@ -24962,11 +24900,11 @@ typespecifiers - 1132149 + 1133083 type_id - 1113941 + 1114875 spec_id @@ -24984,7 +24922,7 @@ 1 2 - 1095733 + 1096667 2 @@ -25030,7 +24968,12 @@ 219 220 - 933 + 466 + + + 221 + 222 + 466 1701 @@ -25045,7 +24988,7 @@ funspecifiers - 10305126 + 10304659 func_id @@ -25072,12 +25015,12 @@ 2 3 - 640539 + 641006 3 4 - 985553 + 985086 4 @@ -25186,8 +25129,8 @@ 466 - 6435 - 6436 + 6434 + 6435 466 @@ -26862,15 +26805,15 @@ unspecifiedtype - 9488111 + 9489045 type_id - 9488111 + 9489045 unspecified_type_id - 6490367 + 6491300 @@ -26884,7 +26827,7 @@ 1 2 - 9488111 + 9489045 @@ -26900,7 +26843,7 @@ 1 2 - 4558943 + 4559877 2 @@ -28814,15 +28757,15 @@ exprconv - 7033025 + 7033022 converted - 7033025 + 7033022 conversion - 7033025 + 7033022 @@ -28836,7 +28779,7 @@ 1 2 - 7033025 + 7033022 @@ -28852,7 +28795,7 @@ 1 2 - 7033025 + 7033022 @@ -29857,7 +29800,7 @@ qualifyingelement - 97538 + 97519 location @@ -29971,7 +29914,7 @@ 1 2 - 58420 + 58401 2 @@ -30007,7 +29950,7 @@ 1 2 - 58420 + 58401 2 @@ -30043,7 +29986,7 @@ 1 2 - 63834 + 63815 2 @@ -30156,12 +30099,12 @@ 1 2 - 137055 + 137074 2 3 - 55703 + 55684 3 @@ -30282,7 +30225,7 @@ fun - 511325 + 511344 @@ -30317,12 +30260,12 @@ 1 2 - 315052 + 315090 2 3 - 77912 + 77893 3 @@ -30625,15 +30568,15 @@ expr_cond_guard - 657238 + 657237 cond - 657238 + 657237 guard - 657238 + 657237 @@ -30647,7 +30590,7 @@ 1 2 - 657238 + 657237 @@ -30663,7 +30606,7 @@ 1 2 - 657238 + 657237 @@ -30721,15 +30664,15 @@ expr_cond_false - 657238 + 657237 cond - 657238 + 657237 false - 657238 + 657237 @@ -30743,7 +30686,7 @@ 1 2 - 657238 + 657237 @@ -30759,7 +30702,7 @@ 1 2 - 657238 + 657237 @@ -36328,11 +36271,11 @@ stmt_decl_bind - 580844 + 580843 stmt - 541062 + 541061 num @@ -36340,7 +36283,7 @@ decl - 580740 + 580739 @@ -36354,7 +36297,7 @@ 1 2 - 520373 + 520372 2 @@ -36375,7 +36318,7 @@ 1 2 - 520373 + 520372 2 @@ -36578,7 +36521,7 @@ 1 2 - 580703 + 580702 2 @@ -36599,7 +36542,7 @@ 1 2 - 580740 + 580739 @@ -36609,11 +36552,11 @@ stmt_decl_entry_bind - 580844 + 580843 stmt - 541062 + 541061 num @@ -36621,7 +36564,7 @@ decl_entry - 580786 + 580785 @@ -36635,7 +36578,7 @@ 1 2 - 520373 + 520372 2 @@ -36656,7 +36599,7 @@ 1 2 - 520373 + 520372 2 @@ -36859,7 +36802,7 @@ 1 2 - 580765 + 580764 3 @@ -36880,7 +36823,7 @@ 1 2 - 580786 + 580785 diff --git a/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/old.dbscheme b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/old.dbscheme new file mode 100644 index 000000000000..0fea0ee7026c --- /dev/null +++ b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/old.dbscheme @@ -0,0 +1,2319 @@ + +/** + * 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, + int handle: @variable ref, + int promise: @variable 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: @functionorblock 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 +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int 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 +; + +@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 + ; + +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 +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock 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/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..7ff6a6e53dbc --- /dev/null +++ b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/semmlecode.cpp.dbscheme @@ -0,0 +1,2315 @@ + +/** + * 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: @functionorblock 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 +; + +@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 + ; + +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 +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock 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/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrade.properties b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrade.properties new file mode 100644 index 000000000000..fcd771ec8549 --- /dev/null +++ b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrade.properties @@ -0,0 +1,4 @@ +description: Improve handling of coroutine placeholder variables +compatibility: partial +coroutine.rel: run upgrades.qlo new_coroutine +coroutine_placeholder_variable.rel: run upgrades.qlo new_coroutine_placeholder_variable diff --git a/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrades.ql b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrades.ql new file mode 100644 index 000000000000..d34a7c787ae9 --- /dev/null +++ b/cpp/ql/lib/upgrades/0fea0ee7026c7c3f7d6faef4df4bf67847b67d71/upgrades.ql @@ -0,0 +1,19 @@ +class Function extends @function { + string toString() { none() } +} + +class Type extends @type { + string toString() { none() } +} + +class Variable extends @variable { + string toString() { none() } +} + +query predicate new_coroutine(Function func, Type traits) { coroutine(func, traits, _, _) } + +query predicate new_coroutine_placeholder_variable(Variable var, int kind, Function func) { + coroutine(func, _, var, _) and kind = 1 + or + coroutine(func, _, _, var) and kind = 2 +} diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 51d5c943c4cc..dedc58394f96 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -785,66 +785,65 @@ coroutines.cpp: #-----| Block 1 #-----| m0_4(unknown) = Phi : from 0:~m87_34, from 2:~m87_61 #-----| r0_5(bool) = Constant[1] : -#-----| r0_6(glval) = VariableAddress : -#-----| m0_7(bool) = Store[?] : &:r0_6, r0_5 -#-----| m0_8(unknown) = Chi : total:m0_4, partial:m0_7 +#-----| r0_6(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_7(bool) = Store[(unnamed local variable)] : &:r0_6, r0_5 # 87| r87_36(suspend_always *) = CopyValue : r87_27 # 87| r87_37(glval) = CopyValue : r87_36 -#-----| r0_9(glval) = Convert : r87_37 +#-----| r0_8(glval) = Convert : r87_37 # 87| r87_38(glval) = FunctionAddress[await_resume] : -# 87| v87_39(void) = Call[await_resume] : func:r87_38, this:r0_9 -# 87| m87_40(unknown) = ^CallSideEffect : ~m0_8 -# 87| m87_41(unknown) = Chi : total:m0_8, partial:m87_40 -#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m87_41 -#-----| v0_11(void) = CopyValue : v87_39 -#-----| r0_12(glval) = VariableAddress[(unnamed local variable)] : -#-----| r0_13(glval) = FunctionAddress[return_void] : -#-----| v0_14(void) = Call[return_void] : func:r0_13, this:r0_12 -#-----| m0_15(unknown) = ^CallSideEffect : ~m87_41 -#-----| m0_16(unknown) = Chi : total:m87_41, partial:m0_15 -#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m0_16 -#-----| m0_18(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_12 -#-----| m0_19(unknown) = Chi : total:m0_16, partial:m0_18 +# 87| v87_39(void) = Call[await_resume] : func:r87_38, this:r0_8 +# 87| m87_40(unknown) = ^CallSideEffect : ~m0_4 +# 87| m87_41(unknown) = Chi : total:m0_4, partial:m87_40 +#-----| v0_9(void) = ^IndirectReadSideEffect[-1] : &:r0_8, ~m87_41 +#-----| v0_10(void) = CopyValue : v87_39 +#-----| r0_11(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_12(glval) = FunctionAddress[return_void] : +#-----| v0_13(void) = Call[return_void] : func:r0_12, this:r0_11 +#-----| m0_14(unknown) = ^CallSideEffect : ~m87_41 +#-----| m0_15(unknown) = Chi : total:m87_41, partial:m0_14 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~m0_15 +#-----| m0_17(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_11 +#-----| m0_18(unknown) = Chi : total:m0_15, partial:m0_17 # 88| v88_1(void) = NoOp : -#-----| v0_20(void) = NoOp : +#-----| v0_19(void) = NoOp : #-----| Goto (back edge) -> Block 3 # 87| Block 2 -# 87| r87_42(suspend_always *) = CopyValue : r87_27 -# 87| r87_43(glval) = CopyValue : r87_42 -#-----| r0_21(glval) = Convert : r87_43 -# 87| r87_44(glval) = FunctionAddress[await_suspend] : -# 87| r87_45(glval>) = VariableAddress[#temp87:20] : -# 87| m87_46(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_45 -# 87| m87_47(unknown) = Chi : total:m87_34, partial:m87_46 -# 87| r87_48(glval) = FunctionAddress[coroutine_handle] : -# 87| r87_49(glval>) = VariableAddress : -# 87| r87_50(glval>) = Convert : r87_49 -# 87| r87_51(coroutine_handle &) = CopyValue : r87_50 -# 87| v87_52(void) = Call[coroutine_handle] : func:r87_48, this:r87_45, 0:r87_51 -# 87| m87_53(unknown) = ^CallSideEffect : ~m87_47 -# 87| m87_54(unknown) = Chi : total:m87_47, partial:m87_53 -# 87| v87_55(void) = ^BufferReadSideEffect[0] : &:r87_51, ~m87_54 -# 87| m87_56(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_45 -# 87| m87_57(unknown) = Chi : total:m87_54, partial:m87_56 -# 87| r87_58(coroutine_handle) = Load[#temp87:20] : &:r87_45, ~m87_57 -# 87| v87_59(void) = Call[await_suspend] : func:r87_44, this:r0_21, 0:r87_58 -# 87| m87_60(unknown) = ^CallSideEffect : ~m87_57 -# 87| m87_61(unknown) = Chi : total:m87_57, partial:m87_60 -#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m87_61 +# 87| r87_42(suspend_always *) = CopyValue : r87_27 +# 87| r87_43(glval) = CopyValue : r87_42 +#-----| r0_20(glval) = Convert : r87_43 +# 87| r87_44(glval) = FunctionAddress[await_suspend] : +# 87| r87_45(glval>) = VariableAddress[#temp87:20] : +# 87| m87_46(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_45 +# 87| m87_47(unknown) = Chi : total:m87_34, partial:m87_46 +# 87| r87_48(glval) = FunctionAddress[coroutine_handle] : +# 87| r87_49(glval>) = VariableAddress[(unnamed local variable)] : +# 87| r87_50(glval>) = Convert : r87_49 +# 87| r87_51(coroutine_handle &) = CopyValue : r87_50 +# 87| v87_52(void) = Call[coroutine_handle] : func:r87_48, this:r87_45, 0:r87_51 +# 87| m87_53(unknown) = ^CallSideEffect : ~m87_47 +# 87| m87_54(unknown) = Chi : total:m87_47, partial:m87_53 +# 87| v87_55(void) = ^BufferReadSideEffect[0] : &:r87_51, ~m87_54 +# 87| m87_56(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_45 +# 87| m87_57(unknown) = Chi : total:m87_54, partial:m87_56 +# 87| r87_58(coroutine_handle) = Load[#temp87:20] : &:r87_45, ~m87_57 +# 87| v87_59(void) = Call[await_suspend] : func:r87_44, this:r0_20, 0:r87_58 +# 87| m87_60(unknown) = ^CallSideEffect : ~m87_57 +# 87| m87_61(unknown) = Chi : total:m87_57, partial:m87_60 +#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m87_61 #-----| Goto -> Block 1 #-----| Block 3 -#-----| v0_23(void) = NoOp : +#-----| v0_22(void) = NoOp : # 87| r87_62(glval) = VariableAddress[(unnamed local variable)] : # 87| r87_63(glval) = FunctionAddress[final_suspend] : # 87| r87_64(suspend_always) = Call[final_suspend] : func:r87_63, this:r87_62 -# 87| m87_65(unknown) = ^CallSideEffect : ~m0_19 -# 87| m87_66(unknown) = Chi : total:m0_19, partial:m87_65 +# 87| m87_65(unknown) = ^CallSideEffect : ~m0_18 +# 87| m87_66(unknown) = Chi : total:m0_18, partial:m87_65 # 87| v87_67(void) = ^IndirectReadSideEffect[-1] : &:r87_62, ~m87_66 # 87| m87_68(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r87_62 # 87| m87_69(unknown) = Chi : total:m87_66, partial:m87_68 -#-----| r0_24(glval) = VariableAddress[#temp0:0] : +#-----| r0_23(glval) = VariableAddress[#temp0:0] : # 87| r87_70(glval) = VariableAddress[#temp87:20] : # 87| r87_71(glval) = VariableAddress[(unnamed local variable)] : # 87| r87_72(glval) = FunctionAddress[final_suspend] : @@ -857,16 +856,16 @@ coroutines.cpp: # 87| m87_79(suspend_always) = Store[#temp87:20] : &:r87_70, r87_73 # 87| m87_80(unknown) = Chi : total:m87_78, partial:m87_79 # 87| r87_81(suspend_always *) = CopyValue : r87_70 -# 87| m87_82(suspend_always *) = Store[#temp0:0] : &:r0_24, r87_81 -#-----| r0_25(suspend_always *) = Load[#temp0:0] : &:r0_24, m87_82 -# 87| r87_83(glval) = CopyValue : r0_25 +# 87| m87_82(suspend_always *) = Store[#temp0:0] : &:r0_23, r87_81 +#-----| r0_24(suspend_always *) = Load[#temp0:0] : &:r0_23, m87_82 +# 87| r87_83(glval) = CopyValue : r0_24 # 87| r87_84(glval) = Convert : r87_83 # 87| r87_85(glval) = FunctionAddress[await_ready] : # 87| r87_86(bool) = Call[await_ready] : func:r87_85, this:r87_84 # 87| m87_87(unknown) = ^CallSideEffect : ~m87_80 # 87| m87_88(unknown) = Chi : total:m87_80, partial:m87_87 # 87| v87_89(void) = ^IndirectReadSideEffect[-1] : &:r87_84, ~m87_88 -#-----| v0_26(void) = ConditionalBranch : r87_86 +#-----| v0_25(void) = ConditionalBranch : r87_86 #-----| False -> Block 5 #-----| True -> Block 4 @@ -874,40 +873,40 @@ coroutines.cpp: # 87| m87_90(unknown) = Phi : from 3:~m87_88, from 5:~m87_120 # 87| r87_91(suspend_always *) = CopyValue : r87_81 # 87| r87_92(glval) = CopyValue : r87_91 -#-----| r0_27(glval) = Convert : r87_92 +#-----| r0_26(glval) = Convert : r87_92 # 87| r87_93(glval) = FunctionAddress[await_resume] : -# 87| v87_94(void) = Call[await_resume] : func:r87_93, this:r0_27 +# 87| v87_94(void) = Call[await_resume] : func:r87_93, this:r0_26 # 87| m87_95(unknown) = ^CallSideEffect : ~m87_90 # 87| m87_96(unknown) = Chi : total:m87_90, partial:m87_95 -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m87_96 +#-----| v0_27(void) = ^IndirectReadSideEffect[-1] : &:r0_26, ~m87_96 # 87| r87_97(glval) = VariableAddress[#return] : # 87| v87_98(void) = ReturnValue : &:r87_97, ~m87_96 # 87| v87_99(void) = AliasedUse : ~m87_96 # 87| v87_100(void) = ExitFunction : # 87| Block 5 -# 87| r87_101(suspend_always *) = CopyValue : r87_81 -# 87| r87_102(glval) = CopyValue : r87_101 -#-----| r0_29(glval) = Convert : r87_102 -# 87| r87_103(glval) = FunctionAddress[await_suspend] : -# 87| r87_104(glval>) = VariableAddress[#temp87:20] : -# 87| m87_105(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_104 -# 87| m87_106(unknown) = Chi : total:m87_88, partial:m87_105 -# 87| r87_107(glval) = FunctionAddress[coroutine_handle] : -# 87| r87_108(glval>) = VariableAddress : -# 87| r87_109(glval>) = Convert : r87_108 -# 87| r87_110(coroutine_handle &) = CopyValue : r87_109 -# 87| v87_111(void) = Call[coroutine_handle] : func:r87_107, this:r87_104, 0:r87_110 -# 87| m87_112(unknown) = ^CallSideEffect : ~m87_106 -# 87| m87_113(unknown) = Chi : total:m87_106, partial:m87_112 -# 87| v87_114(void) = ^BufferReadSideEffect[0] : &:r87_110, ~m87_113 -# 87| m87_115(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_104 -# 87| m87_116(unknown) = Chi : total:m87_113, partial:m87_115 -# 87| r87_117(coroutine_handle) = Load[#temp87:20] : &:r87_104, ~m87_116 -# 87| v87_118(void) = Call[await_suspend] : func:r87_103, this:r0_29, 0:r87_117 -# 87| m87_119(unknown) = ^CallSideEffect : ~m87_116 -# 87| m87_120(unknown) = Chi : total:m87_116, partial:m87_119 -#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_29, ~m87_120 +# 87| r87_101(suspend_always *) = CopyValue : r87_81 +# 87| r87_102(glval) = CopyValue : r87_101 +#-----| r0_28(glval) = Convert : r87_102 +# 87| r87_103(glval) = FunctionAddress[await_suspend] : +# 87| r87_104(glval>) = VariableAddress[#temp87:20] : +# 87| m87_105(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_104 +# 87| m87_106(unknown) = Chi : total:m87_88, partial:m87_105 +# 87| r87_107(glval) = FunctionAddress[coroutine_handle] : +# 87| r87_108(glval>) = VariableAddress[(unnamed local variable)] : +# 87| r87_109(glval>) = Convert : r87_108 +# 87| r87_110(coroutine_handle &) = CopyValue : r87_109 +# 87| v87_111(void) = Call[coroutine_handle] : func:r87_107, this:r87_104, 0:r87_110 +# 87| m87_112(unknown) = ^CallSideEffect : ~m87_106 +# 87| m87_113(unknown) = Chi : total:m87_106, partial:m87_112 +# 87| v87_114(void) = ^BufferReadSideEffect[0] : &:r87_110, ~m87_113 +# 87| m87_115(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_104 +# 87| m87_116(unknown) = Chi : total:m87_113, partial:m87_115 +# 87| r87_117(coroutine_handle) = Load[#temp87:20] : &:r87_104, ~m87_116 +# 87| v87_118(void) = Call[await_suspend] : func:r87_103, this:r0_28, 0:r87_117 +# 87| m87_119(unknown) = ^CallSideEffect : ~m87_116 +# 87| m87_120(unknown) = Chi : total:m87_116, partial:m87_119 +#-----| v0_29(void) = ^IndirectReadSideEffect[-1] : &:r0_28, ~m87_120 #-----| Goto -> Block 4 # 91| co_returnable_value co_return_int(int) @@ -962,68 +961,67 @@ coroutines.cpp: #-----| Block 1 #-----| m0_8(unknown) = Phi : from 0:~m91_36, from 2:~m91_63 #-----| r0_9(bool) = Constant[1] : -#-----| r0_10(glval) = VariableAddress : -#-----| m0_11(bool) = Store[?] : &:r0_10, r0_9 -#-----| m0_12(unknown) = Chi : total:m0_8, partial:m0_11 +#-----| r0_10(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_11(bool) = Store[(unnamed local variable)] : &:r0_10, r0_9 # 91| r91_38(suspend_always *) = CopyValue : r91_29 # 91| r91_39(glval) = CopyValue : r91_38 -#-----| r0_13(glval) = Convert : r91_39 +#-----| r0_12(glval) = Convert : r91_39 # 91| r91_40(glval) = FunctionAddress[await_resume] : -# 91| v91_41(void) = Call[await_resume] : func:r91_40, this:r0_13 -# 91| m91_42(unknown) = ^CallSideEffect : ~m0_12 -# 91| m91_43(unknown) = Chi : total:m0_12, partial:m91_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, ~m91_43 -#-----| v0_15(void) = CopyValue : v91_41 -#-----| r0_16(glval) = VariableAddress[(unnamed local variable)] : -#-----| r0_17(glval) = FunctionAddress[return_value] : +# 91| v91_41(void) = Call[await_resume] : func:r91_40, this:r0_12 +# 91| m91_42(unknown) = ^CallSideEffect : ~m0_8 +# 91| m91_43(unknown) = Chi : total:m0_8, partial:m91_42 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m91_43 +#-----| v0_14(void) = CopyValue : v91_41 +#-----| r0_15(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_16(glval) = FunctionAddress[return_value] : # 92| r92_1(glval) = VariableAddress[i] : # 92| r92_2(int) = Load[i] : &:r92_1, m0_4 -#-----| v0_18(void) = Call[return_value] : func:r0_17, this:r0_16, 0:r92_2 -#-----| m0_19(unknown) = ^CallSideEffect : ~m91_43 -#-----| m0_20(unknown) = Chi : total:m91_43, partial:m0_19 -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m0_20 -#-----| m0_22(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_16 -#-----| m0_23(unknown) = Chi : total:m0_20, partial:m0_22 +#-----| v0_17(void) = Call[return_value] : func:r0_16, this:r0_15, 0:r92_2 +#-----| m0_18(unknown) = ^CallSideEffect : ~m91_43 +#-----| m0_19(unknown) = Chi : total:m91_43, partial:m0_18 +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m0_19 +#-----| m0_21(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_15 +#-----| m0_22(unknown) = Chi : total:m0_19, partial:m0_21 # 92| v92_3(void) = NoOp : -#-----| v0_24(void) = NoOp : +#-----| v0_23(void) = NoOp : #-----| Goto (back edge) -> Block 3 # 91| Block 2 -# 91| r91_44(suspend_always *) = CopyValue : r91_29 -# 91| r91_45(glval) = CopyValue : r91_44 -#-----| r0_25(glval) = Convert : r91_45 -# 91| r91_46(glval) = FunctionAddress[await_suspend] : -# 91| r91_47(glval>) = VariableAddress[#temp91:21] : -# 91| m91_48(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_47 -# 91| m91_49(unknown) = Chi : total:m91_36, partial:m91_48 -# 91| r91_50(glval) = FunctionAddress[coroutine_handle] : -# 91| r91_51(glval>) = VariableAddress : -# 91| r91_52(glval>) = Convert : r91_51 -# 91| r91_53(coroutine_handle &) = CopyValue : r91_52 -# 91| v91_54(void) = Call[coroutine_handle] : func:r91_50, this:r91_47, 0:r91_53 -# 91| m91_55(unknown) = ^CallSideEffect : ~m91_49 -# 91| m91_56(unknown) = Chi : total:m91_49, partial:m91_55 -# 91| v91_57(void) = ^BufferReadSideEffect[0] : &:r91_53, ~m91_56 -# 91| m91_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_47 -# 91| m91_59(unknown) = Chi : total:m91_56, partial:m91_58 -# 91| r91_60(coroutine_handle) = Load[#temp91:21] : &:r91_47, ~m91_59 -# 91| v91_61(void) = Call[await_suspend] : func:r91_46, this:r0_25, 0:r91_60 -# 91| m91_62(unknown) = ^CallSideEffect : ~m91_59 -# 91| m91_63(unknown) = Chi : total:m91_59, partial:m91_62 -#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m91_63 +# 91| r91_44(suspend_always *) = CopyValue : r91_29 +# 91| r91_45(glval) = CopyValue : r91_44 +#-----| r0_24(glval) = Convert : r91_45 +# 91| r91_46(glval) = FunctionAddress[await_suspend] : +# 91| r91_47(glval>) = VariableAddress[#temp91:21] : +# 91| m91_48(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_47 +# 91| m91_49(unknown) = Chi : total:m91_36, partial:m91_48 +# 91| r91_50(glval) = FunctionAddress[coroutine_handle] : +# 91| r91_51(glval>) = VariableAddress[(unnamed local variable)] : +# 91| r91_52(glval>) = Convert : r91_51 +# 91| r91_53(coroutine_handle &) = CopyValue : r91_52 +# 91| v91_54(void) = Call[coroutine_handle] : func:r91_50, this:r91_47, 0:r91_53 +# 91| m91_55(unknown) = ^CallSideEffect : ~m91_49 +# 91| m91_56(unknown) = Chi : total:m91_49, partial:m91_55 +# 91| v91_57(void) = ^BufferReadSideEffect[0] : &:r91_53, ~m91_56 +# 91| m91_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_47 +# 91| m91_59(unknown) = Chi : total:m91_56, partial:m91_58 +# 91| r91_60(coroutine_handle) = Load[#temp91:21] : &:r91_47, ~m91_59 +# 91| v91_61(void) = Call[await_suspend] : func:r91_46, this:r0_24, 0:r91_60 +# 91| m91_62(unknown) = ^CallSideEffect : ~m91_59 +# 91| m91_63(unknown) = Chi : total:m91_59, partial:m91_62 +#-----| v0_25(void) = ^IndirectReadSideEffect[-1] : &:r0_24, ~m91_63 #-----| Goto -> Block 1 #-----| Block 3 -#-----| v0_27(void) = NoOp : +#-----| v0_26(void) = NoOp : # 91| r91_64(glval) = VariableAddress[(unnamed local variable)] : # 91| r91_65(glval) = FunctionAddress[final_suspend] : # 91| r91_66(suspend_always) = Call[final_suspend] : func:r91_65, this:r91_64 -# 91| m91_67(unknown) = ^CallSideEffect : ~m0_23 -# 91| m91_68(unknown) = Chi : total:m0_23, partial:m91_67 +# 91| m91_67(unknown) = ^CallSideEffect : ~m0_22 +# 91| m91_68(unknown) = Chi : total:m0_22, partial:m91_67 # 91| v91_69(void) = ^IndirectReadSideEffect[-1] : &:r91_64, ~m91_68 # 91| m91_70(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r91_64 # 91| m91_71(unknown) = Chi : total:m91_68, partial:m91_70 -#-----| r0_28(glval) = VariableAddress[#temp0:0] : +#-----| r0_27(glval) = VariableAddress[#temp0:0] : # 91| r91_72(glval) = VariableAddress[#temp91:21] : # 91| r91_73(glval) = VariableAddress[(unnamed local variable)] : # 91| r91_74(glval) = FunctionAddress[final_suspend] : @@ -1036,16 +1034,16 @@ coroutines.cpp: # 91| m91_81(suspend_always) = Store[#temp91:21] : &:r91_72, r91_75 # 91| m91_82(unknown) = Chi : total:m91_80, partial:m91_81 # 91| r91_83(suspend_always *) = CopyValue : r91_72 -# 91| m91_84(suspend_always *) = Store[#temp0:0] : &:r0_28, r91_83 -#-----| r0_29(suspend_always *) = Load[#temp0:0] : &:r0_28, m91_84 -# 91| r91_85(glval) = CopyValue : r0_29 +# 91| m91_84(suspend_always *) = Store[#temp0:0] : &:r0_27, r91_83 +#-----| r0_28(suspend_always *) = Load[#temp0:0] : &:r0_27, m91_84 +# 91| r91_85(glval) = CopyValue : r0_28 # 91| r91_86(glval) = Convert : r91_85 # 91| r91_87(glval) = FunctionAddress[await_ready] : # 91| r91_88(bool) = Call[await_ready] : func:r91_87, this:r91_86 # 91| m91_89(unknown) = ^CallSideEffect : ~m91_82 # 91| m91_90(unknown) = Chi : total:m91_82, partial:m91_89 # 91| v91_91(void) = ^IndirectReadSideEffect[-1] : &:r91_86, ~m91_90 -#-----| v0_30(void) = ConditionalBranch : r91_88 +#-----| v0_29(void) = ConditionalBranch : r91_88 #-----| False -> Block 5 #-----| True -> Block 4 @@ -1053,40 +1051,40 @@ coroutines.cpp: # 91| m91_92(unknown) = Phi : from 3:~m91_90, from 5:~m91_122 # 91| r91_93(suspend_always *) = CopyValue : r91_83 # 91| r91_94(glval) = CopyValue : r91_93 -#-----| r0_31(glval) = Convert : r91_94 +#-----| r0_30(glval) = Convert : r91_94 # 91| r91_95(glval) = FunctionAddress[await_resume] : -# 91| v91_96(void) = Call[await_resume] : func:r91_95, this:r0_31 +# 91| v91_96(void) = Call[await_resume] : func:r91_95, this:r0_30 # 91| m91_97(unknown) = ^CallSideEffect : ~m91_92 # 91| m91_98(unknown) = Chi : total:m91_92, partial:m91_97 -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m91_98 +#-----| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~m91_98 # 91| r91_99(glval) = VariableAddress[#return] : # 91| v91_100(void) = ReturnValue : &:r91_99, ~m91_98 # 91| v91_101(void) = AliasedUse : ~m91_98 # 91| v91_102(void) = ExitFunction : # 91| Block 5 -# 91| r91_103(suspend_always *) = CopyValue : r91_83 -# 91| r91_104(glval) = CopyValue : r91_103 -#-----| r0_33(glval) = Convert : r91_104 -# 91| r91_105(glval) = FunctionAddress[await_suspend] : -# 91| r91_106(glval>) = VariableAddress[#temp91:21] : -# 91| m91_107(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_106 -# 91| m91_108(unknown) = Chi : total:m91_90, partial:m91_107 -# 91| r91_109(glval) = FunctionAddress[coroutine_handle] : -# 91| r91_110(glval>) = VariableAddress : -# 91| r91_111(glval>) = Convert : r91_110 -# 91| r91_112(coroutine_handle &) = CopyValue : r91_111 -# 91| v91_113(void) = Call[coroutine_handle] : func:r91_109, this:r91_106, 0:r91_112 -# 91| m91_114(unknown) = ^CallSideEffect : ~m91_108 -# 91| m91_115(unknown) = Chi : total:m91_108, partial:m91_114 -# 91| v91_116(void) = ^BufferReadSideEffect[0] : &:r91_112, ~m91_115 -# 91| m91_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_106 -# 91| m91_118(unknown) = Chi : total:m91_115, partial:m91_117 -# 91| r91_119(coroutine_handle) = Load[#temp91:21] : &:r91_106, ~m91_118 -# 91| v91_120(void) = Call[await_suspend] : func:r91_105, this:r0_33, 0:r91_119 -# 91| m91_121(unknown) = ^CallSideEffect : ~m91_118 -# 91| m91_122(unknown) = Chi : total:m91_118, partial:m91_121 -#-----| v0_34(void) = ^IndirectReadSideEffect[-1] : &:r0_33, ~m91_122 +# 91| r91_103(suspend_always *) = CopyValue : r91_83 +# 91| r91_104(glval) = CopyValue : r91_103 +#-----| r0_32(glval) = Convert : r91_104 +# 91| r91_105(glval) = FunctionAddress[await_suspend] : +# 91| r91_106(glval>) = VariableAddress[#temp91:21] : +# 91| m91_107(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_106 +# 91| m91_108(unknown) = Chi : total:m91_90, partial:m91_107 +# 91| r91_109(glval) = FunctionAddress[coroutine_handle] : +# 91| r91_110(glval>) = VariableAddress[(unnamed local variable)] : +# 91| r91_111(glval>) = Convert : r91_110 +# 91| r91_112(coroutine_handle &) = CopyValue : r91_111 +# 91| v91_113(void) = Call[coroutine_handle] : func:r91_109, this:r91_106, 0:r91_112 +# 91| m91_114(unknown) = ^CallSideEffect : ~m91_108 +# 91| m91_115(unknown) = Chi : total:m91_108, partial:m91_114 +# 91| v91_116(void) = ^BufferReadSideEffect[0] : &:r91_112, ~m91_115 +# 91| m91_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_106 +# 91| m91_118(unknown) = Chi : total:m91_115, partial:m91_117 +# 91| r91_119(coroutine_handle) = Load[#temp91:21] : &:r91_106, ~m91_118 +# 91| v91_120(void) = Call[await_suspend] : func:r91_105, this:r0_32, 0:r91_119 +# 91| m91_121(unknown) = ^CallSideEffect : ~m91_118 +# 91| m91_122(unknown) = Chi : total:m91_118, partial:m91_121 +#-----| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_32, ~m91_122 #-----| Goto -> Block 4 # 95| co_returnable_void co_yield_value_void(int) @@ -1141,18 +1139,17 @@ coroutines.cpp: #-----| Block 1 #-----| m0_8(unknown) = Phi : from 0:~m95_36, from 2:~m95_63 #-----| r0_9(bool) = Constant[1] : -#-----| r0_10(glval) = VariableAddress : -#-----| m0_11(bool) = Store[?] : &:r0_10, r0_9 -#-----| m0_12(unknown) = Chi : total:m0_8, partial:m0_11 +#-----| r0_10(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_11(bool) = Store[(unnamed local variable)] : &:r0_10, r0_9 # 95| r95_38(suspend_always *) = CopyValue : r95_29 # 95| r95_39(glval) = CopyValue : r95_38 -#-----| r0_13(glval) = Convert : r95_39 +#-----| r0_12(glval) = Convert : r95_39 # 95| r95_40(glval) = FunctionAddress[await_resume] : -# 95| v95_41(void) = Call[await_resume] : func:r95_40, this:r0_13 -# 95| m95_42(unknown) = ^CallSideEffect : ~m0_12 -# 95| m95_43(unknown) = Chi : total:m0_12, partial:m95_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, ~m95_43 -#-----| v0_15(void) = CopyValue : v95_41 +# 95| v95_41(void) = Call[await_resume] : func:r95_40, this:r0_12 +# 95| m95_42(unknown) = ^CallSideEffect : ~m0_8 +# 95| m95_43(unknown) = Chi : total:m0_8, partial:m95_42 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m95_43 +#-----| v0_14(void) = CopyValue : v95_41 # 96| r96_1(glval) = VariableAddress[(unnamed local variable)] : # 96| r96_2(glval) = FunctionAddress[yield_value] : # 96| r96_3(glval) = VariableAddress[i] : @@ -1163,7 +1160,7 @@ coroutines.cpp: # 96| v96_8(void) = ^IndirectReadSideEffect[-1] : &:r96_1, ~m96_7 # 96| m96_9(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r96_1 # 96| m96_10(unknown) = Chi : total:m96_7, partial:m96_9 -#-----| r0_16(glval) = VariableAddress[#temp0:0] : +#-----| r0_15(glval) = VariableAddress[#temp0:0] : # 96| r96_11(glval) = VariableAddress[#temp96:13] : # 96| r96_12(glval) = VariableAddress[(unnamed local variable)] : # 96| r96_13(glval) = FunctionAddress[yield_value] : @@ -1178,9 +1175,9 @@ coroutines.cpp: # 96| m96_22(suspend_always) = Store[#temp96:13] : &:r96_11, r96_16 # 96| m96_23(unknown) = Chi : total:m96_21, partial:m96_22 # 96| r96_24(suspend_always *) = CopyValue : r96_11 -# 96| m96_25(suspend_always *) = Store[#temp0:0] : &:r0_16, r96_24 -#-----| r0_17(suspend_always *) = Load[#temp0:0] : &:r0_16, m96_25 -# 96| r96_26(glval) = CopyValue : r0_17 +# 96| m96_25(suspend_always *) = Store[#temp0:0] : &:r0_15, r96_24 +#-----| r0_16(suspend_always *) = Load[#temp0:0] : &:r0_15, m96_25 +# 96| r96_26(glval) = CopyValue : r0_16 # 96| r96_27(glval) = Convert : r96_26 # 96| r96_28(glval) = FunctionAddress[await_ready] : # 96| r96_29(bool) = Call[await_ready] : func:r96_28, this:r96_27 @@ -1192,88 +1189,88 @@ coroutines.cpp: #-----| True -> Block 3 # 95| Block 2 -# 95| r95_44(suspend_always *) = CopyValue : r95_29 -# 95| r95_45(glval) = CopyValue : r95_44 -#-----| r0_18(glval) = Convert : r95_45 -# 95| r95_46(glval) = FunctionAddress[await_suspend] : -# 95| r95_47(glval>) = VariableAddress[#temp95:20] : -# 95| m95_48(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_47 -# 95| m95_49(unknown) = Chi : total:m95_36, partial:m95_48 -# 95| r95_50(glval) = FunctionAddress[coroutine_handle] : -# 95| r95_51(glval>) = VariableAddress : -# 95| r95_52(glval>) = Convert : r95_51 -# 95| r95_53(coroutine_handle &) = CopyValue : r95_52 -# 95| v95_54(void) = Call[coroutine_handle] : func:r95_50, this:r95_47, 0:r95_53 -# 95| m95_55(unknown) = ^CallSideEffect : ~m95_49 -# 95| m95_56(unknown) = Chi : total:m95_49, partial:m95_55 -# 95| v95_57(void) = ^BufferReadSideEffect[0] : &:r95_53, ~m95_56 -# 95| m95_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_47 -# 95| m95_59(unknown) = Chi : total:m95_56, partial:m95_58 -# 95| r95_60(coroutine_handle) = Load[#temp95:20] : &:r95_47, ~m95_59 -# 95| v95_61(void) = Call[await_suspend] : func:r95_46, this:r0_18, 0:r95_60 -# 95| m95_62(unknown) = ^CallSideEffect : ~m95_59 -# 95| m95_63(unknown) = Chi : total:m95_59, partial:m95_62 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m95_63 +# 95| r95_44(suspend_always *) = CopyValue : r95_29 +# 95| r95_45(glval) = CopyValue : r95_44 +#-----| r0_17(glval) = Convert : r95_45 +# 95| r95_46(glval) = FunctionAddress[await_suspend] : +# 95| r95_47(glval>) = VariableAddress[#temp95:20] : +# 95| m95_48(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_47 +# 95| m95_49(unknown) = Chi : total:m95_36, partial:m95_48 +# 95| r95_50(glval) = FunctionAddress[coroutine_handle] : +# 95| r95_51(glval>) = VariableAddress[(unnamed local variable)] : +# 95| r95_52(glval>) = Convert : r95_51 +# 95| r95_53(coroutine_handle &) = CopyValue : r95_52 +# 95| v95_54(void) = Call[coroutine_handle] : func:r95_50, this:r95_47, 0:r95_53 +# 95| m95_55(unknown) = ^CallSideEffect : ~m95_49 +# 95| m95_56(unknown) = Chi : total:m95_49, partial:m95_55 +# 95| v95_57(void) = ^BufferReadSideEffect[0] : &:r95_53, ~m95_56 +# 95| m95_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_47 +# 95| m95_59(unknown) = Chi : total:m95_56, partial:m95_58 +# 95| r95_60(coroutine_handle) = Load[#temp95:20] : &:r95_47, ~m95_59 +# 95| v95_61(void) = Call[await_suspend] : func:r95_46, this:r0_17, 0:r95_60 +# 95| m95_62(unknown) = ^CallSideEffect : ~m95_59 +# 95| m95_63(unknown) = Chi : total:m95_59, partial:m95_62 +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m95_63 #-----| Goto -> Block 1 # 96| Block 3 # 96| m96_34(unknown) = Phi : from 1:~m96_31, from 4:~m96_60 # 96| r96_35(suspend_always *) = CopyValue : r96_24 # 96| r96_36(glval) = CopyValue : r96_35 -#-----| r0_20(glval) = Convert : r96_36 +#-----| r0_19(glval) = Convert : r96_36 # 96| r96_37(glval) = FunctionAddress[await_resume] : -# 96| v96_38(void) = Call[await_resume] : func:r96_37, this:r0_20 +# 96| v96_38(void) = Call[await_resume] : func:r96_37, this:r0_19 # 96| m96_39(unknown) = ^CallSideEffect : ~m96_34 # 96| m96_40(unknown) = Chi : total:m96_34, partial:m96_39 -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m96_40 -#-----| r0_22(glval) = VariableAddress[(unnamed local variable)] : -#-----| r0_23(glval) = FunctionAddress[return_void] : -#-----| v0_24(void) = Call[return_void] : func:r0_23, this:r0_22 -#-----| m0_25(unknown) = ^CallSideEffect : ~m96_40 -#-----| m0_26(unknown) = Chi : total:m96_40, partial:m0_25 -#-----| v0_27(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m0_26 -#-----| m0_28(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_22 -#-----| m0_29(unknown) = Chi : total:m0_26, partial:m0_28 +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m96_40 +#-----| r0_21(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_22(glval) = FunctionAddress[return_void] : +#-----| v0_23(void) = Call[return_void] : func:r0_22, this:r0_21 +#-----| m0_24(unknown) = ^CallSideEffect : ~m96_40 +#-----| m0_25(unknown) = Chi : total:m96_40, partial:m0_24 +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m0_25 +#-----| m0_27(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 +#-----| m0_28(unknown) = Chi : total:m0_25, partial:m0_27 # 97| v97_1(void) = NoOp : -#-----| v0_30(void) = NoOp : +#-----| v0_29(void) = NoOp : #-----| Goto (back edge) -> Block 5 # 96| Block 4 -# 96| r96_41(suspend_always *) = CopyValue : r96_24 -# 96| r96_42(glval) = CopyValue : r96_41 -#-----| r0_31(glval) = Convert : r96_42 -# 96| r96_43(glval) = FunctionAddress[await_suspend] : -# 96| r96_44(glval>) = VariableAddress[#temp96:3] : -# 96| m96_45(coroutine_handle) = Uninitialized[#temp96:3] : &:r96_44 -# 96| m96_46(unknown) = Chi : total:m96_31, partial:m96_45 -# 96| r96_47(glval) = FunctionAddress[coroutine_handle] : -# 96| r96_48(glval>) = VariableAddress : -# 96| r96_49(glval>) = Convert : r96_48 -# 96| r96_50(coroutine_handle &) = CopyValue : r96_49 -# 96| v96_51(void) = Call[coroutine_handle] : func:r96_47, this:r96_44, 0:r96_50 -# 96| m96_52(unknown) = ^CallSideEffect : ~m96_46 -# 96| m96_53(unknown) = Chi : total:m96_46, partial:m96_52 -# 96| v96_54(void) = ^BufferReadSideEffect[0] : &:r96_50, ~m96_53 -# 96| m96_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r96_44 -# 96| m96_56(unknown) = Chi : total:m96_53, partial:m96_55 -# 96| r96_57(coroutine_handle) = Load[#temp96:3] : &:r96_44, ~m96_56 -# 96| v96_58(void) = Call[await_suspend] : func:r96_43, this:r0_31, 0:r96_57 -# 96| m96_59(unknown) = ^CallSideEffect : ~m96_56 -# 96| m96_60(unknown) = Chi : total:m96_56, partial:m96_59 -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m96_60 +# 96| r96_41(suspend_always *) = CopyValue : r96_24 +# 96| r96_42(glval) = CopyValue : r96_41 +#-----| r0_30(glval) = Convert : r96_42 +# 96| r96_43(glval) = FunctionAddress[await_suspend] : +# 96| r96_44(glval>) = VariableAddress[#temp96:3] : +# 96| m96_45(coroutine_handle) = Uninitialized[#temp96:3] : &:r96_44 +# 96| m96_46(unknown) = Chi : total:m96_31, partial:m96_45 +# 96| r96_47(glval) = FunctionAddress[coroutine_handle] : +# 96| r96_48(glval>) = VariableAddress[(unnamed local variable)] : +# 96| r96_49(glval>) = Convert : r96_48 +# 96| r96_50(coroutine_handle &) = CopyValue : r96_49 +# 96| v96_51(void) = Call[coroutine_handle] : func:r96_47, this:r96_44, 0:r96_50 +# 96| m96_52(unknown) = ^CallSideEffect : ~m96_46 +# 96| m96_53(unknown) = Chi : total:m96_46, partial:m96_52 +# 96| v96_54(void) = ^BufferReadSideEffect[0] : &:r96_50, ~m96_53 +# 96| m96_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r96_44 +# 96| m96_56(unknown) = Chi : total:m96_53, partial:m96_55 +# 96| r96_57(coroutine_handle) = Load[#temp96:3] : &:r96_44, ~m96_56 +# 96| v96_58(void) = Call[await_suspend] : func:r96_43, this:r0_30, 0:r96_57 +# 96| m96_59(unknown) = ^CallSideEffect : ~m96_56 +# 96| m96_60(unknown) = Chi : total:m96_56, partial:m96_59 +#-----| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~m96_60 #-----| Goto -> Block 3 #-----| Block 5 -#-----| v0_33(void) = NoOp : +#-----| v0_32(void) = NoOp : # 95| r95_64(glval) = VariableAddress[(unnamed local variable)] : # 95| r95_65(glval) = FunctionAddress[final_suspend] : # 95| r95_66(suspend_always) = Call[final_suspend] : func:r95_65, this:r95_64 -# 95| m95_67(unknown) = ^CallSideEffect : ~m0_29 -# 95| m95_68(unknown) = Chi : total:m0_29, partial:m95_67 +# 95| m95_67(unknown) = ^CallSideEffect : ~m0_28 +# 95| m95_68(unknown) = Chi : total:m0_28, partial:m95_67 # 95| v95_69(void) = ^IndirectReadSideEffect[-1] : &:r95_64, ~m95_68 # 95| m95_70(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r95_64 # 95| m95_71(unknown) = Chi : total:m95_68, partial:m95_70 -#-----| r0_34(glval) = VariableAddress[#temp0:0] : +#-----| r0_33(glval) = VariableAddress[#temp0:0] : # 95| r95_72(glval) = VariableAddress[#temp95:20] : # 95| r95_73(glval) = VariableAddress[(unnamed local variable)] : # 95| r95_74(glval) = FunctionAddress[final_suspend] : @@ -1286,16 +1283,16 @@ coroutines.cpp: # 95| m95_81(suspend_always) = Store[#temp95:20] : &:r95_72, r95_75 # 95| m95_82(unknown) = Chi : total:m95_80, partial:m95_81 # 95| r95_83(suspend_always *) = CopyValue : r95_72 -# 95| m95_84(suspend_always *) = Store[#temp0:0] : &:r0_34, r95_83 -#-----| r0_35(suspend_always *) = Load[#temp0:0] : &:r0_34, m95_84 -# 95| r95_85(glval) = CopyValue : r0_35 +# 95| m95_84(suspend_always *) = Store[#temp0:0] : &:r0_33, r95_83 +#-----| r0_34(suspend_always *) = Load[#temp0:0] : &:r0_33, m95_84 +# 95| r95_85(glval) = CopyValue : r0_34 # 95| r95_86(glval) = Convert : r95_85 # 95| r95_87(glval) = FunctionAddress[await_ready] : # 95| r95_88(bool) = Call[await_ready] : func:r95_87, this:r95_86 # 95| m95_89(unknown) = ^CallSideEffect : ~m95_82 # 95| m95_90(unknown) = Chi : total:m95_82, partial:m95_89 # 95| v95_91(void) = ^IndirectReadSideEffect[-1] : &:r95_86, ~m95_90 -#-----| v0_36(void) = ConditionalBranch : r95_88 +#-----| v0_35(void) = ConditionalBranch : r95_88 #-----| False -> Block 7 #-----| True -> Block 6 @@ -1303,40 +1300,40 @@ coroutines.cpp: # 95| m95_92(unknown) = Phi : from 5:~m95_90, from 7:~m95_122 # 95| r95_93(suspend_always *) = CopyValue : r95_83 # 95| r95_94(glval) = CopyValue : r95_93 -#-----| r0_37(glval) = Convert : r95_94 +#-----| r0_36(glval) = Convert : r95_94 # 95| r95_95(glval) = FunctionAddress[await_resume] : -# 95| v95_96(void) = Call[await_resume] : func:r95_95, this:r0_37 +# 95| v95_96(void) = Call[await_resume] : func:r95_95, this:r0_36 # 95| m95_97(unknown) = ^CallSideEffect : ~m95_92 # 95| m95_98(unknown) = Chi : total:m95_92, partial:m95_97 -#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m95_98 +#-----| v0_37(void) = ^IndirectReadSideEffect[-1] : &:r0_36, ~m95_98 # 95| r95_99(glval) = VariableAddress[#return] : # 95| v95_100(void) = ReturnValue : &:r95_99, ~m95_98 # 95| v95_101(void) = AliasedUse : ~m95_98 # 95| v95_102(void) = ExitFunction : # 95| Block 7 -# 95| r95_103(suspend_always *) = CopyValue : r95_83 -# 95| r95_104(glval) = CopyValue : r95_103 -#-----| r0_39(glval) = Convert : r95_104 -# 95| r95_105(glval) = FunctionAddress[await_suspend] : -# 95| r95_106(glval>) = VariableAddress[#temp95:20] : -# 95| m95_107(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_106 -# 95| m95_108(unknown) = Chi : total:m95_90, partial:m95_107 -# 95| r95_109(glval) = FunctionAddress[coroutine_handle] : -# 95| r95_110(glval>) = VariableAddress : -# 95| r95_111(glval>) = Convert : r95_110 -# 95| r95_112(coroutine_handle &) = CopyValue : r95_111 -# 95| v95_113(void) = Call[coroutine_handle] : func:r95_109, this:r95_106, 0:r95_112 -# 95| m95_114(unknown) = ^CallSideEffect : ~m95_108 -# 95| m95_115(unknown) = Chi : total:m95_108, partial:m95_114 -# 95| v95_116(void) = ^BufferReadSideEffect[0] : &:r95_112, ~m95_115 -# 95| m95_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_106 -# 95| m95_118(unknown) = Chi : total:m95_115, partial:m95_117 -# 95| r95_119(coroutine_handle) = Load[#temp95:20] : &:r95_106, ~m95_118 -# 95| v95_120(void) = Call[await_suspend] : func:r95_105, this:r0_39, 0:r95_119 -# 95| m95_121(unknown) = ^CallSideEffect : ~m95_118 -# 95| m95_122(unknown) = Chi : total:m95_118, partial:m95_121 -#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, ~m95_122 +# 95| r95_103(suspend_always *) = CopyValue : r95_83 +# 95| r95_104(glval) = CopyValue : r95_103 +#-----| r0_38(glval) = Convert : r95_104 +# 95| r95_105(glval) = FunctionAddress[await_suspend] : +# 95| r95_106(glval>) = VariableAddress[#temp95:20] : +# 95| m95_107(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_106 +# 95| m95_108(unknown) = Chi : total:m95_90, partial:m95_107 +# 95| r95_109(glval) = FunctionAddress[coroutine_handle] : +# 95| r95_110(glval>) = VariableAddress[(unnamed local variable)] : +# 95| r95_111(glval>) = Convert : r95_110 +# 95| r95_112(coroutine_handle &) = CopyValue : r95_111 +# 95| v95_113(void) = Call[coroutine_handle] : func:r95_109, this:r95_106, 0:r95_112 +# 95| m95_114(unknown) = ^CallSideEffect : ~m95_108 +# 95| m95_115(unknown) = Chi : total:m95_108, partial:m95_114 +# 95| v95_116(void) = ^BufferReadSideEffect[0] : &:r95_112, ~m95_115 +# 95| m95_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_106 +# 95| m95_118(unknown) = Chi : total:m95_115, partial:m95_117 +# 95| r95_119(coroutine_handle) = Load[#temp95:20] : &:r95_106, ~m95_118 +# 95| v95_120(void) = Call[await_suspend] : func:r95_105, this:r0_38, 0:r95_119 +# 95| m95_121(unknown) = ^CallSideEffect : ~m95_118 +# 95| m95_122(unknown) = Chi : total:m95_118, partial:m95_121 +#-----| v0_39(void) = ^IndirectReadSideEffect[-1] : &:r0_38, ~m95_122 #-----| Goto -> Block 6 # 99| co_returnable_value co_yield_value_value(int) @@ -1391,18 +1388,17 @@ coroutines.cpp: #-----| Block 1 #-----| m0_8(unknown) = Phi : from 0:~m99_36, from 2:~m99_63 #-----| r0_9(bool) = Constant[1] : -#-----| r0_10(glval) = VariableAddress : -#-----| m0_11(bool) = Store[?] : &:r0_10, r0_9 -#-----| m0_12(unknown) = Chi : total:m0_8, partial:m0_11 +#-----| r0_10(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_11(bool) = Store[(unnamed local variable)] : &:r0_10, r0_9 # 99| r99_38(suspend_always *) = CopyValue : r99_29 # 99| r99_39(glval) = CopyValue : r99_38 -#-----| r0_13(glval) = Convert : r99_39 +#-----| r0_12(glval) = Convert : r99_39 # 99| r99_40(glval) = FunctionAddress[await_resume] : -# 99| v99_41(void) = Call[await_resume] : func:r99_40, this:r0_13 -# 99| m99_42(unknown) = ^CallSideEffect : ~m0_12 -# 99| m99_43(unknown) = Chi : total:m0_12, partial:m99_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, ~m99_43 -#-----| v0_15(void) = CopyValue : v99_41 +# 99| v99_41(void) = Call[await_resume] : func:r99_40, this:r0_12 +# 99| m99_42(unknown) = ^CallSideEffect : ~m0_8 +# 99| m99_43(unknown) = Chi : total:m0_8, partial:m99_42 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m99_43 +#-----| v0_14(void) = CopyValue : v99_41 # 100| r100_1(glval) = VariableAddress[(unnamed local variable)] : # 100| r100_2(glval) = FunctionAddress[yield_value] : # 100| r100_3(glval) = VariableAddress[i] : @@ -1413,7 +1409,7 @@ coroutines.cpp: # 100| v100_8(void) = ^IndirectReadSideEffect[-1] : &:r100_1, ~m100_7 # 100| m100_9(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r100_1 # 100| m100_10(unknown) = Chi : total:m100_7, partial:m100_9 -#-----| r0_16(glval) = VariableAddress[#temp0:0] : +#-----| r0_15(glval) = VariableAddress[#temp0:0] : # 100| r100_11(glval) = VariableAddress[#temp100:13] : # 100| r100_12(glval) = VariableAddress[(unnamed local variable)] : # 100| r100_13(glval) = FunctionAddress[yield_value] : @@ -1428,9 +1424,9 @@ coroutines.cpp: # 100| m100_22(suspend_always) = Store[#temp100:13] : &:r100_11, r100_16 # 100| m100_23(unknown) = Chi : total:m100_21, partial:m100_22 # 100| r100_24(suspend_always *) = CopyValue : r100_11 -# 100| m100_25(suspend_always *) = Store[#temp0:0] : &:r0_16, r100_24 -#-----| r0_17(suspend_always *) = Load[#temp0:0] : &:r0_16, m100_25 -# 100| r100_26(glval) = CopyValue : r0_17 +# 100| m100_25(suspend_always *) = Store[#temp0:0] : &:r0_15, r100_24 +#-----| r0_16(suspend_always *) = Load[#temp0:0] : &:r0_15, m100_25 +# 100| r100_26(glval) = CopyValue : r0_16 # 100| r100_27(glval) = Convert : r100_26 # 100| r100_28(glval) = FunctionAddress[await_ready] : # 100| r100_29(bool) = Call[await_ready] : func:r100_28, this:r100_27 @@ -1442,41 +1438,41 @@ coroutines.cpp: #-----| True -> Block 3 # 99| Block 2 -# 99| r99_44(suspend_always *) = CopyValue : r99_29 -# 99| r99_45(glval) = CopyValue : r99_44 -#-----| r0_18(glval) = Convert : r99_45 -# 99| r99_46(glval) = FunctionAddress[await_suspend] : -# 99| r99_47(glval>) = VariableAddress[#temp99:21] : -# 99| m99_48(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_47 -# 99| m99_49(unknown) = Chi : total:m99_36, partial:m99_48 -# 99| r99_50(glval) = FunctionAddress[coroutine_handle] : -# 99| r99_51(glval>) = VariableAddress : -# 99| r99_52(glval>) = Convert : r99_51 -# 99| r99_53(coroutine_handle &) = CopyValue : r99_52 -# 99| v99_54(void) = Call[coroutine_handle] : func:r99_50, this:r99_47, 0:r99_53 -# 99| m99_55(unknown) = ^CallSideEffect : ~m99_49 -# 99| m99_56(unknown) = Chi : total:m99_49, partial:m99_55 -# 99| v99_57(void) = ^BufferReadSideEffect[0] : &:r99_53, ~m99_56 -# 99| m99_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_47 -# 99| m99_59(unknown) = Chi : total:m99_56, partial:m99_58 -# 99| r99_60(coroutine_handle) = Load[#temp99:21] : &:r99_47, ~m99_59 -# 99| v99_61(void) = Call[await_suspend] : func:r99_46, this:r0_18, 0:r99_60 -# 99| m99_62(unknown) = ^CallSideEffect : ~m99_59 -# 99| m99_63(unknown) = Chi : total:m99_59, partial:m99_62 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m99_63 +# 99| r99_44(suspend_always *) = CopyValue : r99_29 +# 99| r99_45(glval) = CopyValue : r99_44 +#-----| r0_17(glval) = Convert : r99_45 +# 99| r99_46(glval) = FunctionAddress[await_suspend] : +# 99| r99_47(glval>) = VariableAddress[#temp99:21] : +# 99| m99_48(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_47 +# 99| m99_49(unknown) = Chi : total:m99_36, partial:m99_48 +# 99| r99_50(glval) = FunctionAddress[coroutine_handle] : +# 99| r99_51(glval>) = VariableAddress[(unnamed local variable)] : +# 99| r99_52(glval>) = Convert : r99_51 +# 99| r99_53(coroutine_handle &) = CopyValue : r99_52 +# 99| v99_54(void) = Call[coroutine_handle] : func:r99_50, this:r99_47, 0:r99_53 +# 99| m99_55(unknown) = ^CallSideEffect : ~m99_49 +# 99| m99_56(unknown) = Chi : total:m99_49, partial:m99_55 +# 99| v99_57(void) = ^BufferReadSideEffect[0] : &:r99_53, ~m99_56 +# 99| m99_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_47 +# 99| m99_59(unknown) = Chi : total:m99_56, partial:m99_58 +# 99| r99_60(coroutine_handle) = Load[#temp99:21] : &:r99_47, ~m99_59 +# 99| v99_61(void) = Call[await_suspend] : func:r99_46, this:r0_17, 0:r99_60 +# 99| m99_62(unknown) = ^CallSideEffect : ~m99_59 +# 99| m99_63(unknown) = Chi : total:m99_59, partial:m99_62 +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m99_63 #-----| Goto -> Block 1 # 100| Block 3 # 100| m100_34(unknown) = Phi : from 1:~m100_31, from 4:~m100_60 # 100| r100_35(suspend_always *) = CopyValue : r100_24 # 100| r100_36(glval) = CopyValue : r100_35 -#-----| r0_20(glval) = Convert : r100_36 +#-----| r0_19(glval) = Convert : r100_36 # 100| r100_37(glval) = FunctionAddress[await_resume] : -# 100| v100_38(void) = Call[await_resume] : func:r100_37, this:r0_20 +# 100| v100_38(void) = Call[await_resume] : func:r100_37, this:r0_19 # 100| m100_39(unknown) = ^CallSideEffect : ~m100_34 # 100| m100_40(unknown) = Chi : total:m100_34, partial:m100_39 -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m100_40 -#-----| v0_22(void) = NoOp : +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m100_40 +#-----| v0_21(void) = NoOp : # 99| r99_64(glval) = VariableAddress[(unnamed local variable)] : # 99| r99_65(glval) = FunctionAddress[final_suspend] : # 99| r99_66(suspend_always) = Call[final_suspend] : func:r99_65, this:r99_64 @@ -1485,7 +1481,7 @@ coroutines.cpp: # 99| v99_69(void) = ^IndirectReadSideEffect[-1] : &:r99_64, ~m99_68 # 99| m99_70(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r99_64 # 99| m99_71(unknown) = Chi : total:m99_68, partial:m99_70 -#-----| r0_23(glval) = VariableAddress[#temp0:0] : +#-----| r0_22(glval) = VariableAddress[#temp0:0] : # 99| r99_72(glval) = VariableAddress[#temp99:21] : # 99| r99_73(glval) = VariableAddress[(unnamed local variable)] : # 99| r99_74(glval) = FunctionAddress[final_suspend] : @@ -1498,82 +1494,82 @@ coroutines.cpp: # 99| m99_81(suspend_always) = Store[#temp99:21] : &:r99_72, r99_75 # 99| m99_82(unknown) = Chi : total:m99_80, partial:m99_81 # 99| r99_83(suspend_always *) = CopyValue : r99_72 -# 99| m99_84(suspend_always *) = Store[#temp0:0] : &:r0_23, r99_83 -#-----| r0_24(suspend_always *) = Load[#temp0:0] : &:r0_23, m99_84 -# 99| r99_85(glval) = CopyValue : r0_24 +# 99| m99_84(suspend_always *) = Store[#temp0:0] : &:r0_22, r99_83 +#-----| r0_23(suspend_always *) = Load[#temp0:0] : &:r0_22, m99_84 +# 99| r99_85(glval) = CopyValue : r0_23 # 99| r99_86(glval) = Convert : r99_85 # 99| r99_87(glval) = FunctionAddress[await_ready] : # 99| r99_88(bool) = Call[await_ready] : func:r99_87, this:r99_86 # 99| m99_89(unknown) = ^CallSideEffect : ~m99_82 # 99| m99_90(unknown) = Chi : total:m99_82, partial:m99_89 # 99| v99_91(void) = ^IndirectReadSideEffect[-1] : &:r99_86, ~m99_90 -#-----| v0_25(void) = ConditionalBranch : r99_88 +#-----| v0_24(void) = ConditionalBranch : r99_88 #-----| False -> Block 6 #-----| True -> Block 5 # 100| Block 4 -# 100| r100_41(suspend_always *) = CopyValue : r100_24 -# 100| r100_42(glval) = CopyValue : r100_41 -#-----| r0_26(glval) = Convert : r100_42 -# 100| r100_43(glval) = FunctionAddress[await_suspend] : -# 100| r100_44(glval>) = VariableAddress[#temp100:3] : -# 100| m100_45(coroutine_handle) = Uninitialized[#temp100:3] : &:r100_44 -# 100| m100_46(unknown) = Chi : total:m100_31, partial:m100_45 -# 100| r100_47(glval) = FunctionAddress[coroutine_handle] : -# 100| r100_48(glval>) = VariableAddress : -# 100| r100_49(glval>) = Convert : r100_48 -# 100| r100_50(coroutine_handle &) = CopyValue : r100_49 -# 100| v100_51(void) = Call[coroutine_handle] : func:r100_47, this:r100_44, 0:r100_50 -# 100| m100_52(unknown) = ^CallSideEffect : ~m100_46 -# 100| m100_53(unknown) = Chi : total:m100_46, partial:m100_52 -# 100| v100_54(void) = ^BufferReadSideEffect[0] : &:r100_50, ~m100_53 -# 100| m100_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r100_44 -# 100| m100_56(unknown) = Chi : total:m100_53, partial:m100_55 -# 100| r100_57(coroutine_handle) = Load[#temp100:3] : &:r100_44, ~m100_56 -# 100| v100_58(void) = Call[await_suspend] : func:r100_43, this:r0_26, 0:r100_57 -# 100| m100_59(unknown) = ^CallSideEffect : ~m100_56 -# 100| m100_60(unknown) = Chi : total:m100_56, partial:m100_59 -#-----| v0_27(void) = ^IndirectReadSideEffect[-1] : &:r0_26, ~m100_60 +# 100| r100_41(suspend_always *) = CopyValue : r100_24 +# 100| r100_42(glval) = CopyValue : r100_41 +#-----| r0_25(glval) = Convert : r100_42 +# 100| r100_43(glval) = FunctionAddress[await_suspend] : +# 100| r100_44(glval>) = VariableAddress[#temp100:3] : +# 100| m100_45(coroutine_handle) = Uninitialized[#temp100:3] : &:r100_44 +# 100| m100_46(unknown) = Chi : total:m100_31, partial:m100_45 +# 100| r100_47(glval) = FunctionAddress[coroutine_handle] : +# 100| r100_48(glval>) = VariableAddress[(unnamed local variable)] : +# 100| r100_49(glval>) = Convert : r100_48 +# 100| r100_50(coroutine_handle &) = CopyValue : r100_49 +# 100| v100_51(void) = Call[coroutine_handle] : func:r100_47, this:r100_44, 0:r100_50 +# 100| m100_52(unknown) = ^CallSideEffect : ~m100_46 +# 100| m100_53(unknown) = Chi : total:m100_46, partial:m100_52 +# 100| v100_54(void) = ^BufferReadSideEffect[0] : &:r100_50, ~m100_53 +# 100| m100_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r100_44 +# 100| m100_56(unknown) = Chi : total:m100_53, partial:m100_55 +# 100| r100_57(coroutine_handle) = Load[#temp100:3] : &:r100_44, ~m100_56 +# 100| v100_58(void) = Call[await_suspend] : func:r100_43, this:r0_25, 0:r100_57 +# 100| m100_59(unknown) = ^CallSideEffect : ~m100_56 +# 100| m100_60(unknown) = Chi : total:m100_56, partial:m100_59 +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_25, ~m100_60 #-----| Goto -> Block 3 # 99| Block 5 # 99| m99_92(unknown) = Phi : from 3:~m99_90, from 6:~m99_122 # 99| r99_93(suspend_always *) = CopyValue : r99_83 # 99| r99_94(glval) = CopyValue : r99_93 -#-----| r0_28(glval) = Convert : r99_94 +#-----| r0_27(glval) = Convert : r99_94 # 99| r99_95(glval) = FunctionAddress[await_resume] : -# 99| v99_96(void) = Call[await_resume] : func:r99_95, this:r0_28 +# 99| v99_96(void) = Call[await_resume] : func:r99_95, this:r0_27 # 99| m99_97(unknown) = ^CallSideEffect : ~m99_92 # 99| m99_98(unknown) = Chi : total:m99_92, partial:m99_97 -#-----| v0_29(void) = ^IndirectReadSideEffect[-1] : &:r0_28, ~m99_98 +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m99_98 # 99| r99_99(glval) = VariableAddress[#return] : # 99| v99_100(void) = ReturnValue : &:r99_99, ~m99_98 # 99| v99_101(void) = AliasedUse : ~m99_98 # 99| v99_102(void) = ExitFunction : # 99| Block 6 -# 99| r99_103(suspend_always *) = CopyValue : r99_83 -# 99| r99_104(glval) = CopyValue : r99_103 -#-----| r0_30(glval) = Convert : r99_104 -# 99| r99_105(glval) = FunctionAddress[await_suspend] : -# 99| r99_106(glval>) = VariableAddress[#temp99:21] : -# 99| m99_107(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_106 -# 99| m99_108(unknown) = Chi : total:m99_90, partial:m99_107 -# 99| r99_109(glval) = FunctionAddress[coroutine_handle] : -# 99| r99_110(glval>) = VariableAddress : -# 99| r99_111(glval>) = Convert : r99_110 -# 99| r99_112(coroutine_handle &) = CopyValue : r99_111 -# 99| v99_113(void) = Call[coroutine_handle] : func:r99_109, this:r99_106, 0:r99_112 -# 99| m99_114(unknown) = ^CallSideEffect : ~m99_108 -# 99| m99_115(unknown) = Chi : total:m99_108, partial:m99_114 -# 99| v99_116(void) = ^BufferReadSideEffect[0] : &:r99_112, ~m99_115 -# 99| m99_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_106 -# 99| m99_118(unknown) = Chi : total:m99_115, partial:m99_117 -# 99| r99_119(coroutine_handle) = Load[#temp99:21] : &:r99_106, ~m99_118 -# 99| v99_120(void) = Call[await_suspend] : func:r99_105, this:r0_30, 0:r99_119 -# 99| m99_121(unknown) = ^CallSideEffect : ~m99_118 -# 99| m99_122(unknown) = Chi : total:m99_118, partial:m99_121 -#-----| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~m99_122 +# 99| r99_103(suspend_always *) = CopyValue : r99_83 +# 99| r99_104(glval) = CopyValue : r99_103 +#-----| r0_29(glval) = Convert : r99_104 +# 99| r99_105(glval) = FunctionAddress[await_suspend] : +# 99| r99_106(glval>) = VariableAddress[#temp99:21] : +# 99| m99_107(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_106 +# 99| m99_108(unknown) = Chi : total:m99_90, partial:m99_107 +# 99| r99_109(glval) = FunctionAddress[coroutine_handle] : +# 99| r99_110(glval>) = VariableAddress[(unnamed local variable)] : +# 99| r99_111(glval>) = Convert : r99_110 +# 99| r99_112(coroutine_handle &) = CopyValue : r99_111 +# 99| v99_113(void) = Call[coroutine_handle] : func:r99_109, this:r99_106, 0:r99_112 +# 99| m99_114(unknown) = ^CallSideEffect : ~m99_108 +# 99| m99_115(unknown) = Chi : total:m99_108, partial:m99_114 +# 99| v99_116(void) = ^BufferReadSideEffect[0] : &:r99_112, ~m99_115 +# 99| m99_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_106 +# 99| m99_118(unknown) = Chi : total:m99_115, partial:m99_117 +# 99| r99_119(coroutine_handle) = Load[#temp99:21] : &:r99_106, ~m99_118 +# 99| v99_120(void) = Call[await_suspend] : func:r99_105, this:r0_29, 0:r99_119 +# 99| m99_121(unknown) = ^CallSideEffect : ~m99_118 +# 99| m99_122(unknown) = Chi : total:m99_118, partial:m99_121 +#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_29, ~m99_122 #-----| Goto -> Block 5 # 103| co_returnable_void co_yield_and_return_void(int) @@ -1628,18 +1624,17 @@ coroutines.cpp: #-----| Block 1 #-----| m0_8(unknown) = Phi : from 0:~m103_36, from 2:~m103_63 #-----| r0_9(bool) = Constant[1] : -#-----| r0_10(glval) = VariableAddress : -#-----| m0_11(bool) = Store[?] : &:r0_10, r0_9 -#-----| m0_12(unknown) = Chi : total:m0_8, partial:m0_11 +#-----| r0_10(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_11(bool) = Store[(unnamed local variable)] : &:r0_10, r0_9 # 103| r103_38(suspend_always *) = CopyValue : r103_29 # 103| r103_39(glval) = CopyValue : r103_38 -#-----| r0_13(glval) = Convert : r103_39 +#-----| r0_12(glval) = Convert : r103_39 # 103| r103_40(glval) = FunctionAddress[await_resume] : -# 103| v103_41(void) = Call[await_resume] : func:r103_40, this:r0_13 -# 103| m103_42(unknown) = ^CallSideEffect : ~m0_12 -# 103| m103_43(unknown) = Chi : total:m0_12, partial:m103_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, ~m103_43 -#-----| v0_15(void) = CopyValue : v103_41 +# 103| v103_41(void) = Call[await_resume] : func:r103_40, this:r0_12 +# 103| m103_42(unknown) = ^CallSideEffect : ~m0_8 +# 103| m103_43(unknown) = Chi : total:m0_8, partial:m103_42 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m103_43 +#-----| v0_14(void) = CopyValue : v103_41 # 104| r104_1(glval) = VariableAddress[(unnamed local variable)] : # 104| r104_2(glval) = FunctionAddress[yield_value] : # 104| r104_3(glval) = VariableAddress[i] : @@ -1650,7 +1645,7 @@ coroutines.cpp: # 104| v104_8(void) = ^IndirectReadSideEffect[-1] : &:r104_1, ~m104_7 # 104| m104_9(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r104_1 # 104| m104_10(unknown) = Chi : total:m104_7, partial:m104_9 -#-----| r0_16(glval) = VariableAddress[#temp0:0] : +#-----| r0_15(glval) = VariableAddress[#temp0:0] : # 104| r104_11(glval) = VariableAddress[#temp104:13] : # 104| r104_12(glval) = VariableAddress[(unnamed local variable)] : # 104| r104_13(glval) = FunctionAddress[yield_value] : @@ -1665,9 +1660,9 @@ coroutines.cpp: # 104| m104_22(suspend_always) = Store[#temp104:13] : &:r104_11, r104_16 # 104| m104_23(unknown) = Chi : total:m104_21, partial:m104_22 # 104| r104_24(suspend_always *) = CopyValue : r104_11 -# 104| m104_25(suspend_always *) = Store[#temp0:0] : &:r0_16, r104_24 -#-----| r0_17(suspend_always *) = Load[#temp0:0] : &:r0_16, m104_25 -# 104| r104_26(glval) = CopyValue : r0_17 +# 104| m104_25(suspend_always *) = Store[#temp0:0] : &:r0_15, r104_24 +#-----| r0_16(suspend_always *) = Load[#temp0:0] : &:r0_15, m104_25 +# 104| r104_26(glval) = CopyValue : r0_16 # 104| r104_27(glval) = Convert : r104_26 # 104| r104_28(glval) = FunctionAddress[await_ready] : # 104| r104_29(bool) = Call[await_ready] : func:r104_28, this:r104_27 @@ -1679,88 +1674,88 @@ coroutines.cpp: #-----| True -> Block 3 # 103| Block 2 -# 103| r103_44(suspend_always *) = CopyValue : r103_29 -# 103| r103_45(glval) = CopyValue : r103_44 -#-----| r0_18(glval) = Convert : r103_45 -# 103| r103_46(glval) = FunctionAddress[await_suspend] : -# 103| r103_47(glval>) = VariableAddress[#temp103:20] : -# 103| m103_48(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_47 -# 103| m103_49(unknown) = Chi : total:m103_36, partial:m103_48 -# 103| r103_50(glval) = FunctionAddress[coroutine_handle] : -# 103| r103_51(glval>) = VariableAddress : -# 103| r103_52(glval>) = Convert : r103_51 -# 103| r103_53(coroutine_handle &) = CopyValue : r103_52 -# 103| v103_54(void) = Call[coroutine_handle] : func:r103_50, this:r103_47, 0:r103_53 -# 103| m103_55(unknown) = ^CallSideEffect : ~m103_49 -# 103| m103_56(unknown) = Chi : total:m103_49, partial:m103_55 -# 103| v103_57(void) = ^BufferReadSideEffect[0] : &:r103_53, ~m103_56 -# 103| m103_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_47 -# 103| m103_59(unknown) = Chi : total:m103_56, partial:m103_58 -# 103| r103_60(coroutine_handle) = Load[#temp103:20] : &:r103_47, ~m103_59 -# 103| v103_61(void) = Call[await_suspend] : func:r103_46, this:r0_18, 0:r103_60 -# 103| m103_62(unknown) = ^CallSideEffect : ~m103_59 -# 103| m103_63(unknown) = Chi : total:m103_59, partial:m103_62 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m103_63 +# 103| r103_44(suspend_always *) = CopyValue : r103_29 +# 103| r103_45(glval) = CopyValue : r103_44 +#-----| r0_17(glval) = Convert : r103_45 +# 103| r103_46(glval) = FunctionAddress[await_suspend] : +# 103| r103_47(glval>) = VariableAddress[#temp103:20] : +# 103| m103_48(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_47 +# 103| m103_49(unknown) = Chi : total:m103_36, partial:m103_48 +# 103| r103_50(glval) = FunctionAddress[coroutine_handle] : +# 103| r103_51(glval>) = VariableAddress[(unnamed local variable)] : +# 103| r103_52(glval>) = Convert : r103_51 +# 103| r103_53(coroutine_handle &) = CopyValue : r103_52 +# 103| v103_54(void) = Call[coroutine_handle] : func:r103_50, this:r103_47, 0:r103_53 +# 103| m103_55(unknown) = ^CallSideEffect : ~m103_49 +# 103| m103_56(unknown) = Chi : total:m103_49, partial:m103_55 +# 103| v103_57(void) = ^BufferReadSideEffect[0] : &:r103_53, ~m103_56 +# 103| m103_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_47 +# 103| m103_59(unknown) = Chi : total:m103_56, partial:m103_58 +# 103| r103_60(coroutine_handle) = Load[#temp103:20] : &:r103_47, ~m103_59 +# 103| v103_61(void) = Call[await_suspend] : func:r103_46, this:r0_17, 0:r103_60 +# 103| m103_62(unknown) = ^CallSideEffect : ~m103_59 +# 103| m103_63(unknown) = Chi : total:m103_59, partial:m103_62 +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m103_63 #-----| Goto -> Block 1 # 104| Block 3 # 104| m104_34(unknown) = Phi : from 1:~m104_31, from 4:~m104_60 # 104| r104_35(suspend_always *) = CopyValue : r104_24 # 104| r104_36(glval) = CopyValue : r104_35 -#-----| r0_20(glval) = Convert : r104_36 +#-----| r0_19(glval) = Convert : r104_36 # 104| r104_37(glval) = FunctionAddress[await_resume] : -# 104| v104_38(void) = Call[await_resume] : func:r104_37, this:r0_20 +# 104| v104_38(void) = Call[await_resume] : func:r104_37, this:r0_19 # 104| m104_39(unknown) = ^CallSideEffect : ~m104_34 # 104| m104_40(unknown) = Chi : total:m104_34, partial:m104_39 -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m104_40 -#-----| r0_22(glval) = VariableAddress[(unnamed local variable)] : -#-----| r0_23(glval) = FunctionAddress[return_void] : -#-----| v0_24(void) = Call[return_void] : func:r0_23, this:r0_22 -#-----| m0_25(unknown) = ^CallSideEffect : ~m104_40 -#-----| m0_26(unknown) = Chi : total:m104_40, partial:m0_25 -#-----| v0_27(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m0_26 -#-----| m0_28(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_22 -#-----| m0_29(unknown) = Chi : total:m0_26, partial:m0_28 +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m104_40 +#-----| r0_21(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_22(glval) = FunctionAddress[return_void] : +#-----| v0_23(void) = Call[return_void] : func:r0_22, this:r0_21 +#-----| m0_24(unknown) = ^CallSideEffect : ~m104_40 +#-----| m0_25(unknown) = Chi : total:m104_40, partial:m0_24 +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m0_25 +#-----| m0_27(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 +#-----| m0_28(unknown) = Chi : total:m0_25, partial:m0_27 # 105| v105_1(void) = NoOp : -#-----| v0_30(void) = NoOp : +#-----| v0_29(void) = NoOp : #-----| Goto (back edge) -> Block 5 # 104| Block 4 -# 104| r104_41(suspend_always *) = CopyValue : r104_24 -# 104| r104_42(glval) = CopyValue : r104_41 -#-----| r0_31(glval) = Convert : r104_42 -# 104| r104_43(glval) = FunctionAddress[await_suspend] : -# 104| r104_44(glval>) = VariableAddress[#temp104:3] : -# 104| m104_45(coroutine_handle) = Uninitialized[#temp104:3] : &:r104_44 -# 104| m104_46(unknown) = Chi : total:m104_31, partial:m104_45 -# 104| r104_47(glval) = FunctionAddress[coroutine_handle] : -# 104| r104_48(glval>) = VariableAddress : -# 104| r104_49(glval>) = Convert : r104_48 -# 104| r104_50(coroutine_handle &) = CopyValue : r104_49 -# 104| v104_51(void) = Call[coroutine_handle] : func:r104_47, this:r104_44, 0:r104_50 -# 104| m104_52(unknown) = ^CallSideEffect : ~m104_46 -# 104| m104_53(unknown) = Chi : total:m104_46, partial:m104_52 -# 104| v104_54(void) = ^BufferReadSideEffect[0] : &:r104_50, ~m104_53 -# 104| m104_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r104_44 -# 104| m104_56(unknown) = Chi : total:m104_53, partial:m104_55 -# 104| r104_57(coroutine_handle) = Load[#temp104:3] : &:r104_44, ~m104_56 -# 104| v104_58(void) = Call[await_suspend] : func:r104_43, this:r0_31, 0:r104_57 -# 104| m104_59(unknown) = ^CallSideEffect : ~m104_56 -# 104| m104_60(unknown) = Chi : total:m104_56, partial:m104_59 -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m104_60 +# 104| r104_41(suspend_always *) = CopyValue : r104_24 +# 104| r104_42(glval) = CopyValue : r104_41 +#-----| r0_30(glval) = Convert : r104_42 +# 104| r104_43(glval) = FunctionAddress[await_suspend] : +# 104| r104_44(glval>) = VariableAddress[#temp104:3] : +# 104| m104_45(coroutine_handle) = Uninitialized[#temp104:3] : &:r104_44 +# 104| m104_46(unknown) = Chi : total:m104_31, partial:m104_45 +# 104| r104_47(glval) = FunctionAddress[coroutine_handle] : +# 104| r104_48(glval>) = VariableAddress[(unnamed local variable)] : +# 104| r104_49(glval>) = Convert : r104_48 +# 104| r104_50(coroutine_handle &) = CopyValue : r104_49 +# 104| v104_51(void) = Call[coroutine_handle] : func:r104_47, this:r104_44, 0:r104_50 +# 104| m104_52(unknown) = ^CallSideEffect : ~m104_46 +# 104| m104_53(unknown) = Chi : total:m104_46, partial:m104_52 +# 104| v104_54(void) = ^BufferReadSideEffect[0] : &:r104_50, ~m104_53 +# 104| m104_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r104_44 +# 104| m104_56(unknown) = Chi : total:m104_53, partial:m104_55 +# 104| r104_57(coroutine_handle) = Load[#temp104:3] : &:r104_44, ~m104_56 +# 104| v104_58(void) = Call[await_suspend] : func:r104_43, this:r0_30, 0:r104_57 +# 104| m104_59(unknown) = ^CallSideEffect : ~m104_56 +# 104| m104_60(unknown) = Chi : total:m104_56, partial:m104_59 +#-----| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~m104_60 #-----| Goto -> Block 3 #-----| Block 5 -#-----| v0_33(void) = NoOp : +#-----| v0_32(void) = NoOp : # 103| r103_64(glval) = VariableAddress[(unnamed local variable)] : # 103| r103_65(glval) = FunctionAddress[final_suspend] : # 103| r103_66(suspend_always) = Call[final_suspend] : func:r103_65, this:r103_64 -# 103| m103_67(unknown) = ^CallSideEffect : ~m0_29 -# 103| m103_68(unknown) = Chi : total:m0_29, partial:m103_67 +# 103| m103_67(unknown) = ^CallSideEffect : ~m0_28 +# 103| m103_68(unknown) = Chi : total:m0_28, partial:m103_67 # 103| v103_69(void) = ^IndirectReadSideEffect[-1] : &:r103_64, ~m103_68 # 103| m103_70(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r103_64 # 103| m103_71(unknown) = Chi : total:m103_68, partial:m103_70 -#-----| r0_34(glval) = VariableAddress[#temp0:0] : +#-----| r0_33(glval) = VariableAddress[#temp0:0] : # 103| r103_72(glval) = VariableAddress[#temp103:20] : # 103| r103_73(glval) = VariableAddress[(unnamed local variable)] : # 103| r103_74(glval) = FunctionAddress[final_suspend] : @@ -1773,16 +1768,16 @@ coroutines.cpp: # 103| m103_81(suspend_always) = Store[#temp103:20] : &:r103_72, r103_75 # 103| m103_82(unknown) = Chi : total:m103_80, partial:m103_81 # 103| r103_83(suspend_always *) = CopyValue : r103_72 -# 103| m103_84(suspend_always *) = Store[#temp0:0] : &:r0_34, r103_83 -#-----| r0_35(suspend_always *) = Load[#temp0:0] : &:r0_34, m103_84 -# 103| r103_85(glval) = CopyValue : r0_35 +# 103| m103_84(suspend_always *) = Store[#temp0:0] : &:r0_33, r103_83 +#-----| r0_34(suspend_always *) = Load[#temp0:0] : &:r0_33, m103_84 +# 103| r103_85(glval) = CopyValue : r0_34 # 103| r103_86(glval) = Convert : r103_85 # 103| r103_87(glval) = FunctionAddress[await_ready] : # 103| r103_88(bool) = Call[await_ready] : func:r103_87, this:r103_86 # 103| m103_89(unknown) = ^CallSideEffect : ~m103_82 # 103| m103_90(unknown) = Chi : total:m103_82, partial:m103_89 # 103| v103_91(void) = ^IndirectReadSideEffect[-1] : &:r103_86, ~m103_90 -#-----| v0_36(void) = ConditionalBranch : r103_88 +#-----| v0_35(void) = ConditionalBranch : r103_88 #-----| False -> Block 7 #-----| True -> Block 6 @@ -1790,40 +1785,40 @@ coroutines.cpp: # 103| m103_92(unknown) = Phi : from 5:~m103_90, from 7:~m103_122 # 103| r103_93(suspend_always *) = CopyValue : r103_83 # 103| r103_94(glval) = CopyValue : r103_93 -#-----| r0_37(glval) = Convert : r103_94 +#-----| r0_36(glval) = Convert : r103_94 # 103| r103_95(glval) = FunctionAddress[await_resume] : -# 103| v103_96(void) = Call[await_resume] : func:r103_95, this:r0_37 +# 103| v103_96(void) = Call[await_resume] : func:r103_95, this:r0_36 # 103| m103_97(unknown) = ^CallSideEffect : ~m103_92 # 103| m103_98(unknown) = Chi : total:m103_92, partial:m103_97 -#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m103_98 +#-----| v0_37(void) = ^IndirectReadSideEffect[-1] : &:r0_36, ~m103_98 # 103| r103_99(glval) = VariableAddress[#return] : # 103| v103_100(void) = ReturnValue : &:r103_99, ~m103_98 # 103| v103_101(void) = AliasedUse : ~m103_98 # 103| v103_102(void) = ExitFunction : # 103| Block 7 -# 103| r103_103(suspend_always *) = CopyValue : r103_83 -# 103| r103_104(glval) = CopyValue : r103_103 -#-----| r0_39(glval) = Convert : r103_104 -# 103| r103_105(glval) = FunctionAddress[await_suspend] : -# 103| r103_106(glval>) = VariableAddress[#temp103:20] : -# 103| m103_107(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_106 -# 103| m103_108(unknown) = Chi : total:m103_90, partial:m103_107 -# 103| r103_109(glval) = FunctionAddress[coroutine_handle] : -# 103| r103_110(glval>) = VariableAddress : -# 103| r103_111(glval>) = Convert : r103_110 -# 103| r103_112(coroutine_handle &) = CopyValue : r103_111 -# 103| v103_113(void) = Call[coroutine_handle] : func:r103_109, this:r103_106, 0:r103_112 -# 103| m103_114(unknown) = ^CallSideEffect : ~m103_108 -# 103| m103_115(unknown) = Chi : total:m103_108, partial:m103_114 -# 103| v103_116(void) = ^BufferReadSideEffect[0] : &:r103_112, ~m103_115 -# 103| m103_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_106 -# 103| m103_118(unknown) = Chi : total:m103_115, partial:m103_117 -# 103| r103_119(coroutine_handle) = Load[#temp103:20] : &:r103_106, ~m103_118 -# 103| v103_120(void) = Call[await_suspend] : func:r103_105, this:r0_39, 0:r103_119 -# 103| m103_121(unknown) = ^CallSideEffect : ~m103_118 -# 103| m103_122(unknown) = Chi : total:m103_118, partial:m103_121 -#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, ~m103_122 +# 103| r103_103(suspend_always *) = CopyValue : r103_83 +# 103| r103_104(glval) = CopyValue : r103_103 +#-----| r0_38(glval) = Convert : r103_104 +# 103| r103_105(glval) = FunctionAddress[await_suspend] : +# 103| r103_106(glval>) = VariableAddress[#temp103:20] : +# 103| m103_107(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_106 +# 103| m103_108(unknown) = Chi : total:m103_90, partial:m103_107 +# 103| r103_109(glval) = FunctionAddress[coroutine_handle] : +# 103| r103_110(glval>) = VariableAddress[(unnamed local variable)] : +# 103| r103_111(glval>) = Convert : r103_110 +# 103| r103_112(coroutine_handle &) = CopyValue : r103_111 +# 103| v103_113(void) = Call[coroutine_handle] : func:r103_109, this:r103_106, 0:r103_112 +# 103| m103_114(unknown) = ^CallSideEffect : ~m103_108 +# 103| m103_115(unknown) = Chi : total:m103_108, partial:m103_114 +# 103| v103_116(void) = ^BufferReadSideEffect[0] : &:r103_112, ~m103_115 +# 103| m103_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_106 +# 103| m103_118(unknown) = Chi : total:m103_115, partial:m103_117 +# 103| r103_119(coroutine_handle) = Load[#temp103:20] : &:r103_106, ~m103_118 +# 103| v103_120(void) = Call[await_suspend] : func:r103_105, this:r0_38, 0:r103_119 +# 103| m103_121(unknown) = ^CallSideEffect : ~m103_118 +# 103| m103_122(unknown) = Chi : total:m103_118, partial:m103_121 +#-----| v0_39(void) = ^IndirectReadSideEffect[-1] : &:r0_38, ~m103_122 #-----| Goto -> Block 6 # 108| co_returnable_value co_yield_and_return_value(int) @@ -1878,18 +1873,17 @@ coroutines.cpp: #-----| Block 1 #-----| m0_8(unknown) = Phi : from 0:~m108_36, from 2:~m108_63 #-----| r0_9(bool) = Constant[1] : -#-----| r0_10(glval) = VariableAddress : -#-----| m0_11(bool) = Store[?] : &:r0_10, r0_9 -#-----| m0_12(unknown) = Chi : total:m0_8, partial:m0_11 +#-----| r0_10(glval) = VariableAddress[(unnamed local variable)] : +#-----| m0_11(bool) = Store[(unnamed local variable)] : &:r0_10, r0_9 # 108| r108_38(suspend_always *) = CopyValue : r108_29 # 108| r108_39(glval) = CopyValue : r108_38 -#-----| r0_13(glval) = Convert : r108_39 +#-----| r0_12(glval) = Convert : r108_39 # 108| r108_40(glval) = FunctionAddress[await_resume] : -# 108| v108_41(void) = Call[await_resume] : func:r108_40, this:r0_13 -# 108| m108_42(unknown) = ^CallSideEffect : ~m0_12 -# 108| m108_43(unknown) = Chi : total:m0_12, partial:m108_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_13, ~m108_43 -#-----| v0_15(void) = CopyValue : v108_41 +# 108| v108_41(void) = Call[await_resume] : func:r108_40, this:r0_12 +# 108| m108_42(unknown) = ^CallSideEffect : ~m0_8 +# 108| m108_43(unknown) = Chi : total:m0_8, partial:m108_42 +#-----| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_12, ~m108_43 +#-----| v0_14(void) = CopyValue : v108_41 # 109| r109_1(glval) = VariableAddress[(unnamed local variable)] : # 109| r109_2(glval) = FunctionAddress[yield_value] : # 109| r109_3(glval) = VariableAddress[i] : @@ -1900,7 +1894,7 @@ coroutines.cpp: # 109| v109_8(void) = ^IndirectReadSideEffect[-1] : &:r109_1, ~m109_7 # 109| m109_9(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r109_1 # 109| m109_10(unknown) = Chi : total:m109_7, partial:m109_9 -#-----| r0_16(glval) = VariableAddress[#temp0:0] : +#-----| r0_15(glval) = VariableAddress[#temp0:0] : # 109| r109_11(glval) = VariableAddress[#temp109:13] : # 109| r109_12(glval) = VariableAddress[(unnamed local variable)] : # 109| r109_13(glval) = FunctionAddress[yield_value] : @@ -1915,9 +1909,9 @@ coroutines.cpp: # 109| m109_22(suspend_always) = Store[#temp109:13] : &:r109_11, r109_16 # 109| m109_23(unknown) = Chi : total:m109_21, partial:m109_22 # 109| r109_24(suspend_always *) = CopyValue : r109_11 -# 109| m109_25(suspend_always *) = Store[#temp0:0] : &:r0_16, r109_24 -#-----| r0_17(suspend_always *) = Load[#temp0:0] : &:r0_16, m109_25 -# 109| r109_26(glval) = CopyValue : r0_17 +# 109| m109_25(suspend_always *) = Store[#temp0:0] : &:r0_15, r109_24 +#-----| r0_16(suspend_always *) = Load[#temp0:0] : &:r0_15, m109_25 +# 109| r109_26(glval) = CopyValue : r0_16 # 109| r109_27(glval) = Convert : r109_26 # 109| r109_28(glval) = FunctionAddress[await_ready] : # 109| r109_29(bool) = Call[await_ready] : func:r109_28, this:r109_27 @@ -1929,92 +1923,92 @@ coroutines.cpp: #-----| True -> Block 3 # 108| Block 2 -# 108| r108_44(suspend_always *) = CopyValue : r108_29 -# 108| r108_45(glval) = CopyValue : r108_44 -#-----| r0_18(glval) = Convert : r108_45 -# 108| r108_46(glval) = FunctionAddress[await_suspend] : -# 108| r108_47(glval>) = VariableAddress[#temp108:21] : -# 108| m108_48(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_47 -# 108| m108_49(unknown) = Chi : total:m108_36, partial:m108_48 -# 108| r108_50(glval) = FunctionAddress[coroutine_handle] : -# 108| r108_51(glval>) = VariableAddress : -# 108| r108_52(glval>) = Convert : r108_51 -# 108| r108_53(coroutine_handle &) = CopyValue : r108_52 -# 108| v108_54(void) = Call[coroutine_handle] : func:r108_50, this:r108_47, 0:r108_53 -# 108| m108_55(unknown) = ^CallSideEffect : ~m108_49 -# 108| m108_56(unknown) = Chi : total:m108_49, partial:m108_55 -# 108| v108_57(void) = ^BufferReadSideEffect[0] : &:r108_53, ~m108_56 -# 108| m108_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_47 -# 108| m108_59(unknown) = Chi : total:m108_56, partial:m108_58 -# 108| r108_60(coroutine_handle) = Load[#temp108:21] : &:r108_47, ~m108_59 -# 108| v108_61(void) = Call[await_suspend] : func:r108_46, this:r0_18, 0:r108_60 -# 108| m108_62(unknown) = ^CallSideEffect : ~m108_59 -# 108| m108_63(unknown) = Chi : total:m108_59, partial:m108_62 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m108_63 +# 108| r108_44(suspend_always *) = CopyValue : r108_29 +# 108| r108_45(glval) = CopyValue : r108_44 +#-----| r0_17(glval) = Convert : r108_45 +# 108| r108_46(glval) = FunctionAddress[await_suspend] : +# 108| r108_47(glval>) = VariableAddress[#temp108:21] : +# 108| m108_48(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_47 +# 108| m108_49(unknown) = Chi : total:m108_36, partial:m108_48 +# 108| r108_50(glval) = FunctionAddress[coroutine_handle] : +# 108| r108_51(glval>) = VariableAddress[(unnamed local variable)] : +# 108| r108_52(glval>) = Convert : r108_51 +# 108| r108_53(coroutine_handle &) = CopyValue : r108_52 +# 108| v108_54(void) = Call[coroutine_handle] : func:r108_50, this:r108_47, 0:r108_53 +# 108| m108_55(unknown) = ^CallSideEffect : ~m108_49 +# 108| m108_56(unknown) = Chi : total:m108_49, partial:m108_55 +# 108| v108_57(void) = ^BufferReadSideEffect[0] : &:r108_53, ~m108_56 +# 108| m108_58(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_47 +# 108| m108_59(unknown) = Chi : total:m108_56, partial:m108_58 +# 108| r108_60(coroutine_handle) = Load[#temp108:21] : &:r108_47, ~m108_59 +# 108| v108_61(void) = Call[await_suspend] : func:r108_46, this:r0_17, 0:r108_60 +# 108| m108_62(unknown) = ^CallSideEffect : ~m108_59 +# 108| m108_63(unknown) = Chi : total:m108_59, partial:m108_62 +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m108_63 #-----| Goto -> Block 1 # 109| Block 3 # 109| m109_34(unknown) = Phi : from 1:~m109_31, from 4:~m109_60 # 109| r109_35(suspend_always *) = CopyValue : r109_24 # 109| r109_36(glval) = CopyValue : r109_35 -#-----| r0_20(glval) = Convert : r109_36 +#-----| r0_19(glval) = Convert : r109_36 # 109| r109_37(glval) = FunctionAddress[await_resume] : -# 109| v109_38(void) = Call[await_resume] : func:r109_37, this:r0_20 +# 109| v109_38(void) = Call[await_resume] : func:r109_37, this:r0_19 # 109| m109_39(unknown) = ^CallSideEffect : ~m109_34 # 109| m109_40(unknown) = Chi : total:m109_34, partial:m109_39 -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m109_40 -#-----| r0_22(glval) = VariableAddress[(unnamed local variable)] : -#-----| r0_23(glval) = FunctionAddress[return_value] : +#-----| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~m109_40 +#-----| r0_21(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_22(glval) = FunctionAddress[return_value] : # 110| r110_1(glval) = VariableAddress[i] : # 110| r110_2(int) = Load[i] : &:r110_1, m0_4 # 110| r110_3(int) = Constant[1] : # 110| r110_4(int) = Add : r110_2, r110_3 -#-----| v0_24(void) = Call[return_value] : func:r0_23, this:r0_22, 0:r110_4 -#-----| m0_25(unknown) = ^CallSideEffect : ~m109_40 -#-----| m0_26(unknown) = Chi : total:m109_40, partial:m0_25 -#-----| v0_27(void) = ^IndirectReadSideEffect[-1] : &:r0_22, ~m0_26 -#-----| m0_28(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_22 -#-----| m0_29(unknown) = Chi : total:m0_26, partial:m0_28 +#-----| v0_23(void) = Call[return_value] : func:r0_22, this:r0_21, 0:r110_4 +#-----| m0_24(unknown) = ^CallSideEffect : ~m109_40 +#-----| m0_25(unknown) = Chi : total:m109_40, partial:m0_24 +#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m0_25 +#-----| m0_27(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 +#-----| m0_28(unknown) = Chi : total:m0_25, partial:m0_27 # 110| v110_5(void) = NoOp : -#-----| v0_30(void) = NoOp : +#-----| v0_29(void) = NoOp : #-----| Goto (back edge) -> Block 5 # 109| Block 4 -# 109| r109_41(suspend_always *) = CopyValue : r109_24 -# 109| r109_42(glval) = CopyValue : r109_41 -#-----| r0_31(glval) = Convert : r109_42 -# 109| r109_43(glval) = FunctionAddress[await_suspend] : -# 109| r109_44(glval>) = VariableAddress[#temp109:3] : -# 109| m109_45(coroutine_handle) = Uninitialized[#temp109:3] : &:r109_44 -# 109| m109_46(unknown) = Chi : total:m109_31, partial:m109_45 -# 109| r109_47(glval) = FunctionAddress[coroutine_handle] : -# 109| r109_48(glval>) = VariableAddress : -# 109| r109_49(glval>) = Convert : r109_48 -# 109| r109_50(coroutine_handle &) = CopyValue : r109_49 -# 109| v109_51(void) = Call[coroutine_handle] : func:r109_47, this:r109_44, 0:r109_50 -# 109| m109_52(unknown) = ^CallSideEffect : ~m109_46 -# 109| m109_53(unknown) = Chi : total:m109_46, partial:m109_52 -# 109| v109_54(void) = ^BufferReadSideEffect[0] : &:r109_50, ~m109_53 -# 109| m109_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r109_44 -# 109| m109_56(unknown) = Chi : total:m109_53, partial:m109_55 -# 109| r109_57(coroutine_handle) = Load[#temp109:3] : &:r109_44, ~m109_56 -# 109| v109_58(void) = Call[await_suspend] : func:r109_43, this:r0_31, 0:r109_57 -# 109| m109_59(unknown) = ^CallSideEffect : ~m109_56 -# 109| m109_60(unknown) = Chi : total:m109_56, partial:m109_59 -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m109_60 +# 109| r109_41(suspend_always *) = CopyValue : r109_24 +# 109| r109_42(glval) = CopyValue : r109_41 +#-----| r0_30(glval) = Convert : r109_42 +# 109| r109_43(glval) = FunctionAddress[await_suspend] : +# 109| r109_44(glval>) = VariableAddress[#temp109:3] : +# 109| m109_45(coroutine_handle) = Uninitialized[#temp109:3] : &:r109_44 +# 109| m109_46(unknown) = Chi : total:m109_31, partial:m109_45 +# 109| r109_47(glval) = FunctionAddress[coroutine_handle] : +# 109| r109_48(glval>) = VariableAddress[(unnamed local variable)] : +# 109| r109_49(glval>) = Convert : r109_48 +# 109| r109_50(coroutine_handle &) = CopyValue : r109_49 +# 109| v109_51(void) = Call[coroutine_handle] : func:r109_47, this:r109_44, 0:r109_50 +# 109| m109_52(unknown) = ^CallSideEffect : ~m109_46 +# 109| m109_53(unknown) = Chi : total:m109_46, partial:m109_52 +# 109| v109_54(void) = ^BufferReadSideEffect[0] : &:r109_50, ~m109_53 +# 109| m109_55(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r109_44 +# 109| m109_56(unknown) = Chi : total:m109_53, partial:m109_55 +# 109| r109_57(coroutine_handle) = Load[#temp109:3] : &:r109_44, ~m109_56 +# 109| v109_58(void) = Call[await_suspend] : func:r109_43, this:r0_30, 0:r109_57 +# 109| m109_59(unknown) = ^CallSideEffect : ~m109_56 +# 109| m109_60(unknown) = Chi : total:m109_56, partial:m109_59 +#-----| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~m109_60 #-----| Goto -> Block 3 #-----| Block 5 -#-----| v0_33(void) = NoOp : +#-----| v0_32(void) = NoOp : # 108| r108_64(glval) = VariableAddress[(unnamed local variable)] : # 108| r108_65(glval) = FunctionAddress[final_suspend] : # 108| r108_66(suspend_always) = Call[final_suspend] : func:r108_65, this:r108_64 -# 108| m108_67(unknown) = ^CallSideEffect : ~m0_29 -# 108| m108_68(unknown) = Chi : total:m0_29, partial:m108_67 +# 108| m108_67(unknown) = ^CallSideEffect : ~m0_28 +# 108| m108_68(unknown) = Chi : total:m0_28, partial:m108_67 # 108| v108_69(void) = ^IndirectReadSideEffect[-1] : &:r108_64, ~m108_68 # 108| m108_70(promise_type) = ^IndirectMayWriteSideEffect[-1] : &:r108_64 # 108| m108_71(unknown) = Chi : total:m108_68, partial:m108_70 -#-----| r0_34(glval) = VariableAddress[#temp0:0] : +#-----| r0_33(glval) = VariableAddress[#temp0:0] : # 108| r108_72(glval) = VariableAddress[#temp108:21] : # 108| r108_73(glval) = VariableAddress[(unnamed local variable)] : # 108| r108_74(glval) = FunctionAddress[final_suspend] : @@ -2027,16 +2021,16 @@ coroutines.cpp: # 108| m108_81(suspend_always) = Store[#temp108:21] : &:r108_72, r108_75 # 108| m108_82(unknown) = Chi : total:m108_80, partial:m108_81 # 108| r108_83(suspend_always *) = CopyValue : r108_72 -# 108| m108_84(suspend_always *) = Store[#temp0:0] : &:r0_34, r108_83 -#-----| r0_35(suspend_always *) = Load[#temp0:0] : &:r0_34, m108_84 -# 108| r108_85(glval) = CopyValue : r0_35 +# 108| m108_84(suspend_always *) = Store[#temp0:0] : &:r0_33, r108_83 +#-----| r0_34(suspend_always *) = Load[#temp0:0] : &:r0_33, m108_84 +# 108| r108_85(glval) = CopyValue : r0_34 # 108| r108_86(glval) = Convert : r108_85 # 108| r108_87(glval) = FunctionAddress[await_ready] : # 108| r108_88(bool) = Call[await_ready] : func:r108_87, this:r108_86 # 108| m108_89(unknown) = ^CallSideEffect : ~m108_82 # 108| m108_90(unknown) = Chi : total:m108_82, partial:m108_89 # 108| v108_91(void) = ^IndirectReadSideEffect[-1] : &:r108_86, ~m108_90 -#-----| v0_36(void) = ConditionalBranch : r108_88 +#-----| v0_35(void) = ConditionalBranch : r108_88 #-----| False -> Block 7 #-----| True -> Block 6 @@ -2044,40 +2038,40 @@ coroutines.cpp: # 108| m108_92(unknown) = Phi : from 5:~m108_90, from 7:~m108_122 # 108| r108_93(suspend_always *) = CopyValue : r108_83 # 108| r108_94(glval) = CopyValue : r108_93 -#-----| r0_37(glval) = Convert : r108_94 +#-----| r0_36(glval) = Convert : r108_94 # 108| r108_95(glval) = FunctionAddress[await_resume] : -# 108| v108_96(void) = Call[await_resume] : func:r108_95, this:r0_37 +# 108| v108_96(void) = Call[await_resume] : func:r108_95, this:r0_36 # 108| m108_97(unknown) = ^CallSideEffect : ~m108_92 # 108| m108_98(unknown) = Chi : total:m108_92, partial:m108_97 -#-----| v0_38(void) = ^IndirectReadSideEffect[-1] : &:r0_37, ~m108_98 +#-----| v0_37(void) = ^IndirectReadSideEffect[-1] : &:r0_36, ~m108_98 # 108| r108_99(glval) = VariableAddress[#return] : # 108| v108_100(void) = ReturnValue : &:r108_99, ~m108_98 # 108| v108_101(void) = AliasedUse : ~m108_98 # 108| v108_102(void) = ExitFunction : # 108| Block 7 -# 108| r108_103(suspend_always *) = CopyValue : r108_83 -# 108| r108_104(glval) = CopyValue : r108_103 -#-----| r0_39(glval) = Convert : r108_104 -# 108| r108_105(glval) = FunctionAddress[await_suspend] : -# 108| r108_106(glval>) = VariableAddress[#temp108:21] : -# 108| m108_107(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_106 -# 108| m108_108(unknown) = Chi : total:m108_90, partial:m108_107 -# 108| r108_109(glval) = FunctionAddress[coroutine_handle] : -# 108| r108_110(glval>) = VariableAddress : -# 108| r108_111(glval>) = Convert : r108_110 -# 108| r108_112(coroutine_handle &) = CopyValue : r108_111 -# 108| v108_113(void) = Call[coroutine_handle] : func:r108_109, this:r108_106, 0:r108_112 -# 108| m108_114(unknown) = ^CallSideEffect : ~m108_108 -# 108| m108_115(unknown) = Chi : total:m108_108, partial:m108_114 -# 108| v108_116(void) = ^BufferReadSideEffect[0] : &:r108_112, ~m108_115 -# 108| m108_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_106 -# 108| m108_118(unknown) = Chi : total:m108_115, partial:m108_117 -# 108| r108_119(coroutine_handle) = Load[#temp108:21] : &:r108_106, ~m108_118 -# 108| v108_120(void) = Call[await_suspend] : func:r108_105, this:r0_39, 0:r108_119 -# 108| m108_121(unknown) = ^CallSideEffect : ~m108_118 -# 108| m108_122(unknown) = Chi : total:m108_118, partial:m108_121 -#-----| v0_40(void) = ^IndirectReadSideEffect[-1] : &:r0_39, ~m108_122 +# 108| r108_103(suspend_always *) = CopyValue : r108_83 +# 108| r108_104(glval) = CopyValue : r108_103 +#-----| r0_38(glval) = Convert : r108_104 +# 108| r108_105(glval) = FunctionAddress[await_suspend] : +# 108| r108_106(glval>) = VariableAddress[#temp108:21] : +# 108| m108_107(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_106 +# 108| m108_108(unknown) = Chi : total:m108_90, partial:m108_107 +# 108| r108_109(glval) = FunctionAddress[coroutine_handle] : +# 108| r108_110(glval>) = VariableAddress[(unnamed local variable)] : +# 108| r108_111(glval>) = Convert : r108_110 +# 108| r108_112(coroutine_handle &) = CopyValue : r108_111 +# 108| v108_113(void) = Call[coroutine_handle] : func:r108_109, this:r108_106, 0:r108_112 +# 108| m108_114(unknown) = ^CallSideEffect : ~m108_108 +# 108| m108_115(unknown) = Chi : total:m108_108, partial:m108_114 +# 108| v108_116(void) = ^BufferReadSideEffect[0] : &:r108_112, ~m108_115 +# 108| m108_117(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_106 +# 108| m108_118(unknown) = Chi : total:m108_115, partial:m108_117 +# 108| r108_119(coroutine_handle) = Load[#temp108:21] : &:r108_106, ~m108_118 +# 108| v108_120(void) = Call[await_suspend] : func:r108_105, this:r0_38, 0:r108_119 +# 108| m108_121(unknown) = ^CallSideEffect : ~m108_118 +# 108| m108_122(unknown) = Chi : total:m108_118, partial:m108_121 +#-----| v0_39(void) = ^IndirectReadSideEffect[-1] : &:r0_38, ~m108_122 #-----| Goto -> Block 6 destructors_for_temps.cpp: diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 5a0234a4cc42..199d61f015dc 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -29,26 +29,4 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 5a0234a4cc42..199d61f015dc 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -29,26 +29,4 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index ac1034bfc6c5..26760a15730a 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -38,32 +38,4 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index ab1336a268ab..5e095f3b108d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -770,8 +770,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_4(bool) = Constant[1] : -#-----| r0_5(glval) = VariableAddress : -#-----| mu0_6(bool) = Store[?] : &:r0_5, r0_4 +#-----| r0_5(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_6(bool) = Store[(unnamed local variable)] : &:r0_5, r0_4 # 87| r87_31(suspend_always *) = CopyValue : r87_20 # 87| r87_32(glval) = CopyValue : r87_31 #-----| r0_7(glval) = Convert : r87_32 @@ -791,32 +791,32 @@ coroutines.cpp: #-----| Goto (back edge) -> Block 8 # 87| Block 4 -# 87| r87_36(suspend_always *) = CopyValue : r87_20 -# 87| r87_37(glval) = CopyValue : r87_36 -#-----| r0_17(glval) = Convert : r87_37 -# 87| r87_38(glval) = FunctionAddress[await_suspend] : -# 87| r87_39(glval>) = VariableAddress[#temp87:20] : -# 87| mu87_40(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_39 -# 87| r87_41(glval) = FunctionAddress[coroutine_handle] : -# 87| r87_42(glval>) = VariableAddress : -# 87| r87_43(glval>) = Convert : r87_42 -# 87| r87_44(coroutine_handle &) = CopyValue : r87_43 -# 87| v87_45(void) = Call[coroutine_handle] : func:r87_41, this:r87_39, 0:r87_44 -# 87| mu87_46(unknown) = ^CallSideEffect : ~m? -# 87| v87_47(void) = ^BufferReadSideEffect[0] : &:r87_44, ~m? -# 87| mu87_48(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_39 -# 87| r87_49(coroutine_handle) = Load[#temp87:20] : &:r87_39, ~m? -# 87| v87_50(void) = Call[await_suspend] : func:r87_38, this:r0_17, 0:r87_49 -# 87| mu87_51(unknown) = ^CallSideEffect : ~m? -#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m? +# 87| r87_36(suspend_always *) = CopyValue : r87_20 +# 87| r87_37(glval) = CopyValue : r87_36 +#-----| r0_17(glval) = Convert : r87_37 +# 87| r87_38(glval) = FunctionAddress[await_suspend] : +# 87| r87_39(glval>) = VariableAddress[#temp87:20] : +# 87| mu87_40(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_39 +# 87| r87_41(glval) = FunctionAddress[coroutine_handle] : +# 87| r87_42(glval>) = VariableAddress[(unnamed local variable)] : +# 87| r87_43(glval>) = Convert : r87_42 +# 87| r87_44(coroutine_handle &) = CopyValue : r87_43 +# 87| v87_45(void) = Call[coroutine_handle] : func:r87_41, this:r87_39, 0:r87_44 +# 87| mu87_46(unknown) = ^CallSideEffect : ~m? +# 87| v87_47(void) = ^BufferReadSideEffect[0] : &:r87_44, ~m? +# 87| mu87_48(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_39 +# 87| r87_49(coroutine_handle) = Load[#temp87:20] : &:r87_39, ~m? +# 87| v87_50(void) = Call[await_suspend] : func:r87_38, this:r0_17, 0:r87_49 +# 87| mu87_51(unknown) = ^CallSideEffect : ~m? +#-----| v0_18(void) = ^IndirectReadSideEffect[-1] : &:r0_17, ~m? #-----| Goto -> Block 3 #-----| Block 5 -#-----| v0_19(void) = CatchAny : -#-----| r0_20(glval) = VariableAddress : -#-----| r0_21(bool) = Load[?] : &:r0_20, ~m? -#-----| r0_22(bool) = LogicalNot : r0_21 -#-----| v0_23(void) = ConditionalBranch : r0_22 +#-----| v0_19(void) = CatchAny : +#-----| r0_20(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_21(bool) = Load[(unnamed local variable)] : &:r0_20, ~m? +#-----| r0_22(bool) = LogicalNot : r0_21 +#-----| v0_23(void) = ConditionalBranch : r0_22 #-----| False -> Block 7 #-----| True -> Block 6 @@ -876,24 +876,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 87| Block 10 -# 87| r87_87(suspend_always *) = CopyValue : r87_72 -# 87| r87_88(glval) = CopyValue : r87_87 -#-----| r0_31(glval) = Convert : r87_88 -# 87| r87_89(glval) = FunctionAddress[await_suspend] : -# 87| r87_90(glval>) = VariableAddress[#temp87:20] : -# 87| mu87_91(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_90 -# 87| r87_92(glval) = FunctionAddress[coroutine_handle] : -# 87| r87_93(glval>) = VariableAddress : -# 87| r87_94(glval>) = Convert : r87_93 -# 87| r87_95(coroutine_handle &) = CopyValue : r87_94 -# 87| v87_96(void) = Call[coroutine_handle] : func:r87_92, this:r87_90, 0:r87_95 -# 87| mu87_97(unknown) = ^CallSideEffect : ~m? -# 87| v87_98(void) = ^BufferReadSideEffect[0] : &:r87_95, ~m? -# 87| mu87_99(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_90 -# 87| r87_100(coroutine_handle) = Load[#temp87:20] : &:r87_90, ~m? -# 87| v87_101(void) = Call[await_suspend] : func:r87_89, this:r0_31, 0:r87_100 -# 87| mu87_102(unknown) = ^CallSideEffect : ~m? -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m? +# 87| r87_87(suspend_always *) = CopyValue : r87_72 +# 87| r87_88(glval) = CopyValue : r87_87 +#-----| r0_31(glval) = Convert : r87_88 +# 87| r87_89(glval) = FunctionAddress[await_suspend] : +# 87| r87_90(glval>) = VariableAddress[#temp87:20] : +# 87| mu87_91(coroutine_handle) = Uninitialized[#temp87:20] : &:r87_90 +# 87| r87_92(glval) = FunctionAddress[coroutine_handle] : +# 87| r87_93(glval>) = VariableAddress[(unnamed local variable)] : +# 87| r87_94(glval>) = Convert : r87_93 +# 87| r87_95(coroutine_handle &) = CopyValue : r87_94 +# 87| v87_96(void) = Call[coroutine_handle] : func:r87_92, this:r87_90, 0:r87_95 +# 87| mu87_97(unknown) = ^CallSideEffect : ~m? +# 87| v87_98(void) = ^BufferReadSideEffect[0] : &:r87_95, ~m? +# 87| mu87_99(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r87_90 +# 87| r87_100(coroutine_handle) = Load[#temp87:20] : &:r87_90, ~m? +# 87| v87_101(void) = Call[await_suspend] : func:r87_89, this:r0_31, 0:r87_100 +# 87| mu87_102(unknown) = ^CallSideEffect : ~m? +#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m? #-----| Goto -> Block 9 # 91| co_returnable_value co_return_int(int) @@ -947,8 +947,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_8(bool) = Constant[1] : -#-----| r0_9(glval) = VariableAddress : -#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8 +#-----| r0_9(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8 # 91| r91_33(suspend_always *) = CopyValue : r91_22 # 91| r91_34(glval) = CopyValue : r91_33 #-----| r0_11(glval) = Convert : r91_34 @@ -970,32 +970,32 @@ coroutines.cpp: #-----| Goto (back edge) -> Block 8 # 91| Block 4 -# 91| r91_38(suspend_always *) = CopyValue : r91_22 -# 91| r91_39(glval) = CopyValue : r91_38 -#-----| r0_21(glval) = Convert : r91_39 -# 91| r91_40(glval) = FunctionAddress[await_suspend] : -# 91| r91_41(glval>) = VariableAddress[#temp91:21] : -# 91| mu91_42(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_41 -# 91| r91_43(glval) = FunctionAddress[coroutine_handle] : -# 91| r91_44(glval>) = VariableAddress : -# 91| r91_45(glval>) = Convert : r91_44 -# 91| r91_46(coroutine_handle &) = CopyValue : r91_45 -# 91| v91_47(void) = Call[coroutine_handle] : func:r91_43, this:r91_41, 0:r91_46 -# 91| mu91_48(unknown) = ^CallSideEffect : ~m? -# 91| v91_49(void) = ^BufferReadSideEffect[0] : &:r91_46, ~m? -# 91| mu91_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_41 -# 91| r91_51(coroutine_handle) = Load[#temp91:21] : &:r91_41, ~m? -# 91| v91_52(void) = Call[await_suspend] : func:r91_40, this:r0_21, 0:r91_51 -# 91| mu91_53(unknown) = ^CallSideEffect : ~m? -#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m? +# 91| r91_38(suspend_always *) = CopyValue : r91_22 +# 91| r91_39(glval) = CopyValue : r91_38 +#-----| r0_21(glval) = Convert : r91_39 +# 91| r91_40(glval) = FunctionAddress[await_suspend] : +# 91| r91_41(glval>) = VariableAddress[#temp91:21] : +# 91| mu91_42(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_41 +# 91| r91_43(glval) = FunctionAddress[coroutine_handle] : +# 91| r91_44(glval>) = VariableAddress[(unnamed local variable)] : +# 91| r91_45(glval>) = Convert : r91_44 +# 91| r91_46(coroutine_handle &) = CopyValue : r91_45 +# 91| v91_47(void) = Call[coroutine_handle] : func:r91_43, this:r91_41, 0:r91_46 +# 91| mu91_48(unknown) = ^CallSideEffect : ~m? +# 91| v91_49(void) = ^BufferReadSideEffect[0] : &:r91_46, ~m? +# 91| mu91_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_41 +# 91| r91_51(coroutine_handle) = Load[#temp91:21] : &:r91_41, ~m? +# 91| v91_52(void) = Call[await_suspend] : func:r91_40, this:r0_21, 0:r91_51 +# 91| mu91_53(unknown) = ^CallSideEffect : ~m? +#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m? #-----| Goto -> Block 3 #-----| Block 5 -#-----| v0_23(void) = CatchAny : -#-----| r0_24(glval) = VariableAddress : -#-----| r0_25(bool) = Load[?] : &:r0_24, ~m? -#-----| r0_26(bool) = LogicalNot : r0_25 -#-----| v0_27(void) = ConditionalBranch : r0_26 +#-----| v0_23(void) = CatchAny : +#-----| r0_24(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_25(bool) = Load[(unnamed local variable)] : &:r0_24, ~m? +#-----| r0_26(bool) = LogicalNot : r0_25 +#-----| v0_27(void) = ConditionalBranch : r0_26 #-----| False -> Block 7 #-----| True -> Block 6 @@ -1055,24 +1055,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 91| Block 10 -# 91| r91_89(suspend_always *) = CopyValue : r91_74 -# 91| r91_90(glval) = CopyValue : r91_89 -#-----| r0_35(glval) = Convert : r91_90 -# 91| r91_91(glval) = FunctionAddress[await_suspend] : -# 91| r91_92(glval>) = VariableAddress[#temp91:21] : -# 91| mu91_93(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_92 -# 91| r91_94(glval) = FunctionAddress[coroutine_handle] : -# 91| r91_95(glval>) = VariableAddress : -# 91| r91_96(glval>) = Convert : r91_95 -# 91| r91_97(coroutine_handle &) = CopyValue : r91_96 -# 91| v91_98(void) = Call[coroutine_handle] : func:r91_94, this:r91_92, 0:r91_97 -# 91| mu91_99(unknown) = ^CallSideEffect : ~m? -# 91| v91_100(void) = ^BufferReadSideEffect[0] : &:r91_97, ~m? -# 91| mu91_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_92 -# 91| r91_102(coroutine_handle) = Load[#temp91:21] : &:r91_92, ~m? -# 91| v91_103(void) = Call[await_suspend] : func:r91_91, this:r0_35, 0:r91_102 -# 91| mu91_104(unknown) = ^CallSideEffect : ~m? -#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m? +# 91| r91_89(suspend_always *) = CopyValue : r91_74 +# 91| r91_90(glval) = CopyValue : r91_89 +#-----| r0_35(glval) = Convert : r91_90 +# 91| r91_91(glval) = FunctionAddress[await_suspend] : +# 91| r91_92(glval>) = VariableAddress[#temp91:21] : +# 91| mu91_93(coroutine_handle) = Uninitialized[#temp91:21] : &:r91_92 +# 91| r91_94(glval) = FunctionAddress[coroutine_handle] : +# 91| r91_95(glval>) = VariableAddress[(unnamed local variable)] : +# 91| r91_96(glval>) = Convert : r91_95 +# 91| r91_97(coroutine_handle &) = CopyValue : r91_96 +# 91| v91_98(void) = Call[coroutine_handle] : func:r91_94, this:r91_92, 0:r91_97 +# 91| mu91_99(unknown) = ^CallSideEffect : ~m? +# 91| v91_100(void) = ^BufferReadSideEffect[0] : &:r91_97, ~m? +# 91| mu91_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r91_92 +# 91| r91_102(coroutine_handle) = Load[#temp91:21] : &:r91_92, ~m? +# 91| v91_103(void) = Call[await_suspend] : func:r91_91, this:r0_35, 0:r91_102 +# 91| mu91_104(unknown) = ^CallSideEffect : ~m? +#-----| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_35, ~m? #-----| Goto -> Block 9 # 95| co_returnable_void co_yield_value_void(int) @@ -1126,8 +1126,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_8(bool) = Constant[1] : -#-----| r0_9(glval) = VariableAddress : -#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8 +#-----| r0_9(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8 # 95| r95_33(suspend_always *) = CopyValue : r95_22 # 95| r95_34(glval) = CopyValue : r95_33 #-----| r0_11(glval) = Convert : r95_34 @@ -1169,24 +1169,24 @@ coroutines.cpp: #-----| True -> Block 5 # 95| Block 4 -# 95| r95_38(suspend_always *) = CopyValue : r95_22 -# 95| r95_39(glval) = CopyValue : r95_38 -#-----| r0_16(glval) = Convert : r95_39 -# 95| r95_40(glval) = FunctionAddress[await_suspend] : -# 95| r95_41(glval>) = VariableAddress[#temp95:20] : -# 95| mu95_42(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_41 -# 95| r95_43(glval) = FunctionAddress[coroutine_handle] : -# 95| r95_44(glval>) = VariableAddress : -# 95| r95_45(glval>) = Convert : r95_44 -# 95| r95_46(coroutine_handle &) = CopyValue : r95_45 -# 95| v95_47(void) = Call[coroutine_handle] : func:r95_43, this:r95_41, 0:r95_46 -# 95| mu95_48(unknown) = ^CallSideEffect : ~m? -# 95| v95_49(void) = ^BufferReadSideEffect[0] : &:r95_46, ~m? -# 95| mu95_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_41 -# 95| r95_51(coroutine_handle) = Load[#temp95:20] : &:r95_41, ~m? -# 95| v95_52(void) = Call[await_suspend] : func:r95_40, this:r0_16, 0:r95_51 -# 95| mu95_53(unknown) = ^CallSideEffect : ~m? -#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? +# 95| r95_38(suspend_always *) = CopyValue : r95_22 +# 95| r95_39(glval) = CopyValue : r95_38 +#-----| r0_16(glval) = Convert : r95_39 +# 95| r95_40(glval) = FunctionAddress[await_suspend] : +# 95| r95_41(glval>) = VariableAddress[#temp95:20] : +# 95| mu95_42(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_41 +# 95| r95_43(glval) = FunctionAddress[coroutine_handle] : +# 95| r95_44(glval>) = VariableAddress[(unnamed local variable)] : +# 95| r95_45(glval>) = Convert : r95_44 +# 95| r95_46(coroutine_handle &) = CopyValue : r95_45 +# 95| v95_47(void) = Call[coroutine_handle] : func:r95_43, this:r95_41, 0:r95_46 +# 95| mu95_48(unknown) = ^CallSideEffect : ~m? +# 95| v95_49(void) = ^BufferReadSideEffect[0] : &:r95_46, ~m? +# 95| mu95_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_41 +# 95| r95_51(coroutine_handle) = Load[#temp95:20] : &:r95_41, ~m? +# 95| v95_52(void) = Call[await_suspend] : func:r95_40, this:r0_16, 0:r95_51 +# 95| mu95_53(unknown) = ^CallSideEffect : ~m? +#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? #-----| Goto -> Block 3 # 96| Block 5 @@ -1208,32 +1208,32 @@ coroutines.cpp: #-----| Goto (back edge) -> Block 10 # 96| Block 6 -# 96| r96_33(suspend_always *) = CopyValue : r96_19 -# 96| r96_34(glval) = CopyValue : r96_33 -#-----| r0_27(glval) = Convert : r96_34 -# 96| r96_35(glval) = FunctionAddress[await_suspend] : -# 96| r96_36(glval>) = VariableAddress[#temp96:3] : -# 96| mu96_37(coroutine_handle) = Uninitialized[#temp96:3] : &:r96_36 -# 96| r96_38(glval) = FunctionAddress[coroutine_handle] : -# 96| r96_39(glval>) = VariableAddress : -# 96| r96_40(glval>) = Convert : r96_39 -# 96| r96_41(coroutine_handle &) = CopyValue : r96_40 -# 96| v96_42(void) = Call[coroutine_handle] : func:r96_38, this:r96_36, 0:r96_41 -# 96| mu96_43(unknown) = ^CallSideEffect : ~m? -# 96| v96_44(void) = ^BufferReadSideEffect[0] : &:r96_41, ~m? -# 96| mu96_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r96_36 -# 96| r96_46(coroutine_handle) = Load[#temp96:3] : &:r96_36, ~m? -# 96| v96_47(void) = Call[await_suspend] : func:r96_35, this:r0_27, 0:r96_46 -# 96| mu96_48(unknown) = ^CallSideEffect : ~m? -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? +# 96| r96_33(suspend_always *) = CopyValue : r96_19 +# 96| r96_34(glval) = CopyValue : r96_33 +#-----| r0_27(glval) = Convert : r96_34 +# 96| r96_35(glval) = FunctionAddress[await_suspend] : +# 96| r96_36(glval>) = VariableAddress[#temp96:3] : +# 96| mu96_37(coroutine_handle) = Uninitialized[#temp96:3] : &:r96_36 +# 96| r96_38(glval) = FunctionAddress[coroutine_handle] : +# 96| r96_39(glval>) = VariableAddress[(unnamed local variable)] : +# 96| r96_40(glval>) = Convert : r96_39 +# 96| r96_41(coroutine_handle &) = CopyValue : r96_40 +# 96| v96_42(void) = Call[coroutine_handle] : func:r96_38, this:r96_36, 0:r96_41 +# 96| mu96_43(unknown) = ^CallSideEffect : ~m? +# 96| v96_44(void) = ^BufferReadSideEffect[0] : &:r96_41, ~m? +# 96| mu96_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r96_36 +# 96| r96_46(coroutine_handle) = Load[#temp96:3] : &:r96_36, ~m? +# 96| v96_47(void) = Call[await_suspend] : func:r96_35, this:r0_27, 0:r96_46 +# 96| mu96_48(unknown) = ^CallSideEffect : ~m? +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? #-----| Goto -> Block 5 #-----| Block 7 -#-----| v0_29(void) = CatchAny : -#-----| r0_30(glval) = VariableAddress : -#-----| r0_31(bool) = Load[?] : &:r0_30, ~m? -#-----| r0_32(bool) = LogicalNot : r0_31 -#-----| v0_33(void) = ConditionalBranch : r0_32 +#-----| v0_29(void) = CatchAny : +#-----| r0_30(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m? +#-----| r0_32(bool) = LogicalNot : r0_31 +#-----| v0_33(void) = ConditionalBranch : r0_32 #-----| False -> Block 9 #-----| True -> Block 8 @@ -1293,24 +1293,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 95| Block 12 -# 95| r95_89(suspend_always *) = CopyValue : r95_74 -# 95| r95_90(glval) = CopyValue : r95_89 -#-----| r0_41(glval) = Convert : r95_90 -# 95| r95_91(glval) = FunctionAddress[await_suspend] : -# 95| r95_92(glval>) = VariableAddress[#temp95:20] : -# 95| mu95_93(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_92 -# 95| r95_94(glval) = FunctionAddress[coroutine_handle] : -# 95| r95_95(glval>) = VariableAddress : -# 95| r95_96(glval>) = Convert : r95_95 -# 95| r95_97(coroutine_handle &) = CopyValue : r95_96 -# 95| v95_98(void) = Call[coroutine_handle] : func:r95_94, this:r95_92, 0:r95_97 -# 95| mu95_99(unknown) = ^CallSideEffect : ~m? -# 95| v95_100(void) = ^BufferReadSideEffect[0] : &:r95_97, ~m? -# 95| mu95_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_92 -# 95| r95_102(coroutine_handle) = Load[#temp95:20] : &:r95_92, ~m? -# 95| v95_103(void) = Call[await_suspend] : func:r95_91, this:r0_41, 0:r95_102 -# 95| mu95_104(unknown) = ^CallSideEffect : ~m? -#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? +# 95| r95_89(suspend_always *) = CopyValue : r95_74 +# 95| r95_90(glval) = CopyValue : r95_89 +#-----| r0_41(glval) = Convert : r95_90 +# 95| r95_91(glval) = FunctionAddress[await_suspend] : +# 95| r95_92(glval>) = VariableAddress[#temp95:20] : +# 95| mu95_93(coroutine_handle) = Uninitialized[#temp95:20] : &:r95_92 +# 95| r95_94(glval) = FunctionAddress[coroutine_handle] : +# 95| r95_95(glval>) = VariableAddress[(unnamed local variable)] : +# 95| r95_96(glval>) = Convert : r95_95 +# 95| r95_97(coroutine_handle &) = CopyValue : r95_96 +# 95| v95_98(void) = Call[coroutine_handle] : func:r95_94, this:r95_92, 0:r95_97 +# 95| mu95_99(unknown) = ^CallSideEffect : ~m? +# 95| v95_100(void) = ^BufferReadSideEffect[0] : &:r95_97, ~m? +# 95| mu95_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r95_92 +# 95| r95_102(coroutine_handle) = Load[#temp95:20] : &:r95_92, ~m? +# 95| v95_103(void) = Call[await_suspend] : func:r95_91, this:r0_41, 0:r95_102 +# 95| mu95_104(unknown) = ^CallSideEffect : ~m? +#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? #-----| Goto -> Block 11 # 99| co_returnable_value co_yield_value_value(int) @@ -1364,8 +1364,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_8(bool) = Constant[1] : -#-----| r0_9(glval) = VariableAddress : -#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8 +#-----| r0_9(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8 # 99| r99_33(suspend_always *) = CopyValue : r99_22 # 99| r99_34(glval) = CopyValue : r99_33 #-----| r0_11(glval) = Convert : r99_34 @@ -1407,24 +1407,24 @@ coroutines.cpp: #-----| True -> Block 5 # 99| Block 4 -# 99| r99_38(suspend_always *) = CopyValue : r99_22 -# 99| r99_39(glval) = CopyValue : r99_38 -#-----| r0_16(glval) = Convert : r99_39 -# 99| r99_40(glval) = FunctionAddress[await_suspend] : -# 99| r99_41(glval>) = VariableAddress[#temp99:21] : -# 99| mu99_42(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_41 -# 99| r99_43(glval) = FunctionAddress[coroutine_handle] : -# 99| r99_44(glval>) = VariableAddress : -# 99| r99_45(glval>) = Convert : r99_44 -# 99| r99_46(coroutine_handle &) = CopyValue : r99_45 -# 99| v99_47(void) = Call[coroutine_handle] : func:r99_43, this:r99_41, 0:r99_46 -# 99| mu99_48(unknown) = ^CallSideEffect : ~m? -# 99| v99_49(void) = ^BufferReadSideEffect[0] : &:r99_46, ~m? -# 99| mu99_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_41 -# 99| r99_51(coroutine_handle) = Load[#temp99:21] : &:r99_41, ~m? -# 99| v99_52(void) = Call[await_suspend] : func:r99_40, this:r0_16, 0:r99_51 -# 99| mu99_53(unknown) = ^CallSideEffect : ~m? -#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? +# 99| r99_38(suspend_always *) = CopyValue : r99_22 +# 99| r99_39(glval) = CopyValue : r99_38 +#-----| r0_16(glval) = Convert : r99_39 +# 99| r99_40(glval) = FunctionAddress[await_suspend] : +# 99| r99_41(glval>) = VariableAddress[#temp99:21] : +# 99| mu99_42(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_41 +# 99| r99_43(glval) = FunctionAddress[coroutine_handle] : +# 99| r99_44(glval>) = VariableAddress[(unnamed local variable)] : +# 99| r99_45(glval>) = Convert : r99_44 +# 99| r99_46(coroutine_handle &) = CopyValue : r99_45 +# 99| v99_47(void) = Call[coroutine_handle] : func:r99_43, this:r99_41, 0:r99_46 +# 99| mu99_48(unknown) = ^CallSideEffect : ~m? +# 99| v99_49(void) = ^BufferReadSideEffect[0] : &:r99_46, ~m? +# 99| mu99_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_41 +# 99| r99_51(coroutine_handle) = Load[#temp99:21] : &:r99_41, ~m? +# 99| v99_52(void) = Call[await_suspend] : func:r99_40, this:r0_16, 0:r99_51 +# 99| mu99_53(unknown) = ^CallSideEffect : ~m? +#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? #-----| Goto -> Block 3 # 100| Block 5 @@ -1438,32 +1438,32 @@ coroutines.cpp: #-----| Goto -> Block 10 # 100| Block 6 -# 100| r100_33(suspend_always *) = CopyValue : r100_19 -# 100| r100_34(glval) = CopyValue : r100_33 -#-----| r0_20(glval) = Convert : r100_34 -# 100| r100_35(glval) = FunctionAddress[await_suspend] : -# 100| r100_36(glval>) = VariableAddress[#temp100:3] : -# 100| mu100_37(coroutine_handle) = Uninitialized[#temp100:3] : &:r100_36 -# 100| r100_38(glval) = FunctionAddress[coroutine_handle] : -# 100| r100_39(glval>) = VariableAddress : -# 100| r100_40(glval>) = Convert : r100_39 -# 100| r100_41(coroutine_handle &) = CopyValue : r100_40 -# 100| v100_42(void) = Call[coroutine_handle] : func:r100_38, this:r100_36, 0:r100_41 -# 100| mu100_43(unknown) = ^CallSideEffect : ~m? -# 100| v100_44(void) = ^BufferReadSideEffect[0] : &:r100_41, ~m? -# 100| mu100_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r100_36 -# 100| r100_46(coroutine_handle) = Load[#temp100:3] : &:r100_36, ~m? -# 100| v100_47(void) = Call[await_suspend] : func:r100_35, this:r0_20, 0:r100_46 -# 100| mu100_48(unknown) = ^CallSideEffect : ~m? -#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m? +# 100| r100_33(suspend_always *) = CopyValue : r100_19 +# 100| r100_34(glval) = CopyValue : r100_33 +#-----| r0_20(glval) = Convert : r100_34 +# 100| r100_35(glval) = FunctionAddress[await_suspend] : +# 100| r100_36(glval>) = VariableAddress[#temp100:3] : +# 100| mu100_37(coroutine_handle) = Uninitialized[#temp100:3] : &:r100_36 +# 100| r100_38(glval) = FunctionAddress[coroutine_handle] : +# 100| r100_39(glval>) = VariableAddress[(unnamed local variable)] : +# 100| r100_40(glval>) = Convert : r100_39 +# 100| r100_41(coroutine_handle &) = CopyValue : r100_40 +# 100| v100_42(void) = Call[coroutine_handle] : func:r100_38, this:r100_36, 0:r100_41 +# 100| mu100_43(unknown) = ^CallSideEffect : ~m? +# 100| v100_44(void) = ^BufferReadSideEffect[0] : &:r100_41, ~m? +# 100| mu100_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r100_36 +# 100| r100_46(coroutine_handle) = Load[#temp100:3] : &:r100_36, ~m? +# 100| v100_47(void) = Call[await_suspend] : func:r100_35, this:r0_20, 0:r100_46 +# 100| mu100_48(unknown) = ^CallSideEffect : ~m? +#-----| v0_21(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~m? #-----| Goto -> Block 5 #-----| Block 7 -#-----| v0_22(void) = CatchAny : -#-----| r0_23(glval) = VariableAddress : -#-----| r0_24(bool) = Load[?] : &:r0_23, ~m? -#-----| r0_25(bool) = LogicalNot : r0_24 -#-----| v0_26(void) = ConditionalBranch : r0_25 +#-----| v0_22(void) = CatchAny : +#-----| r0_23(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_24(bool) = Load[(unnamed local variable)] : &:r0_23, ~m? +#-----| r0_25(bool) = LogicalNot : r0_24 +#-----| v0_26(void) = ConditionalBranch : r0_25 #-----| False -> Block 9 #-----| True -> Block 8 @@ -1523,24 +1523,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 99| Block 12 -# 99| r99_89(suspend_always *) = CopyValue : r99_74 -# 99| r99_90(glval) = CopyValue : r99_89 -#-----| r0_34(glval) = Convert : r99_90 -# 99| r99_91(glval) = FunctionAddress[await_suspend] : -# 99| r99_92(glval>) = VariableAddress[#temp99:21] : -# 99| mu99_93(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_92 -# 99| r99_94(glval) = FunctionAddress[coroutine_handle] : -# 99| r99_95(glval>) = VariableAddress : -# 99| r99_96(glval>) = Convert : r99_95 -# 99| r99_97(coroutine_handle &) = CopyValue : r99_96 -# 99| v99_98(void) = Call[coroutine_handle] : func:r99_94, this:r99_92, 0:r99_97 -# 99| mu99_99(unknown) = ^CallSideEffect : ~m? -# 99| v99_100(void) = ^BufferReadSideEffect[0] : &:r99_97, ~m? -# 99| mu99_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_92 -# 99| r99_102(coroutine_handle) = Load[#temp99:21] : &:r99_92, ~m? -# 99| v99_103(void) = Call[await_suspend] : func:r99_91, this:r0_34, 0:r99_102 -# 99| mu99_104(unknown) = ^CallSideEffect : ~m? -#-----| v0_35(void) = ^IndirectReadSideEffect[-1] : &:r0_34, ~m? +# 99| r99_89(suspend_always *) = CopyValue : r99_74 +# 99| r99_90(glval) = CopyValue : r99_89 +#-----| r0_34(glval) = Convert : r99_90 +# 99| r99_91(glval) = FunctionAddress[await_suspend] : +# 99| r99_92(glval>) = VariableAddress[#temp99:21] : +# 99| mu99_93(coroutine_handle) = Uninitialized[#temp99:21] : &:r99_92 +# 99| r99_94(glval) = FunctionAddress[coroutine_handle] : +# 99| r99_95(glval>) = VariableAddress[(unnamed local variable)] : +# 99| r99_96(glval>) = Convert : r99_95 +# 99| r99_97(coroutine_handle &) = CopyValue : r99_96 +# 99| v99_98(void) = Call[coroutine_handle] : func:r99_94, this:r99_92, 0:r99_97 +# 99| mu99_99(unknown) = ^CallSideEffect : ~m? +# 99| v99_100(void) = ^BufferReadSideEffect[0] : &:r99_97, ~m? +# 99| mu99_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r99_92 +# 99| r99_102(coroutine_handle) = Load[#temp99:21] : &:r99_92, ~m? +# 99| v99_103(void) = Call[await_suspend] : func:r99_91, this:r0_34, 0:r99_102 +# 99| mu99_104(unknown) = ^CallSideEffect : ~m? +#-----| v0_35(void) = ^IndirectReadSideEffect[-1] : &:r0_34, ~m? #-----| Goto -> Block 11 # 103| co_returnable_void co_yield_and_return_void(int) @@ -1594,8 +1594,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_8(bool) = Constant[1] : -#-----| r0_9(glval) = VariableAddress : -#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8 +#-----| r0_9(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8 # 103| r103_33(suspend_always *) = CopyValue : r103_22 # 103| r103_34(glval) = CopyValue : r103_33 #-----| r0_11(glval) = Convert : r103_34 @@ -1637,24 +1637,24 @@ coroutines.cpp: #-----| True -> Block 5 # 103| Block 4 -# 103| r103_38(suspend_always *) = CopyValue : r103_22 -# 103| r103_39(glval) = CopyValue : r103_38 -#-----| r0_16(glval) = Convert : r103_39 -# 103| r103_40(glval) = FunctionAddress[await_suspend] : -# 103| r103_41(glval>) = VariableAddress[#temp103:20] : -# 103| mu103_42(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_41 -# 103| r103_43(glval) = FunctionAddress[coroutine_handle] : -# 103| r103_44(glval>) = VariableAddress : -# 103| r103_45(glval>) = Convert : r103_44 -# 103| r103_46(coroutine_handle &) = CopyValue : r103_45 -# 103| v103_47(void) = Call[coroutine_handle] : func:r103_43, this:r103_41, 0:r103_46 -# 103| mu103_48(unknown) = ^CallSideEffect : ~m? -# 103| v103_49(void) = ^BufferReadSideEffect[0] : &:r103_46, ~m? -# 103| mu103_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_41 -# 103| r103_51(coroutine_handle) = Load[#temp103:20] : &:r103_41, ~m? -# 103| v103_52(void) = Call[await_suspend] : func:r103_40, this:r0_16, 0:r103_51 -# 103| mu103_53(unknown) = ^CallSideEffect : ~m? -#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? +# 103| r103_38(suspend_always *) = CopyValue : r103_22 +# 103| r103_39(glval) = CopyValue : r103_38 +#-----| r0_16(glval) = Convert : r103_39 +# 103| r103_40(glval) = FunctionAddress[await_suspend] : +# 103| r103_41(glval>) = VariableAddress[#temp103:20] : +# 103| mu103_42(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_41 +# 103| r103_43(glval) = FunctionAddress[coroutine_handle] : +# 103| r103_44(glval>) = VariableAddress[(unnamed local variable)] : +# 103| r103_45(glval>) = Convert : r103_44 +# 103| r103_46(coroutine_handle &) = CopyValue : r103_45 +# 103| v103_47(void) = Call[coroutine_handle] : func:r103_43, this:r103_41, 0:r103_46 +# 103| mu103_48(unknown) = ^CallSideEffect : ~m? +# 103| v103_49(void) = ^BufferReadSideEffect[0] : &:r103_46, ~m? +# 103| mu103_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_41 +# 103| r103_51(coroutine_handle) = Load[#temp103:20] : &:r103_41, ~m? +# 103| v103_52(void) = Call[await_suspend] : func:r103_40, this:r0_16, 0:r103_51 +# 103| mu103_53(unknown) = ^CallSideEffect : ~m? +#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? #-----| Goto -> Block 3 # 104| Block 5 @@ -1676,32 +1676,32 @@ coroutines.cpp: #-----| Goto (back edge) -> Block 10 # 104| Block 6 -# 104| r104_33(suspend_always *) = CopyValue : r104_19 -# 104| r104_34(glval) = CopyValue : r104_33 -#-----| r0_27(glval) = Convert : r104_34 -# 104| r104_35(glval) = FunctionAddress[await_suspend] : -# 104| r104_36(glval>) = VariableAddress[#temp104:3] : -# 104| mu104_37(coroutine_handle) = Uninitialized[#temp104:3] : &:r104_36 -# 104| r104_38(glval) = FunctionAddress[coroutine_handle] : -# 104| r104_39(glval>) = VariableAddress : -# 104| r104_40(glval>) = Convert : r104_39 -# 104| r104_41(coroutine_handle &) = CopyValue : r104_40 -# 104| v104_42(void) = Call[coroutine_handle] : func:r104_38, this:r104_36, 0:r104_41 -# 104| mu104_43(unknown) = ^CallSideEffect : ~m? -# 104| v104_44(void) = ^BufferReadSideEffect[0] : &:r104_41, ~m? -# 104| mu104_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r104_36 -# 104| r104_46(coroutine_handle) = Load[#temp104:3] : &:r104_36, ~m? -# 104| v104_47(void) = Call[await_suspend] : func:r104_35, this:r0_27, 0:r104_46 -# 104| mu104_48(unknown) = ^CallSideEffect : ~m? -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? +# 104| r104_33(suspend_always *) = CopyValue : r104_19 +# 104| r104_34(glval) = CopyValue : r104_33 +#-----| r0_27(glval) = Convert : r104_34 +# 104| r104_35(glval) = FunctionAddress[await_suspend] : +# 104| r104_36(glval>) = VariableAddress[#temp104:3] : +# 104| mu104_37(coroutine_handle) = Uninitialized[#temp104:3] : &:r104_36 +# 104| r104_38(glval) = FunctionAddress[coroutine_handle] : +# 104| r104_39(glval>) = VariableAddress[(unnamed local variable)] : +# 104| r104_40(glval>) = Convert : r104_39 +# 104| r104_41(coroutine_handle &) = CopyValue : r104_40 +# 104| v104_42(void) = Call[coroutine_handle] : func:r104_38, this:r104_36, 0:r104_41 +# 104| mu104_43(unknown) = ^CallSideEffect : ~m? +# 104| v104_44(void) = ^BufferReadSideEffect[0] : &:r104_41, ~m? +# 104| mu104_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r104_36 +# 104| r104_46(coroutine_handle) = Load[#temp104:3] : &:r104_36, ~m? +# 104| v104_47(void) = Call[await_suspend] : func:r104_35, this:r0_27, 0:r104_46 +# 104| mu104_48(unknown) = ^CallSideEffect : ~m? +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? #-----| Goto -> Block 5 #-----| Block 7 -#-----| v0_29(void) = CatchAny : -#-----| r0_30(glval) = VariableAddress : -#-----| r0_31(bool) = Load[?] : &:r0_30, ~m? -#-----| r0_32(bool) = LogicalNot : r0_31 -#-----| v0_33(void) = ConditionalBranch : r0_32 +#-----| v0_29(void) = CatchAny : +#-----| r0_30(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m? +#-----| r0_32(bool) = LogicalNot : r0_31 +#-----| v0_33(void) = ConditionalBranch : r0_32 #-----| False -> Block 9 #-----| True -> Block 8 @@ -1761,24 +1761,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 103| Block 12 -# 103| r103_89(suspend_always *) = CopyValue : r103_74 -# 103| r103_90(glval) = CopyValue : r103_89 -#-----| r0_41(glval) = Convert : r103_90 -# 103| r103_91(glval) = FunctionAddress[await_suspend] : -# 103| r103_92(glval>) = VariableAddress[#temp103:20] : -# 103| mu103_93(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_92 -# 103| r103_94(glval) = FunctionAddress[coroutine_handle] : -# 103| r103_95(glval>) = VariableAddress : -# 103| r103_96(glval>) = Convert : r103_95 -# 103| r103_97(coroutine_handle &) = CopyValue : r103_96 -# 103| v103_98(void) = Call[coroutine_handle] : func:r103_94, this:r103_92, 0:r103_97 -# 103| mu103_99(unknown) = ^CallSideEffect : ~m? -# 103| v103_100(void) = ^BufferReadSideEffect[0] : &:r103_97, ~m? -# 103| mu103_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_92 -# 103| r103_102(coroutine_handle) = Load[#temp103:20] : &:r103_92, ~m? -# 103| v103_103(void) = Call[await_suspend] : func:r103_91, this:r0_41, 0:r103_102 -# 103| mu103_104(unknown) = ^CallSideEffect : ~m? -#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? +# 103| r103_89(suspend_always *) = CopyValue : r103_74 +# 103| r103_90(glval) = CopyValue : r103_89 +#-----| r0_41(glval) = Convert : r103_90 +# 103| r103_91(glval) = FunctionAddress[await_suspend] : +# 103| r103_92(glval>) = VariableAddress[#temp103:20] : +# 103| mu103_93(coroutine_handle) = Uninitialized[#temp103:20] : &:r103_92 +# 103| r103_94(glval) = FunctionAddress[coroutine_handle] : +# 103| r103_95(glval>) = VariableAddress[(unnamed local variable)] : +# 103| r103_96(glval>) = Convert : r103_95 +# 103| r103_97(coroutine_handle &) = CopyValue : r103_96 +# 103| v103_98(void) = Call[coroutine_handle] : func:r103_94, this:r103_92, 0:r103_97 +# 103| mu103_99(unknown) = ^CallSideEffect : ~m? +# 103| v103_100(void) = ^BufferReadSideEffect[0] : &:r103_97, ~m? +# 103| mu103_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r103_92 +# 103| r103_102(coroutine_handle) = Load[#temp103:20] : &:r103_92, ~m? +# 103| v103_103(void) = Call[await_suspend] : func:r103_91, this:r0_41, 0:r103_102 +# 103| mu103_104(unknown) = ^CallSideEffect : ~m? +#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? #-----| Goto -> Block 11 # 108| co_returnable_value co_yield_and_return_value(int) @@ -1832,8 +1832,8 @@ coroutines.cpp: #-----| Block 3 #-----| r0_8(bool) = Constant[1] : -#-----| r0_9(glval) = VariableAddress : -#-----| mu0_10(bool) = Store[?] : &:r0_9, r0_8 +#-----| r0_9(glval) = VariableAddress[(unnamed local variable)] : +#-----| mu0_10(bool) = Store[(unnamed local variable)] : &:r0_9, r0_8 # 108| r108_33(suspend_always *) = CopyValue : r108_22 # 108| r108_34(glval) = CopyValue : r108_33 #-----| r0_11(glval) = Convert : r108_34 @@ -1875,24 +1875,24 @@ coroutines.cpp: #-----| True -> Block 5 # 108| Block 4 -# 108| r108_38(suspend_always *) = CopyValue : r108_22 -# 108| r108_39(glval) = CopyValue : r108_38 -#-----| r0_16(glval) = Convert : r108_39 -# 108| r108_40(glval) = FunctionAddress[await_suspend] : -# 108| r108_41(glval>) = VariableAddress[#temp108:21] : -# 108| mu108_42(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_41 -# 108| r108_43(glval) = FunctionAddress[coroutine_handle] : -# 108| r108_44(glval>) = VariableAddress : -# 108| r108_45(glval>) = Convert : r108_44 -# 108| r108_46(coroutine_handle &) = CopyValue : r108_45 -# 108| v108_47(void) = Call[coroutine_handle] : func:r108_43, this:r108_41, 0:r108_46 -# 108| mu108_48(unknown) = ^CallSideEffect : ~m? -# 108| v108_49(void) = ^BufferReadSideEffect[0] : &:r108_46, ~m? -# 108| mu108_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_41 -# 108| r108_51(coroutine_handle) = Load[#temp108:21] : &:r108_41, ~m? -# 108| v108_52(void) = Call[await_suspend] : func:r108_40, this:r0_16, 0:r108_51 -# 108| mu108_53(unknown) = ^CallSideEffect : ~m? -#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? +# 108| r108_38(suspend_always *) = CopyValue : r108_22 +# 108| r108_39(glval) = CopyValue : r108_38 +#-----| r0_16(glval) = Convert : r108_39 +# 108| r108_40(glval) = FunctionAddress[await_suspend] : +# 108| r108_41(glval>) = VariableAddress[#temp108:21] : +# 108| mu108_42(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_41 +# 108| r108_43(glval) = FunctionAddress[coroutine_handle] : +# 108| r108_44(glval>) = VariableAddress[(unnamed local variable)] : +# 108| r108_45(glval>) = Convert : r108_44 +# 108| r108_46(coroutine_handle &) = CopyValue : r108_45 +# 108| v108_47(void) = Call[coroutine_handle] : func:r108_43, this:r108_41, 0:r108_46 +# 108| mu108_48(unknown) = ^CallSideEffect : ~m? +# 108| v108_49(void) = ^BufferReadSideEffect[0] : &:r108_46, ~m? +# 108| mu108_50(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_41 +# 108| r108_51(coroutine_handle) = Load[#temp108:21] : &:r108_41, ~m? +# 108| v108_52(void) = Call[await_suspend] : func:r108_40, this:r0_16, 0:r108_51 +# 108| mu108_53(unknown) = ^CallSideEffect : ~m? +#-----| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~m? #-----| Goto -> Block 3 # 109| Block 5 @@ -1918,32 +1918,32 @@ coroutines.cpp: #-----| Goto (back edge) -> Block 10 # 109| Block 6 -# 109| r109_33(suspend_always *) = CopyValue : r109_19 -# 109| r109_34(glval) = CopyValue : r109_33 -#-----| r0_27(glval) = Convert : r109_34 -# 109| r109_35(glval) = FunctionAddress[await_suspend] : -# 109| r109_36(glval>) = VariableAddress[#temp109:3] : -# 109| mu109_37(coroutine_handle) = Uninitialized[#temp109:3] : &:r109_36 -# 109| r109_38(glval) = FunctionAddress[coroutine_handle] : -# 109| r109_39(glval>) = VariableAddress : -# 109| r109_40(glval>) = Convert : r109_39 -# 109| r109_41(coroutine_handle &) = CopyValue : r109_40 -# 109| v109_42(void) = Call[coroutine_handle] : func:r109_38, this:r109_36, 0:r109_41 -# 109| mu109_43(unknown) = ^CallSideEffect : ~m? -# 109| v109_44(void) = ^BufferReadSideEffect[0] : &:r109_41, ~m? -# 109| mu109_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r109_36 -# 109| r109_46(coroutine_handle) = Load[#temp109:3] : &:r109_36, ~m? -# 109| v109_47(void) = Call[await_suspend] : func:r109_35, this:r0_27, 0:r109_46 -# 109| mu109_48(unknown) = ^CallSideEffect : ~m? -#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? +# 109| r109_33(suspend_always *) = CopyValue : r109_19 +# 109| r109_34(glval) = CopyValue : r109_33 +#-----| r0_27(glval) = Convert : r109_34 +# 109| r109_35(glval) = FunctionAddress[await_suspend] : +# 109| r109_36(glval>) = VariableAddress[#temp109:3] : +# 109| mu109_37(coroutine_handle) = Uninitialized[#temp109:3] : &:r109_36 +# 109| r109_38(glval) = FunctionAddress[coroutine_handle] : +# 109| r109_39(glval>) = VariableAddress[(unnamed local variable)] : +# 109| r109_40(glval>) = Convert : r109_39 +# 109| r109_41(coroutine_handle &) = CopyValue : r109_40 +# 109| v109_42(void) = Call[coroutine_handle] : func:r109_38, this:r109_36, 0:r109_41 +# 109| mu109_43(unknown) = ^CallSideEffect : ~m? +# 109| v109_44(void) = ^BufferReadSideEffect[0] : &:r109_41, ~m? +# 109| mu109_45(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r109_36 +# 109| r109_46(coroutine_handle) = Load[#temp109:3] : &:r109_36, ~m? +# 109| v109_47(void) = Call[await_suspend] : func:r109_35, this:r0_27, 0:r109_46 +# 109| mu109_48(unknown) = ^CallSideEffect : ~m? +#-----| v0_28(void) = ^IndirectReadSideEffect[-1] : &:r0_27, ~m? #-----| Goto -> Block 5 #-----| Block 7 -#-----| v0_29(void) = CatchAny : -#-----| r0_30(glval) = VariableAddress : -#-----| r0_31(bool) = Load[?] : &:r0_30, ~m? -#-----| r0_32(bool) = LogicalNot : r0_31 -#-----| v0_33(void) = ConditionalBranch : r0_32 +#-----| v0_29(void) = CatchAny : +#-----| r0_30(glval) = VariableAddress[(unnamed local variable)] : +#-----| r0_31(bool) = Load[(unnamed local variable)] : &:r0_30, ~m? +#-----| r0_32(bool) = LogicalNot : r0_31 +#-----| v0_33(void) = ConditionalBranch : r0_32 #-----| False -> Block 9 #-----| True -> Block 8 @@ -2003,24 +2003,24 @@ coroutines.cpp: #-----| Goto -> Block 1 # 108| Block 12 -# 108| r108_89(suspend_always *) = CopyValue : r108_74 -# 108| r108_90(glval) = CopyValue : r108_89 -#-----| r0_41(glval) = Convert : r108_90 -# 108| r108_91(glval) = FunctionAddress[await_suspend] : -# 108| r108_92(glval>) = VariableAddress[#temp108:21] : -# 108| mu108_93(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_92 -# 108| r108_94(glval) = FunctionAddress[coroutine_handle] : -# 108| r108_95(glval>) = VariableAddress : -# 108| r108_96(glval>) = Convert : r108_95 -# 108| r108_97(coroutine_handle &) = CopyValue : r108_96 -# 108| v108_98(void) = Call[coroutine_handle] : func:r108_94, this:r108_92, 0:r108_97 -# 108| mu108_99(unknown) = ^CallSideEffect : ~m? -# 108| v108_100(void) = ^BufferReadSideEffect[0] : &:r108_97, ~m? -# 108| mu108_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_92 -# 108| r108_102(coroutine_handle) = Load[#temp108:21] : &:r108_92, ~m? -# 108| v108_103(void) = Call[await_suspend] : func:r108_91, this:r0_41, 0:r108_102 -# 108| mu108_104(unknown) = ^CallSideEffect : ~m? -#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? +# 108| r108_89(suspend_always *) = CopyValue : r108_74 +# 108| r108_90(glval) = CopyValue : r108_89 +#-----| r0_41(glval) = Convert : r108_90 +# 108| r108_91(glval) = FunctionAddress[await_suspend] : +# 108| r108_92(glval>) = VariableAddress[#temp108:21] : +# 108| mu108_93(coroutine_handle) = Uninitialized[#temp108:21] : &:r108_92 +# 108| r108_94(glval) = FunctionAddress[coroutine_handle] : +# 108| r108_95(glval>) = VariableAddress[(unnamed local variable)] : +# 108| r108_96(glval>) = Convert : r108_95 +# 108| r108_97(coroutine_handle &) = CopyValue : r108_96 +# 108| v108_98(void) = Call[coroutine_handle] : func:r108_94, this:r108_92, 0:r108_97 +# 108| mu108_99(unknown) = ^CallSideEffect : ~m? +# 108| v108_100(void) = ^BufferReadSideEffect[0] : &:r108_97, ~m? +# 108| mu108_101(coroutine_handle) = ^IndirectMayWriteSideEffect[-1] : &:r108_92 +# 108| r108_102(coroutine_handle) = Load[#temp108:21] : &:r108_92, ~m? +# 108| v108_103(void) = Call[await_suspend] : func:r108_91, this:r0_41, 0:r108_102 +# 108| mu108_104(unknown) = ^CallSideEffect : ~m? +#-----| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_41, ~m? #-----| Goto -> Block 11 destructors_for_temps.cpp: diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 5a0234a4cc42..199d61f015dc 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -29,26 +29,4 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 5a0234a4cc42..199d61f015dc 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -29,26 +29,4 @@ fieldAddressOnNonPointer thisArgumentIsNonPointer | ir.cpp:2546:34:2546:34 | Call: call to operator bool | Call instruction 'Call: call to operator bool' has a `this` argument operand that is not an address, in function '$@'. | ir.cpp:2545:6:2545:23 | void this_inconsistency(bool) | void this_inconsistency(bool) | nonUniqueIRVariable -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:87:20:87:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:91:21:91:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:95:20:95:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:96:3:96:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:99:21:99:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:100:3:100:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:103:20:103:20 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:104:3:104:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:108:21:108:21 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| coroutines.cpp:109:3:109:3 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:87:20:87:33 | co_returnable_void co_return_void() | co_returnable_void co_return_void() | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:91:21:91:33 | co_returnable_value co_return_int(int) | co_returnable_value co_return_int(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:95:20:95:38 | co_returnable_void co_yield_value_void(int) | co_returnable_void co_yield_value_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:99:21:99:40 | co_returnable_value co_yield_value_value(int) | co_returnable_value co_yield_value_value(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:103:20:103:43 | co_returnable_void co_yield_and_return_void(int) | co_returnable_void co_yield_and_return_void(int) | -| file://:0:0:0:0 | VariableAddress: (unnamed local variable) | Variable address instruction 'VariableAddress: (unnamed local variable)' has no associated variable, in function '$@'. | coroutines.cpp:108:21:108:45 | co_returnable_value co_yield_and_return_value(int) | co_returnable_value co_yield_and_return_value(int) | missingCppType