From 723236d15b5aa0b0c863bb56603ee51f7b746cc8 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 8 Oct 2024 15:35:16 +0200 Subject: [PATCH] C++: Add a skeleton class for requires expressions --- .../exprs.ql | 15 + .../old.dbscheme | 2316 +++++++++++ .../semmlecode.cpp.dbscheme | 2315 +++++++++++ .../upgrade.properties | 3 + cpp/ql/lib/cpp.qll | 1 + cpp/ql/lib/semmle/code/cpp/Concept.qll | 14 + cpp/ql/lib/semmlecode.cpp.dbscheme | 1 + cpp/ql/lib/semmlecode.cpp.dbscheme.stats | 3428 +++++++++-------- .../old.dbscheme | 2315 +++++++++++ .../semmlecode.cpp.dbscheme | 2316 +++++++++++ .../upgrade.properties | 2 + .../library-tests/ir/ir/PrintAST.expected | 20 + .../library-tests/ir/ir/aliased_ir.expected | 18 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 9 + .../test/library-tests/ir/ir/raw_ir.expected | 17 + 15 files changed, 11078 insertions(+), 1712 deletions(-) create mode 100644 cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/exprs.ql create mode 100644 cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/old.dbscheme create mode 100644 cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/semmlecode.cpp.dbscheme create mode 100644 cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/upgrade.properties create mode 100644 cpp/ql/lib/semmle/code/cpp/Concept.qll create mode 100644 cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme create mode 100644 cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme create mode 100644 cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties diff --git a/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/exprs.ql b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/exprs.ql new file mode 100644 index 000000000000..5c335c836fb8 --- /dev/null +++ b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/exprs.ql @@ -0,0 +1,15 @@ +class Expr extends @expr { + string toString() { none() } +} + +class Location extends @location_expr { + string toString() { none() } +} + +predicate isExprRequires(Expr expr) { exists(int kind | exprs(expr, kind, _) | kind = 390) } + +from Expr expr, int kind, int kind_new, Location location +where + exprs(expr, kind, location) and + if isExprRequires(expr) then kind_new = 1 else kind_new = kind +select expr, kind_new, location diff --git a/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/old.dbscheme b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/old.dbscheme new file mode 100644 index 000000000000..6f5d51e89e76 --- /dev/null +++ b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/old.dbscheme @@ -0,0 +1,2316 @@ + +/** + * 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 +| 390 = @requires_expr +; + +@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/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/semmlecode.cpp.dbscheme b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..7ff6a6e53dbc --- /dev/null +++ b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/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/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/upgrade.properties b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/upgrade.properties new file mode 100644 index 000000000000..89fbcd9b239e --- /dev/null +++ b/cpp/downgrades/6f5d51e89e762fe4609fd4ac8ee3afb04221e873/upgrade.properties @@ -0,0 +1,3 @@ +description: Add requires expr +compatibility: partial +exprs.rel: run exprs.qlo diff --git a/cpp/ql/lib/cpp.qll b/cpp/ql/lib/cpp.qll index 0a29f7b86bac..5162248c4b85 100644 --- a/cpp/ql/lib/cpp.qll +++ b/cpp/ql/lib/cpp.qll @@ -17,6 +17,7 @@ import semmle.code.cpp.File import semmle.code.cpp.Linkage import semmle.code.cpp.Location import semmle.code.cpp.Compilation +import semmle.code.cpp.Concept import semmle.code.cpp.Element import semmle.code.cpp.Namespace import semmle.code.cpp.Specifier diff --git a/cpp/ql/lib/semmle/code/cpp/Concept.qll b/cpp/ql/lib/semmle/code/cpp/Concept.qll new file mode 100644 index 000000000000..fed4c0937cfa --- /dev/null +++ b/cpp/ql/lib/semmle/code/cpp/Concept.qll @@ -0,0 +1,14 @@ +/** + * Provides classes for working with C++ concepts. + */ + +import semmle.code.cpp.exprs.Expr + +/** + * A C/C++ requires expression. + */ +class RequiresExpr extends Expr, @requires_expr { + override string toString() { result = "requires ..." } + + override string getAPrimaryQlClass() { result = "RequiresExpr" } +} diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme index 7ff6a6e53dbc..6f5d51e89e76 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme @@ -1790,6 +1790,7 @@ case @expr.kind of | 387 = @istriviallyrelocatable | 388 = @datasizeof | 389 = @c11_generic +| 390 = @requires_expr ; @var_args_expr = @vastartexpr diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats index 07045b0bd67a..20534e223c94 100644 --- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats @@ -18,15 +18,15 @@ @location_default - 29765023 + 29768202 @location_stmt - 3819884 + 3819867 @location_expr - 13187951 + 13187892 @diagnostic @@ -34,43 +34,43 @@ @file - 123252 + 123267 @folder - 16340 + 16342 @macro_expansion - 33257908 + 33257556 @other_macro_reference - 859032 + 859138 @function - 4179381 + 4179893 @fun_decl - 4543537 + 4544093 @var_decl - 8039427 + 8040412 @type_decl - 3283466 + 3283868 @namespace_decl - 311638 + 311636 @using_declaration - 363221 + 363266 @using_directive @@ -82,15 +82,15 @@ @static_assert - 134702 + 134701 @parameter - 6190639 + 6191397 @membervariable - 1054697 + 1054692 @globalvariable @@ -102,7 +102,7 @@ @enumconstant - 241670 + 241669 @errortype @@ -330,23 +330,23 @@ @pointer - 568175 + 568245 @type_with_specifiers - 852029 + 852134 @array - 110180 + 110193 @routineptr - 625429 + 625426 @reference - 1276410 + 1276567 @gnu_vector @@ -358,7 +358,7 @@ @rvalue_reference - 333342 + 333382 @block @@ -366,43 +366,43 @@ @decltype - 27078 + 27081 @usertype - 5234965 + 5235606 @mangledname - 6061784 + 6062526 @type_mention - 4029136 + 4029118 @routinetype - 538824 + 538891 @ptrtomember - 37816 + 37820 @specifier - 24743 + 24746 @gnuattribute - 553702 + 553770 @stdattribute - 253563 + 253562 @declspec - 239153 + 239152 @msattribute @@ -410,15 +410,15 @@ @alignas - 4668 + 4669 @attribute_arg_token - 25210 + 25213 @attribute_arg_constant_expr - 318402 + 318441 @attribute_arg_empty @@ -438,19 +438,19 @@ @derivation - 391568 + 391566 @frienddecl - 707052 + 707049 @comment - 8266137 + 8266100 @namespace - 12138 + 12139 @specialnamequalifyingelement @@ -458,15 +458,15 @@ @namequalifier - 1513800 + 1513793 @value - 10776699 + 10776651 @initialiser - 1710781 + 1710773 @address_of @@ -474,15 +474,15 @@ @indirect - 292646 + 292644 @array_to_pointer - 1430838 + 1430832 @parexpr - 3587479 + 3587464 @arithnegexpr @@ -498,7 +498,7 @@ @notexpr - 276425 + 276424 @postincrexpr @@ -518,19 +518,19 @@ @conditionalexpr - 657237 + 657235 @addexpr - 398394 + 398392 @subexpr - 340758 + 340757 @mulexpr - 306356 + 306355 @divexpr @@ -542,7 +542,7 @@ @paddexpr - 86662 + 86661 @psubexpr @@ -554,51 +554,51 @@ @lshiftexpr - 566303 + 566300 @rshiftexpr - 140840 + 140839 @andexpr - 489056 + 489054 @orexpr - 145465 + 145464 @xorexpr - 54175 + 54174 @eqexpr - 470650 + 470648 @neexpr - 301667 + 301666 @gtexpr - 104111 + 104123 @ltexpr - 101776 + 101789 @geexpr - 59249 + 59248 @leexpr - 212526 + 212525 @assignexpr - 936957 + 936952 @assignaddexpr @@ -614,7 +614,7 @@ @assigndivexpr - 4994 + 4993 @assignremexpr @@ -638,7 +638,7 @@ @assignxorexpr - 21844 + 21843 @assignpaddexpr @@ -650,15 +650,15 @@ @andlogicalexpr - 249952 + 249951 @orlogicalexpr - 866110 + 866116 @commaexpr - 122841 + 122840 @subscriptexpr @@ -666,7 +666,7 @@ @callexpr - 316534 + 316533 @vastartexpr @@ -686,11 +686,11 @@ @varaccess - 6029127 + 6029100 @runtime_sizeof - 295836 + 295835 @runtime_alignof @@ -698,27 +698,27 @@ @expr_stmt - 94387 + 94386 @routineexpr - 3186314 + 3186299 @type_operand - 1128756 + 1128764 @offsetofexpr - 19993 + 19992 @typescompexpr - 563777 + 563781 @literal - 4406923 + 4406841 @aggregateliteral @@ -730,7 +730,7 @@ @temp_init - 794460 + 794456 @errorexpr @@ -738,11 +738,11 @@ @reference_to - 1572195 + 1572188 @ref_indirect - 1901648 + 1901640 @vacuous_destructor_call @@ -802,7 +802,7 @@ @thisaccess - 1116784 + 1116779 @new_expr @@ -830,7 +830,7 @@ @sizeof_pack - 5602 + 5603 @hasassignexpr @@ -942,7 +942,7 @@ @ctorfieldinit - 190976 + 190975 @ctordelegatinginit @@ -962,7 +962,7 @@ @static_cast - 215649 + 215647 @reinterpret_cast @@ -978,11 +978,11 @@ @lambdaexpr - 21475 + 21478 @param_ref - 235619 + 235618 @noopexpr @@ -1022,7 +1022,7 @@ @istriviallycopyableexpr - 3734 + 3735 @isliteraltypeexpr @@ -1086,7 +1086,7 @@ @noexceptexpr - 24641 + 24640 @builtinshufflevector @@ -1258,7 +1258,7 @@ @reuseexpr - 373719 + 373717 @istriviallycopyassignable @@ -1356,25 +1356,29 @@ @c11_generic 8 + + @requires_expr + 1 + @lambdacapture - 28011 + 28015 @stmt_expr - 1486025 + 1486018 @stmt_if - 725914 + 725911 @stmt_while - 29317 + 29316 @stmt_goto - 110691 + 110690 @stmt_label @@ -1382,15 +1386,15 @@ @stmt_return - 1280145 + 1280140 @stmt_block - 1419271 + 1419265 @stmt_end_test_while - 148874 + 148873 @stmt_for @@ -1398,7 +1402,7 @@ @stmt_switch_case - 207501 + 207500 @stmt_switch @@ -1410,7 +1414,7 @@ @stmt_decl - 593124 + 593118 @stmt_empty @@ -1446,15 +1450,15 @@ @stmt_range_based_for - 8403 + 8404 @stmt_handler - 62676 + 62675 @stmt_constexpr_if - 52998 + 52997 @stmt_co_return @@ -1462,39 +1466,39 @@ @ppd_if - 667151 + 667232 @ppd_ifdef - 263312 + 263344 @ppd_ifndef - 266580 + 266612 @ppd_elif - 25210 + 25213 @ppd_else - 209155 + 209181 @ppd_endif - 1197043 + 1197190 @ppd_plain_include - 311399 + 311437 @ppd_define - 2291924 + 2291914 @ppd_undef - 258643 + 258675 @ppd_include_next @@ -1510,7 +1514,7 @@ @ppd_pragma - 296710 + 296709 @ppd_objc_import @@ -1600,7 +1604,7 @@ compilation_args - 652551 + 652548 id @@ -2148,7 +2152,7 @@ seconds - 9149 + 9348 @@ -2237,39 +2241,39 @@ 239 - 5 - 8 - 159 + 6 + 7 + 119 8 - 10 - 119 + 9 + 79 - 10 + 9 11 159 11 - 15 + 13 159 - 17 - 19 + 14 + 17 159 - 20 - 44 + 18 + 22 159 - 50 - 92 - 79 + 25 + 91 + 159 @@ -2337,37 +2341,37 @@ 3 4 - 1478 + 1358 4 5 - 279 + 399 5 6 - 239 + 279 6 7 - 479 + 319 7 8 - 39 + 159 8 9 - 279 + 239 9 - 24 - 239 + 23 + 279 25 @@ -2420,21 +2424,16 @@ 3 4 - 39 - - - 4 - 5 - 39 + 79 - 124 - 125 + 138 + 139 39 - 129 - 130 + 144 + 145 39 @@ -2451,27 +2450,27 @@ 1 2 - 4394 + 4434 2 3 - 1757 + 2437 3 4 - 1518 + 1158 4 5 - 998 + 679 5 46 - 479 + 639 @@ -2492,27 +2491,27 @@ 2 3 - 1478 + 2037 3 4 - 1478 + 998 4 5 - 799 + 918 5 - 6 - 559 + 7 + 759 - 6 - 75 - 719 + 7 + 74 + 519 @@ -2528,12 +2527,12 @@ 1 2 - 7910 + 7191 2 3 - 1238 + 2157 @@ -2877,7 +2876,7 @@ cpu_seconds - 7100 + 7145 elapsed_seconds @@ -2927,22 +2926,17 @@ 1 2 - 5655 + 5757 2 3 - 857 + 903 3 - 7 - 553 - - - 11 - 13 - 33 + 20 + 485 @@ -2958,12 +2952,12 @@ 1 2 - 6400 + 6524 2 3 - 699 + 620 @@ -2982,8 +2976,8 @@ 33 - 4 - 5 + 6 + 7 11 @@ -2991,10 +2985,15 @@ 9 11 + + 10 + 11 + 11 + 13 14 - 22 + 11 51 @@ -3002,23 +3001,23 @@ 11 - 159 - 160 + 164 + 165 11 - 177 - 178 + 171 + 172 11 - 185 - 186 + 191 + 192 11 - 247 - 248 + 243 + 244 11 @@ -3038,8 +3037,8 @@ 33 - 4 - 5 + 6 + 7 11 @@ -3048,8 +3047,8 @@ 11 - 12 - 13 + 10 + 11 11 @@ -3063,23 +3062,23 @@ 11 - 112 - 113 + 121 + 122 11 - 124 - 125 + 123 + 124 11 - 145 - 146 + 138 + 139 11 - 218 - 219 + 214 + 215 11 @@ -4852,31 +4851,31 @@ locations_default - 29765023 + 29768202 id - 29765023 + 29768202 container - 123252 + 123267 startLine - 2095293 + 2095549 startColumn - 36882 + 36886 endLine - 2099495 + 2099752 endColumn - 48087 + 48093 @@ -4890,7 +4889,7 @@ 1 2 - 29765023 + 29768202 @@ -4906,7 +4905,7 @@ 1 2 - 29765023 + 29768202 @@ -4922,7 +4921,7 @@ 1 2 - 29765023 + 29768202 @@ -4938,7 +4937,7 @@ 1 2 - 29765023 + 29768202 @@ -4954,7 +4953,7 @@ 1 2 - 29765023 + 29768202 @@ -4970,67 +4969,67 @@ 1 11 - 9804 + 9805 11 18 - 10271 + 10272 18 30 - 9337 + 9338 30 42 - 9804 + 9805 43 61 - 9804 + 9805 61 79 - 9337 + 9338 80 106 - 9804 + 9805 108 149 - 9337 + 9338 149 199 - 9337 + 9338 206 291 - 9337 + 9338 304 469 - 9337 + 9338 482 850 - 9337 + 9338 936 2380 - 8403 + 8404 @@ -5046,67 +5045,67 @@ 1 8 - 9337 + 9338 8 13 - 9337 + 9338 13 20 - 9804 + 9805 20 32 - 9337 + 9338 32 43 - 9804 + 9805 44 61 - 9337 + 9338 62 72 - 9337 + 9338 73 93 - 9337 + 9338 97 128 - 9337 + 9338 128 180 - 9337 + 9338 180 267 - 9337 + 9338 277 414 - 9337 + 9338 439 1465 - 9337 + 9338 1557 @@ -5127,67 +5126,67 @@ 1 4 - 8870 + 8871 4 5 - 7936 + 7937 5 6 - 7469 + 7470 6 8 - 11204 + 11206 8 10 - 9337 + 9338 10 15 - 10737 + 10739 15 23 - 9804 + 9805 23 28 - 11204 + 11206 28 34 - 9804 + 9805 34 44 - 9337 + 9338 44 55 - 9337 + 9338 55 66 - 9804 + 9805 66 77 - 8403 + 8404 @@ -5203,67 +5202,67 @@ 1 8 - 9337 + 9338 8 13 - 9337 + 9338 13 20 - 9804 + 9805 20 32 - 9337 + 9338 32 43 - 9804 + 9805 43 60 - 9337 + 9338 61 71 - 9337 + 9338 72 93 - 9337 + 9338 94 127 - 9337 + 9338 128 179 - 9337 + 9338 180 268 - 9337 + 9338 278 413 - 9337 + 9338 437 1465 - 9337 + 9338 1554 @@ -5284,67 +5283,67 @@ 1 9 - 9804 + 9805 9 13 - 9337 + 9338 13 18 - 9337 + 9338 18 26 - 10271 + 10272 27 33 - 9337 + 9338 33 39 - 9337 + 9338 39 47 - 10271 + 10272 47 53 - 9337 + 9338 53 60 - 10271 + 10272 60 66 - 9337 + 9338 66 74 - 9804 + 9805 74 78 - 9804 + 9805 78 90 - 7002 + 7003 @@ -5360,52 +5359,52 @@ 1 2 - 583115 + 583186 2 3 - 314200 + 314239 3 4 - 195616 + 195640 4 6 - 162002 + 162022 6 10 - 183011 + 183033 10 16 - 162936 + 162956 16 25 - 169005 + 169026 25 46 - 161068 + 161088 46 169 - 157333 + 157353 169 265 - 7002 + 7003 @@ -5421,42 +5420,42 @@ 1 2 - 871171 + 871278 2 3 - 273583 + 273616 3 5 - 193749 + 193773 5 8 - 173674 + 173695 8 13 - 188146 + 188169 13 20 - 161068 + 161088 20 51 - 159668 + 159687 51 265 - 74231 + 74240 @@ -5472,47 +5471,47 @@ 1 2 - 612060 + 612135 2 3 - 313266 + 313305 3 4 - 198417 + 198442 4 6 - 183011 + 183033 6 9 - 173207 + 173228 9 13 - 163402 + 163423 13 19 - 174607 + 174629 19 29 - 164803 + 164823 29 52 - 112514 + 112528 @@ -5528,22 +5527,22 @@ 1 2 - 1531786 + 1531974 2 3 - 348748 + 348791 3 5 - 162002 + 162022 5 16 - 52755 + 52762 @@ -5559,47 +5558,47 @@ 1 2 - 587783 + 587855 2 3 - 316068 + 316106 3 4 - 197484 + 197508 4 6 - 168538 + 168559 6 9 - 158267 + 158286 9 14 - 170872 + 170893 14 21 - 175074 + 175096 21 32 - 162469 + 162489 32 63 - 157800 + 157819 64 @@ -6015,52 +6014,52 @@ 1 2 - 593386 + 593459 2 3 - 306263 + 306301 3 4 - 198417 + 198442 4 6 - 159668 + 159687 6 10 - 182544 + 182566 10 16 - 162002 + 162022 16 25 - 171339 + 171360 25 46 - 158734 + 158753 46 161 - 158267 + 158286 162 265 - 8870 + 8871 @@ -6076,47 +6075,47 @@ 1 2 - 886577 + 886686 2 3 - 260044 + 260076 3 4 - 125120 + 125135 4 6 - 140993 + 141010 6 10 - 184878 + 184901 10 15 - 168538 + 168559 15 26 - 163402 + 163423 26 120 - 158267 + 158286 121 265 - 11671 + 11673 @@ -6132,22 +6131,22 @@ 1 2 - 1529452 + 1529639 2 3 - 341745 + 341787 3 5 - 170872 + 170893 5 10 - 57424 + 57431 @@ -6163,47 +6162,47 @@ 1 2 - 623265 + 623342 2 3 - 303462 + 303499 3 4 - 201685 + 201710 4 6 - 183945 + 183967 6 9 - 169939 + 169959 9 13 - 166671 + 166691 13 19 - 175074 + 175096 19 29 - 161068 + 161088 29 52 - 114382 + 114396 @@ -6219,52 +6218,52 @@ 1 2 - 599922 + 599995 2 3 - 306263 + 306301 3 4 - 197017 + 197041 4 6 - 169005 + 169026 6 9 - 156400 + 156419 9 14 - 169005 + 169026 14 21 - 177875 + 177897 21 32 - 162002 + 162022 32 60 - 158267 + 158286 60 65 - 3734 + 3735 @@ -6280,62 +6279,62 @@ 1 2 - 5135 + 5136 2 8 - 3734 + 3735 9 186 - 3734 + 3735 193 288 - 3734 + 3735 294 495 - 3734 + 3735 503 - 555 - 3734 + 554 + 3735 561 633 - 3734 + 3735 640 758 - 3734 + 3735 758 869 - 3734 + 3735 875 1074 - 3734 + 3735 1074 1281 - 3734 + 3735 1289 1590 - 3734 + 3735 1685 @@ -6356,62 +6355,62 @@ 1 2 - 5602 + 5603 2 5 - 3734 + 3735 5 65 - 3734 + 3735 70 100 - 3734 + 3735 100 111 - 3734 + 3735 112 122 - 4201 + 4202 122 140 - 3734 + 3735 143 153 - 3734 + 3735 153 161 - 4201 + 4202 161 173 - 4201 + 4202 173 178 - 3734 + 3735 188 265 - 3734 + 3735 @@ -6427,62 +6426,62 @@ 1 2 - 5602 + 5603 2 8 - 3734 + 3735 9 105 - 3734 + 3735 155 241 - 3734 + 3735 253 336 - 3734 + 3735 340 426 - 3734 + 3735 434 488 - 3734 + 3735 489 572 - 3734 + 3735 573 623 - 3734 + 3735 626 696 - 4201 + 4202 701 813 - 3734 + 3735 818 1095 - 3734 + 3735 1172 @@ -6508,32 +6507,32 @@ 2 4 - 3734 + 3735 4 8 - 4201 + 4202 8 15 - 3734 + 3735 15 23 - 3734 + 3735 23 29 - 3734 + 3735 29 35 - 4201 + 4202 35 @@ -6553,12 +6552,12 @@ 44 46 - 3734 + 3735 46 49 - 3734 + 3735 49 @@ -6579,62 +6578,62 @@ 1 2 - 5602 + 5603 2 8 - 3734 + 3735 9 156 - 3734 + 3735 159 240 - 3734 + 3735 251 335 - 3734 + 3735 342 430 - 3734 + 3735 432 490 - 3734 + 3735 490 573 - 3734 + 3735 574 622 - 3734 + 3735 626 698 - 3734 + 3735 700 798 - 3734 + 3735 811 987 - 3734 + 3735 1096 @@ -6649,11 +6648,11 @@ locations_stmt - 3819884 + 3819867 id - 3819884 + 3819867 container @@ -6661,7 +6660,7 @@ startLine - 200172 + 200171 startColumn @@ -6669,7 +6668,7 @@ endLine - 194428 + 194427 endColumn @@ -6687,7 +6686,7 @@ 1 2 - 3819884 + 3819867 @@ -6703,7 +6702,7 @@ 1 2 - 3819884 + 3819867 @@ -6719,7 +6718,7 @@ 1 2 - 3819884 + 3819867 @@ -6735,7 +6734,7 @@ 1 2 - 3819884 + 3819867 @@ -6751,7 +6750,7 @@ 1 2 - 3819884 + 3819867 @@ -7167,7 +7166,7 @@ 4 6 - 14473 + 14472 6 @@ -7273,7 +7272,7 @@ 29 36 - 16017 + 16016 36 @@ -7466,7 +7465,7 @@ 6 8 - 14720 + 14719 8 @@ -7927,7 +7926,7 @@ 15 21 - 16120 + 16119 21 @@ -7942,7 +7941,7 @@ 34 42 - 15770 + 15769 42 @@ -8631,11 +8630,11 @@ locations_expr - 13187951 + 13187892 id - 13187951 + 13187892 container @@ -8643,7 +8642,7 @@ startLine - 192225 + 192224 startColumn @@ -8651,7 +8650,7 @@ endLine - 192204 + 192203 endColumn @@ -8669,7 +8668,7 @@ 1 2 - 13187951 + 13187892 @@ -8685,7 +8684,7 @@ 1 2 - 13187951 + 13187892 @@ -8701,7 +8700,7 @@ 1 2 - 13187951 + 13187892 @@ -8717,7 +8716,7 @@ 1 2 - 13187951 + 13187892 @@ -8733,7 +8732,7 @@ 1 2 - 13187951 + 13187892 @@ -9225,7 +9224,7 @@ 1 2 - 23552 + 23551 2 @@ -9306,7 +9305,7 @@ 7 11 - 16717 + 16716 11 @@ -9448,7 +9447,7 @@ 43 47 - 14720 + 14719 47 @@ -9458,7 +9457,7 @@ 52 65 - 14473 + 14472 65 @@ -9940,7 +9939,7 @@ 1 2 - 23552 + 23551 2 @@ -10563,23 +10562,23 @@ numlines - 1383789 + 1383959 element_id - 1376786 + 1376955 num_lines - 101776 + 101789 num_code - 84969 + 84979 num_comment - 59758 + 59766 @@ -10593,12 +10592,12 @@ 1 2 - 1369783 + 1369951 2 3 - 7002 + 7003 @@ -10614,7 +10613,7 @@ 1 2 - 1370717 + 1370885 2 @@ -10635,7 +10634,7 @@ 1 2 - 1376786 + 1376955 @@ -10651,22 +10650,22 @@ 1 2 - 68162 + 68170 2 3 - 12138 + 12139 3 4 - 7469 + 7470 4 21 - 7936 + 7937 29 @@ -10687,22 +10686,22 @@ 1 2 - 70496 + 70505 2 3 - 12138 + 12139 3 4 - 8403 + 8404 4 6 - 9337 + 9338 6 @@ -10723,17 +10722,17 @@ 1 2 - 69562 + 69571 2 3 - 14939 + 14941 3 4 - 10737 + 10739 4 @@ -10754,12 +10753,12 @@ 1 2 - 52755 + 52762 2 3 - 14472 + 14474 3 @@ -10774,7 +10773,7 @@ 44 922 - 4668 + 4669 @@ -10790,12 +10789,12 @@ 1 2 - 52755 + 52762 2 3 - 16807 + 16809 3 @@ -10826,22 +10825,22 @@ 1 2 - 53222 + 53229 2 3 - 15873 + 15875 3 5 - 7469 + 7470 5 7 - 5135 + 5136 7 @@ -10862,27 +10861,27 @@ 1 2 - 34548 + 34552 2 3 - 9337 + 9338 3 4 - 4201 + 4202 4 6 - 4668 + 4669 6 11 - 5135 + 5136 17 @@ -10903,27 +10902,27 @@ 1 2 - 34548 + 34552 2 3 - 9337 + 9338 3 4 - 4201 + 4202 4 6 - 4668 + 4669 6 8 - 4668 + 4669 10 @@ -10944,27 +10943,27 @@ 1 2 - 34548 + 34552 2 3 - 9337 + 9338 3 4 - 4201 + 4202 4 6 - 4668 + 4669 6 10 - 4668 + 4669 10 @@ -11611,15 +11610,15 @@ files - 123252 + 123267 id - 123252 + 123267 name - 123252 + 123267 @@ -11633,7 +11632,7 @@ 1 2 - 123252 + 123267 @@ -11649,7 +11648,7 @@ 1 2 - 123252 + 123267 @@ -11659,15 +11658,15 @@ folders - 16340 + 16342 id - 16340 + 16342 name - 16340 + 16342 @@ -11681,7 +11680,7 @@ 1 2 - 16340 + 16342 @@ -11697,7 +11696,7 @@ 1 2 - 16340 + 16342 @@ -11707,15 +11706,15 @@ containerparent - 138659 + 138676 parent - 16340 + 16342 child - 138659 + 138676 @@ -11729,7 +11728,7 @@ 1 2 - 7469 + 7470 2 @@ -11770,7 +11769,7 @@ 1 2 - 138659 + 138676 @@ -11780,7 +11779,7 @@ fileannotations - 5129447 + 5129404 id @@ -11792,7 +11791,7 @@ name - 54773 + 54772 value @@ -11815,7 +11814,7 @@ 2 3 - 4730 + 4729 @@ -12066,7 +12065,7 @@ 20 34 - 4222 + 4221 34 @@ -12102,7 +12101,7 @@ 1 2 - 54773 + 54772 @@ -12326,12 +12325,12 @@ 39 48 - 3612 + 3646 48 74 - 3567 + 3533 74 @@ -12356,15 +12355,15 @@ inmacroexpansion - 109779137 + 109779097 id - 18027366 + 18027697 inv - 2700175 + 2700160 @@ -12378,37 +12377,37 @@ 1 3 - 1581965 + 1582361 3 5 - 1077798 + 1077794 5 6 - 1184883 + 1184878 6 7 - 4819923 + 4819904 7 8 - 6385959 + 6385933 8 9 - 2605253 + 2605242 9 21 - 371583 + 371581 @@ -12424,7 +12423,7 @@ 1 2 - 378428 + 378424 2 @@ -12434,22 +12433,22 @@ 3 4 - 351515 + 351513 4 7 - 200660 + 200658 7 8 - 207152 + 207151 8 9 - 241888 + 241887 9 @@ -12459,17 +12458,17 @@ 10 11 - 325486 + 325485 11 337 - 224849 + 224845 339 423 - 206353 + 206352 423 @@ -12484,15 +12483,15 @@ affectedbymacroexpansion - 35689082 + 35689256 id - 5156745 + 5156949 inv - 2784776 + 2784762 @@ -12506,32 +12505,32 @@ 1 2 - 2815933 + 2816079 2 3 - 560132 + 560184 3 4 - 264906 + 264908 4 5 - 565794 + 565803 5 12 - 391903 + 391901 12 50 - 407401 + 407399 50 @@ -12552,32 +12551,32 @@ 1 4 - 229120 + 229116 4 7 - 231788 + 231720 7 9 - 220478 + 220491 9 12 - 251087 + 251120 12 13 - 333978 + 333985 13 14 - 165588 + 165593 14 @@ -12587,7 +12586,7 @@ 15 16 - 121843 + 121842 16 @@ -12597,7 +12596,7 @@ 17 18 - 146940 + 146942 18 @@ -12607,7 +12606,7 @@ 20 25 - 208979 + 208978 25 @@ -12622,19 +12621,19 @@ macroinvocations - 33491157 + 33490802 id - 33491157 + 33490802 macro_id - 79484 + 79483 location - 760390 + 760382 kind @@ -12652,7 +12651,7 @@ 1 2 - 33491157 + 33490802 @@ -12668,7 +12667,7 @@ 1 2 - 33491157 + 33490802 @@ -12684,7 +12683,7 @@ 1 2 - 33491157 + 33490802 @@ -12766,7 +12765,7 @@ 1 2 - 42468 + 42467 2 @@ -12781,7 +12780,7 @@ 4 6 - 6841 + 6840 6 @@ -12812,7 +12811,7 @@ 1 2 - 73749 + 73748 2 @@ -12833,22 +12832,22 @@ 1 2 - 281226 + 281223 2 3 - 169659 + 169657 3 4 - 70735 + 70734 4 5 - 60327 + 60326 5 @@ -12884,12 +12883,12 @@ 1 2 - 714219 + 714211 2 350 - 46171 + 46170 @@ -12905,7 +12904,7 @@ 1 2 - 760390 + 760382 @@ -12978,15 +12977,15 @@ macroparent - 29950856 + 29950538 id - 29950856 + 29950538 parent_id - 23287102 + 23286856 @@ -13000,7 +12999,7 @@ 1 2 - 29950856 + 29950538 @@ -13016,17 +13015,17 @@ 1 2 - 17992872 + 17992681 2 3 - 4459570 + 4459523 3 88 - 834659 + 834650 @@ -13036,15 +13035,15 @@ macrolocationbind - 4043799 + 4043781 id - 2831150 + 2831137 location - 2021069 + 2021060 @@ -13058,22 +13057,22 @@ 1 2 - 2229922 + 2229912 2 3 - 341125 + 341123 3 7 - 230525 + 230524 7 57 - 29577 + 29576 @@ -13089,12 +13088,12 @@ 1 2 - 1611024 + 1611017 2 3 - 177682 + 177681 3 @@ -13104,7 +13103,7 @@ 8 723 - 75493 + 75492 @@ -13114,11 +13113,11 @@ macro_argument_unexpanded - 84549814 + 84548918 invocation - 26214874 + 26214596 argument_index @@ -13126,7 +13125,7 @@ text - 318310 + 318306 @@ -13140,22 +13139,22 @@ 1 2 - 7432497 + 7432418 2 3 - 10674075 + 10673962 3 4 - 6139354 + 6139289 4 67 - 1968946 + 1968925 @@ -13171,22 +13170,22 @@ 1 2 - 7502657 + 7502578 2 3 - 10820626 + 10820511 3 4 - 5973025 + 5972962 4 67 - 1918564 + 1918544 @@ -13254,12 +13253,12 @@ 1 2 - 35074 + 35073 2 3 - 61264 + 61263 3 @@ -13269,12 +13268,12 @@ 4 5 - 45087 + 45086 5 7 - 23932 + 23931 7 @@ -13289,7 +13288,7 @@ 16 23 - 24982 + 24981 23 @@ -13320,7 +13319,7 @@ 1 2 - 230201 + 230198 2 @@ -13330,7 +13329,7 @@ 3 9 - 10284 + 10283 @@ -13340,11 +13339,11 @@ macro_argument_expanded - 84549814 + 84548918 invocation - 26214874 + 26214596 argument_index @@ -13352,7 +13351,7 @@ text - 192902 + 192900 @@ -13366,22 +13365,22 @@ 1 2 - 7432497 + 7432418 2 3 - 10674075 + 10673962 3 4 - 6139354 + 6139289 4 67 - 1968946 + 1968925 @@ -13397,22 +13396,22 @@ 1 2 - 10688841 + 10688727 2 3 - 9201903 + 9201805 3 4 - 5208300 + 5208245 4 9 - 1115829 + 1115817 @@ -13551,7 +13550,7 @@ 1 2 - 97625 + 97624 2 @@ -13571,15 +13570,15 @@ functions - 4179381 + 4179893 id - 4179381 + 4179893 name - 1895474 + 1895706 kind @@ -13597,7 +13596,7 @@ 1 2 - 4179381 + 4179893 @@ -13613,7 +13612,7 @@ 1 2 - 4179381 + 4179893 @@ -13629,22 +13628,22 @@ 1 2 - 1498172 + 1498355 2 3 - 153131 + 153150 3 5 - 142860 + 142878 5 952 - 101309 + 101322 @@ -13660,7 +13659,7 @@ 1 2 - 1895007 + 1895240 2 @@ -13762,15 +13761,15 @@ function_entry_point - 1151757 + 1151752 id - 1141953 + 1141948 entry_point - 1151757 + 1151752 @@ -13784,7 +13783,7 @@ 1 2 - 1132149 + 1132144 2 @@ -13805,7 +13804,7 @@ 1 2 - 1151757 + 1151752 @@ -13815,15 +13814,15 @@ function_return_type - 4184517 + 4185029 id - 4179381 + 4179893 return_type - 817948 + 818048 @@ -13837,12 +13836,12 @@ 1 2 - 4174246 + 4174757 2 3 - 5135 + 5136 @@ -13858,22 +13857,22 @@ 1 2 - 506082 + 506144 2 3 - 211490 + 211516 3 7 - 66294 + 66303 7 2231 - 34081 + 34085 @@ -14153,44 +14152,44 @@ purefunctions - 100952 + 100951 id - 100952 + 100951 function_deleted - 96174 + 96186 id - 96174 + 96186 function_defaulted - 73764 + 73773 id - 73764 + 73773 function_prototyped - 4087409 + 4087910 id - 4087409 + 4087910 @@ -14270,11 +14269,11 @@ member_function_this_type - 536525 + 536522 id - 536525 + 536522 this_type @@ -14292,7 +14291,7 @@ 1 2 - 536525 + 536522 @@ -14343,27 +14342,27 @@ fun_decls - 4548672 + 4549229 id - 4543537 + 4544093 function - 4035587 + 4036081 type_id - 816548 + 816648 name - 1797899 + 1798120 location - 3370770 + 3371183 @@ -14377,7 +14376,7 @@ 1 2 - 4543537 + 4544093 @@ -14393,12 +14392,12 @@ 1 2 - 4538401 + 4538957 2 3 - 5135 + 5136 @@ -14414,7 +14413,7 @@ 1 2 - 4543537 + 4544093 @@ -14430,7 +14429,7 @@ 1 2 - 4543537 + 4544093 @@ -14446,17 +14445,17 @@ 1 2 - 3606537 + 3606979 2 3 - 356218 + 356262 3 7 - 72831 + 72839 @@ -14472,12 +14471,12 @@ 1 2 - 3995903 + 3996393 2 3 - 39683 + 39688 @@ -14493,7 +14492,7 @@ 1 2 - 4035587 + 4036081 @@ -14509,17 +14508,17 @@ 1 2 - 3663028 + 3663477 2 3 - 311866 + 311904 3 6 - 60692 + 60699 @@ -14535,22 +14534,22 @@ 1 2 - 431383 + 431436 2 3 - 274050 + 274083 3 6 - 63493 + 63501 6 2476 - 47620 + 47626 @@ -14566,22 +14565,22 @@ 1 2 - 515419 + 515482 2 3 - 203086 + 203111 3 7 - 63026 + 63034 7 2192 - 35014 + 35019 @@ -14597,17 +14596,17 @@ 1 2 - 690027 + 690112 2 4 - 67228 + 67236 4 773 - 59291 + 59299 @@ -14623,22 +14622,22 @@ 1 2 - 595253 + 595326 2 3 - 121385 + 121399 3 7 - 63493 + 63501 7 1959 - 36415 + 36419 @@ -14654,27 +14653,27 @@ 1 2 - 1228323 + 1228474 2 3 - 267047 + 267079 3 4 - 77966 + 77976 4 7 - 146128 + 146146 7 986 - 78433 + 78443 @@ -14690,22 +14689,22 @@ 1 2 - 1407600 + 1407772 2 3 - 152198 + 152216 3 5 - 136791 + 136808 5 936 - 101309 + 101322 @@ -14721,17 +14720,17 @@ 1 2 - 1579406 + 1579600 2 4 - 134924 + 134940 4 562 - 83568 + 83579 @@ -14747,27 +14746,27 @@ 1 2 - 1236260 + 1236411 2 3 - 293191 + 293227 3 4 - 78900 + 78909 4 8 - 137258 + 137275 8 542 - 52288 + 52295 @@ -14783,17 +14782,17 @@ 1 2 - 2966464 + 2966828 2 4 - 277785 + 277819 4 55 - 126520 + 126536 @@ -14809,17 +14808,17 @@ 1 2 - 3033693 + 3034065 2 7 - 244170 + 244200 7 55 - 92906 + 92917 @@ -14835,12 +14834,12 @@ 1 2 - 3207367 + 3207760 2 18 - 163402 + 163423 @@ -14856,12 +14855,12 @@ 1 2 - 3232578 + 3232974 2 13 - 138192 + 138209 @@ -14871,22 +14870,22 @@ fun_def - 1888938 + 1889170 id - 1888938 + 1889170 fun_specialized - 26144 + 26147 id - 26144 + 26147 @@ -14904,11 +14903,11 @@ fun_decl_specifiers - 2906705 + 2907062 id - 1689587 + 1689793 name @@ -14926,17 +14925,17 @@ 1 2 - 491142 + 491202 2 3 - 1179769 + 1179914 3 4 - 18674 + 18676 @@ -15108,22 +15107,22 @@ fun_decl_empty_throws - 1472027 + 1472207 fun_decl - 1472027 + 1472207 fun_decl_noexcept - 61667 + 61666 fun_decl - 61667 + 61666 constant @@ -15141,7 +15140,7 @@ 1 2 - 61667 + 61666 @@ -15172,11 +15171,11 @@ fun_decl_empty_noexcept - 863234 + 863340 fun_decl - 863234 + 863340 @@ -15281,19 +15280,19 @@ param_decl_bind - 6995048 + 6995905 id - 6995048 + 6995905 index - 7936 + 7937 fun_decl - 3835301 + 3835771 @@ -15307,7 +15306,7 @@ 1 2 - 6995048 + 6995905 @@ -15323,7 +15322,7 @@ 1 2 - 6995048 + 6995905 @@ -15501,22 +15500,22 @@ 1 2 - 1973908 + 1974150 2 3 - 1061652 + 1061782 3 4 - 502814 + 502875 4 8 - 290857 + 290892 8 @@ -15537,22 +15536,22 @@ 1 2 - 1973908 + 1974150 2 3 - 1061652 + 1061782 3 4 - 502814 + 502875 4 8 - 290857 + 290892 8 @@ -15567,27 +15566,27 @@ var_decls - 8110391 + 8111384 id - 8039427 + 8040412 variable - 7027262 + 7028123 type_id - 2043471 + 2043721 name - 667617 + 667699 location - 5311998 + 5312648 @@ -15601,7 +15600,7 @@ 1 2 - 8039427 + 8040412 @@ -15617,12 +15616,12 @@ 1 2 - 7971265 + 7972241 2 3 - 68162 + 68170 @@ -15638,7 +15637,7 @@ 1 2 - 8039427 + 8040412 @@ -15654,7 +15653,7 @@ 1 2 - 8036626 + 8037610 2 @@ -15675,17 +15674,17 @@ 1 2 - 6175232 + 6175989 2 3 - 698431 + 698516 3 7 - 153598 + 153617 @@ -15701,12 +15700,12 @@ 1 2 - 6855922 + 6856762 2 4 - 171339 + 171360 @@ -15722,12 +15721,12 @@ 1 2 - 6911946 + 6912793 2 3 - 115315 + 115329 @@ -15743,12 +15742,12 @@ 1 2 - 6481963 + 6482757 2 3 - 542964 + 543031 3 @@ -15769,27 +15768,27 @@ 1 2 - 1165763 + 1165906 2 3 - 477136 + 477195 3 4 - 94773 + 94785 4 7 - 184878 + 184901 7 762 - 120918 + 120933 @@ -15805,22 +15804,22 @@ 1 2 - 1299287 + 1299446 2 3 - 452392 + 452448 3 6 - 155933 + 155952 6 724 - 135857 + 135874 @@ -15836,17 +15835,17 @@ 1 2 - 1539256 + 1539444 2 3 - 383296 + 383343 3 128 - 120918 + 120933 @@ -15862,22 +15861,22 @@ 1 2 - 1365582 + 1365749 2 3 - 404305 + 404355 3 7 - 173207 + 173228 7 592 - 100376 + 100388 @@ -15893,37 +15892,37 @@ 1 2 - 341278 + 341320 2 3 - 86837 + 86847 3 4 - 48554 + 48559 4 6 - 51822 + 51828 6 12 - 52288 + 52295 12 33 - 50421 + 50427 34 2384 - 36415 + 36419 @@ -15939,37 +15938,37 @@ 1 2 - 368823 + 368869 2 3 - 77966 + 77976 3 4 - 45285 + 45291 4 6 - 49487 + 49493 6 14 - 53222 + 53229 14 56 - 50888 + 50894 56 2301 - 21942 + 21945 @@ -15985,27 +15984,27 @@ 1 2 - 457061 + 457117 2 3 - 93840 + 93851 3 5 - 46686 + 46692 5 19 - 50888 + 50894 19 1182 - 19141 + 19143 @@ -16021,32 +16020,32 @@ 1 2 - 379094 + 379141 2 3 - 90571 + 90583 3 5 - 59758 + 59766 5 9 - 51355 + 51361 9 21 - 50421 + 50427 21 1010 - 36415 + 36419 @@ -16062,17 +16061,17 @@ 1 2 - 4496383 + 4496934 2 3 - 531760 + 531825 3 896 - 283854 + 283889 @@ -16088,17 +16087,17 @@ 1 2 - 4885749 + 4886348 2 17 - 415510 + 415561 17 892 - 10737 + 10739 @@ -16114,12 +16113,12 @@ 1 2 - 4961848 + 4962456 2 759 - 350149 + 350192 @@ -16135,12 +16134,12 @@ 1 2 - 5302660 + 5303310 2 6 - 9337 + 9338 @@ -16150,22 +16149,22 @@ var_def - 3994969 + 3995459 id - 3994969 + 3995459 var_decl_specifiers - 378628 + 378674 id - 378628 + 378674 name @@ -16183,7 +16182,7 @@ 1 2 - 378628 + 378674 @@ -16235,19 +16234,19 @@ type_decls - 3283466 + 3283868 id - 3283466 + 3283868 type_id - 3233045 + 3233441 location - 3166283 + 3166671 @@ -16261,7 +16260,7 @@ 1 2 - 3283466 + 3283868 @@ -16277,7 +16276,7 @@ 1 2 - 3283466 + 3283868 @@ -16293,12 +16292,12 @@ 1 2 - 3191493 + 3191884 2 5 - 41551 + 41556 @@ -16314,12 +16313,12 @@ 1 2 - 3191493 + 3191884 2 5 - 41551 + 41556 @@ -16335,12 +16334,12 @@ 1 2 - 3113994 + 3114375 2 20 - 52288 + 52295 @@ -16356,12 +16355,12 @@ 1 2 - 3113994 + 3114375 2 20 - 52288 + 52295 @@ -16371,33 +16370,33 @@ type_def - 2641993 + 2642316 id - 2641993 + 2642316 type_decl_top - 743717 + 743808 type_decl - 743717 + 743808 namespace_decls - 311638 + 311636 id - 311638 + 311636 namespace_id @@ -16405,11 +16404,11 @@ location - 311638 + 311636 bodylocation - 311638 + 311636 @@ -16423,7 +16422,7 @@ 1 2 - 311638 + 311636 @@ -16439,7 +16438,7 @@ 1 2 - 311638 + 311636 @@ -16455,7 +16454,7 @@ 1 2 - 311638 + 311636 @@ -16669,7 +16668,7 @@ 1 2 - 311638 + 311636 @@ -16685,7 +16684,7 @@ 1 2 - 311638 + 311636 @@ -16701,7 +16700,7 @@ 1 2 - 311638 + 311636 @@ -16717,7 +16716,7 @@ 1 2 - 311638 + 311636 @@ -16733,7 +16732,7 @@ 1 2 - 311638 + 311636 @@ -16749,7 +16748,7 @@ 1 2 - 311638 + 311636 @@ -16759,19 +16758,19 @@ usings - 369757 + 369802 id - 369757 + 369802 element_id - 315601 + 315639 location - 247905 + 247936 kind @@ -16789,7 +16788,7 @@ 1 2 - 369757 + 369802 @@ -16805,7 +16804,7 @@ 1 2 - 369757 + 369802 @@ -16821,7 +16820,7 @@ 1 2 - 369757 + 369802 @@ -16837,12 +16836,12 @@ 1 2 - 263312 + 263344 2 3 - 50888 + 50894 3 @@ -16863,12 +16862,12 @@ 1 2 - 263312 + 263344 2 3 - 50888 + 50894 3 @@ -16889,7 +16888,7 @@ 1 2 - 315601 + 315639 @@ -16905,17 +16904,17 @@ 1 2 - 202619 + 202644 2 4 - 10737 + 10739 4 5 - 31280 + 31283 5 @@ -16936,17 +16935,17 @@ 1 2 - 202619 + 202644 2 4 - 10737 + 10739 4 5 - 31280 + 31283 5 @@ -16967,7 +16966,7 @@ 1 2 - 247905 + 247936 @@ -17040,7 +17039,7 @@ using_container - 466802 + 466798 parent @@ -17048,7 +17047,7 @@ child - 295992 + 295989 @@ -17118,12 +17117,12 @@ 1 2 - 218314 + 218311 2 3 - 51725 + 51724 3 @@ -17143,15 +17142,15 @@ static_asserts - 134702 + 134701 id - 134702 + 134701 condition - 134702 + 134701 message @@ -17177,7 +17176,7 @@ 1 2 - 134702 + 134701 @@ -17193,7 +17192,7 @@ 1 2 - 134702 + 134701 @@ -17209,7 +17208,7 @@ 1 2 - 134702 + 134701 @@ -17225,7 +17224,7 @@ 1 2 - 134702 + 134701 @@ -17241,7 +17240,7 @@ 1 2 - 134702 + 134701 @@ -17257,7 +17256,7 @@ 1 2 - 134702 + 134701 @@ -17273,7 +17272,7 @@ 1 2 - 134702 + 134701 @@ -17289,7 +17288,7 @@ 1 2 - 134702 + 134701 @@ -17751,23 +17750,23 @@ params - 6354509 + 6355287 id - 6190639 + 6191397 function - 3491688 + 3492116 index - 7936 + 7937 type_id - 1846453 + 1846680 @@ -17781,7 +17780,7 @@ 1 2 - 6190639 + 6191397 @@ -17797,7 +17796,7 @@ 1 2 - 6190639 + 6191397 @@ -17813,12 +17812,12 @@ 1 2 - 6066919 + 6067663 2 4 - 123719 + 123734 @@ -17834,22 +17833,22 @@ 1 2 - 1867462 + 1867691 2 3 - 952872 + 952989 3 4 - 429983 + 430035 4 18 - 241369 + 241399 @@ -17865,22 +17864,22 @@ 1 2 - 1867462 + 1867691 2 3 - 952872 + 952989 3 4 - 429983 + 430035 4 18 - 241369 + 241399 @@ -17896,22 +17895,22 @@ 1 2 - 2165790 + 2166055 2 3 - 826819 + 826920 3 4 - 346414 + 346456 4 12 - 152665 + 152683 @@ -18165,22 +18164,22 @@ 1 2 - 1183971 + 1184116 2 3 - 406173 + 406222 3 7 - 154065 + 154084 7 518 - 102243 + 102256 @@ -18196,22 +18195,22 @@ 1 2 - 1404798 + 1404971 2 3 - 212423 + 212449 3 7 - 147529 + 147547 7 502 - 81701 + 81711 @@ -18227,17 +18226,17 @@ 1 2 - 1420205 + 1420379 2 3 - 347348 + 347390 3 13 - 78900 + 78909 @@ -18330,19 +18329,19 @@ membervariables - 1056495 + 1056490 id - 1054697 + 1054692 type_id - 327727 + 327726 name - 451619 + 451617 @@ -18356,7 +18355,7 @@ 1 2 - 1052979 + 1052974 2 @@ -18377,7 +18376,7 @@ 1 2 - 1054697 + 1054692 @@ -18393,7 +18392,7 @@ 1 2 - 243029 + 243027 2 @@ -18424,7 +18423,7 @@ 1 2 - 255254 + 255253 2 @@ -18455,7 +18454,7 @@ 1 2 - 295326 + 295325 2 @@ -18486,12 +18485,12 @@ 1 2 - 367839 + 367837 2 3 - 51738 + 51737 3 @@ -18506,7 +18505,7 @@ globalvariables - 301284 + 301286 id @@ -18532,12 +18531,12 @@ 1 2 - 301268 + 301266 2 3 - 8 + 10 @@ -18574,12 +18573,12 @@ 2 3 - 160 + 159 3 7 - 116 + 117 7 @@ -18868,11 +18867,11 @@ autoderivation - 147961 + 147960 var - 147961 + 147960 derivation_type @@ -18890,7 +18889,7 @@ 1 2 - 147961 + 147960 @@ -18989,11 +18988,11 @@ enumconstants - 241670 + 241669 id - 241670 + 241669 parent @@ -19009,11 +19008,11 @@ name - 241391 + 241389 location - 221574 + 221573 @@ -19027,7 +19026,7 @@ 1 2 - 241670 + 241669 @@ -19043,7 +19042,7 @@ 1 2 - 241670 + 241669 @@ -19059,7 +19058,7 @@ 1 2 - 241670 + 241669 @@ -19075,7 +19074,7 @@ 1 2 - 241670 + 241669 @@ -19091,7 +19090,7 @@ 1 2 - 241670 + 241669 @@ -19331,7 +19330,7 @@ 3 4 - 5833 + 5832 4 @@ -19702,7 +19701,7 @@ 1 2 - 241111 + 241110 2 @@ -19723,7 +19722,7 @@ 1 2 - 241111 + 241110 2 @@ -19744,7 +19743,7 @@ 1 2 - 241391 + 241389 @@ -19760,7 +19759,7 @@ 1 2 - 241391 + 241389 @@ -19776,7 +19775,7 @@ 1 2 - 241111 + 241110 2 @@ -19797,7 +19796,7 @@ 1 2 - 220815 + 220814 2 @@ -19818,7 +19817,7 @@ 1 2 - 221574 + 221573 @@ -19834,7 +19833,7 @@ 1 2 - 220815 + 220814 2 @@ -19855,7 +19854,7 @@ 1 2 - 221574 + 221573 @@ -19871,7 +19870,7 @@ 1 2 - 220815 + 220814 2 @@ -19886,19 +19885,19 @@ builtintypes - 26144 + 26147 id - 26144 + 26147 name - 26144 + 26147 kind - 26144 + 26147 size @@ -19924,7 +19923,7 @@ 1 2 - 26144 + 26147 @@ -19940,7 +19939,7 @@ 1 2 - 26144 + 26147 @@ -19956,7 +19955,7 @@ 1 2 - 26144 + 26147 @@ -19972,7 +19971,7 @@ 1 2 - 26144 + 26147 @@ -19988,7 +19987,7 @@ 1 2 - 26144 + 26147 @@ -20004,7 +20003,7 @@ 1 2 - 26144 + 26147 @@ -20020,7 +20019,7 @@ 1 2 - 26144 + 26147 @@ -20036,7 +20035,7 @@ 1 2 - 26144 + 26147 @@ -20052,7 +20051,7 @@ 1 2 - 26144 + 26147 @@ -20068,7 +20067,7 @@ 1 2 - 26144 + 26147 @@ -20084,7 +20083,7 @@ 1 2 - 26144 + 26147 @@ -20100,7 +20099,7 @@ 1 2 - 26144 + 26147 @@ -20116,7 +20115,7 @@ 1 2 - 26144 + 26147 @@ -20132,7 +20131,7 @@ 1 2 - 26144 + 26147 @@ -20148,7 +20147,7 @@ 1 2 - 26144 + 26147 @@ -20593,15 +20592,15 @@ derivedtypes - 3669564 + 3670014 id - 3669564 + 3670014 name - 1552795 + 1552985 kind @@ -20609,7 +20608,7 @@ type_id - 2362807 + 2363096 @@ -20623,7 +20622,7 @@ 1 2 - 3669564 + 3670014 @@ -20639,7 +20638,7 @@ 1 2 - 3669564 + 3670014 @@ -20655,7 +20654,7 @@ 1 2 - 3669564 + 3670014 @@ -20671,17 +20670,17 @@ 1 2 - 1324031 + 1324193 2 4 - 120451 + 120466 4 1153 - 108312 + 108326 @@ -20697,7 +20696,7 @@ 1 2 - 1551861 + 1552051 2 @@ -20718,17 +20717,17 @@ 1 2 - 1324031 + 1324193 2 4 - 120451 + 120466 4 1135 - 108312 + 108326 @@ -20867,22 +20866,22 @@ 1 2 - 1515446 + 1515631 2 3 - 546232 + 546299 3 4 - 218493 + 218519 4 72 - 82635 + 82645 @@ -20898,22 +20897,22 @@ 1 2 - 1526650 + 1526837 2 3 - 538763 + 538829 3 4 - 215691 + 215718 4 72 - 81701 + 81711 @@ -20929,22 +20928,22 @@ 1 2 - 1519647 + 1519834 2 3 - 549967 + 550035 3 4 - 217559 + 217586 4 6 - 75632 + 75641 @@ -20954,11 +20953,11 @@ pointerishsize - 2707354 + 2707685 id - 2707354 + 2707685 size @@ -20980,7 +20979,7 @@ 1 2 - 2707354 + 2707685 @@ -20996,7 +20995,7 @@ 1 2 - 2707354 + 2707685 @@ -21070,19 +21069,19 @@ arraysizes - 88237 + 88248 id - 88237 + 88248 num_elements - 31746 + 31750 bytesize - 33147 + 33151 alignment @@ -21100,7 +21099,7 @@ 1 2 - 88237 + 88248 @@ -21116,7 +21115,7 @@ 1 2 - 88237 + 88248 @@ -21132,7 +21131,7 @@ 1 2 - 88237 + 88248 @@ -21153,7 +21152,7 @@ 2 3 - 23810 + 23813 3 @@ -21184,7 +21183,7 @@ 1 2 - 26611 + 26614 2 @@ -21210,7 +21209,7 @@ 1 2 - 26611 + 26614 2 @@ -21241,7 +21240,7 @@ 2 3 - 23810 + 23813 3 @@ -21272,12 +21271,12 @@ 1 2 - 27545 + 27548 2 3 - 3734 + 3735 3 @@ -21298,12 +21297,12 @@ 1 2 - 27545 + 27548 2 3 - 4668 + 4669 4 @@ -21406,15 +21405,15 @@ typedefbase - 1686117 + 1686099 id - 1686117 + 1686099 type_id - 793489 + 793481 @@ -21428,7 +21427,7 @@ 1 2 - 1686117 + 1686099 @@ -21444,12 +21443,12 @@ 1 2 - 617406 + 617400 2 3 - 83254 + 83253 3 @@ -21755,19 +21754,19 @@ usertypes - 5234965 + 5235606 id - 5234965 + 5235606 name - 1352509 + 1352675 kind - 5135 + 5136 @@ -21781,7 +21780,7 @@ 1 2 - 5234965 + 5235606 @@ -21797,7 +21796,7 @@ 1 2 - 5234965 + 5235606 @@ -21813,27 +21812,27 @@ 1 2 - 983686 + 983806 2 3 - 153598 + 153617 3 7 - 104577 + 104590 7 61 - 101776 + 101789 65 874 - 8870 + 8871 @@ -21849,17 +21848,17 @@ 1 2 - 1211983 + 1212131 2 3 - 125120 + 125135 3 7 - 15406 + 15408 @@ -22001,15 +22000,15 @@ usertypesize - 1707327 + 1707537 id - 1707327 + 1707537 size - 13539 + 13540 alignment @@ -22027,7 +22026,7 @@ 1 2 - 1707327 + 1707537 @@ -22043,7 +22042,7 @@ 1 2 - 1707327 + 1707537 @@ -22064,7 +22063,7 @@ 2 3 - 4201 + 4202 3 @@ -22115,7 +22114,7 @@ 1 2 - 10271 + 10272 2 @@ -22218,11 +22217,11 @@ usertype_uuid - 36652 + 36651 id - 36652 + 36651 uuid @@ -22240,7 +22239,7 @@ 1 2 - 36652 + 36651 @@ -22271,15 +22270,15 @@ mangled_name - 9020312 + 9021417 id - 9020312 + 9021417 mangled_name - 6061784 + 6062526 is_complete @@ -22297,7 +22296,7 @@ 1 2 - 9020312 + 9021417 @@ -22313,7 +22312,7 @@ 1 2 - 9020312 + 9021417 @@ -22329,12 +22328,12 @@ 1 2 - 5789134 + 5789844 2 874 - 272649 + 272682 @@ -22350,7 +22349,7 @@ 1 2 - 6061784 + 6062526 @@ -22392,59 +22391,59 @@ is_pod_class - 534705 + 534710 id - 534705 + 534710 is_standard_layout_class - 1254935 + 1255088 id - 1254935 + 1255088 is_complete - 1646635 + 1646837 id - 1646635 + 1646837 is_class_template - 398236 + 398285 id - 398236 + 398285 class_instantiation - 1089664 + 1089798 to - 1089664 + 1089798 from - 168538 + 168559 @@ -22458,7 +22457,7 @@ 1 2 - 1089664 + 1089798 @@ -22474,42 +22473,42 @@ 1 2 - 59758 + 59766 2 3 - 29412 + 29416 3 4 - 15873 + 15875 4 5 - 13072 + 13073 5 6 - 9804 + 9805 6 10 - 12605 + 12606 10 16 - 13072 + 13073 16 70 - 13539 + 13540 70 @@ -22524,11 +22523,11 @@ class_template_argument - 2882763 + 2882732 type_id - 1315517 + 1315503 index @@ -22536,7 +22535,7 @@ arg_type - 840394 + 840385 @@ -22550,22 +22549,22 @@ 1 2 - 540959 + 540953 2 3 - 399239 + 399235 3 4 - 231397 + 231395 4 7 - 120315 + 120314 7 @@ -22586,22 +22585,22 @@ 1 2 - 567611 + 567605 2 3 - 410483 + 410478 3 4 - 244842 + 244840 4 113 - 92579 + 92578 @@ -22709,17 +22708,17 @@ 1 2 - 523348 + 523343 2 3 - 174344 + 174342 3 4 - 51341 + 51340 4 @@ -22745,12 +22744,12 @@ 1 2 - 746494 + 746486 2 3 - 77836 + 77835 3 @@ -22765,11 +22764,11 @@ class_template_argument_value - 495344 + 495405 type_id - 304863 + 304900 index @@ -22777,7 +22776,7 @@ arg_value - 495344 + 495405 @@ -22791,12 +22790,12 @@ 1 2 - 249773 + 249803 2 3 - 53222 + 53229 3 @@ -22817,22 +22816,22 @@ 1 2 - 189547 + 189570 2 3 - 81234 + 81244 3 4 - 12138 + 12139 4 9 - 21942 + 21945 @@ -22910,7 +22909,7 @@ 1 2 - 495344 + 495405 @@ -22926,7 +22925,7 @@ 1 2 - 495344 + 495405 @@ -22936,15 +22935,15 @@ is_proxy_class_for - 63026 + 63034 id - 63026 + 63034 templ_param_id - 63026 + 63034 @@ -22958,7 +22957,7 @@ 1 2 - 63026 + 63034 @@ -22974,7 +22973,7 @@ 1 2 - 63026 + 63034 @@ -22984,19 +22983,19 @@ type_mentions - 4029136 + 4029118 id - 4029136 + 4029118 type_id - 198202 + 198201 location - 3995616 + 3995598 kind @@ -23014,7 +23013,7 @@ 1 2 - 4029136 + 4029118 @@ -23030,7 +23029,7 @@ 1 2 - 4029136 + 4029118 @@ -23046,7 +23045,7 @@ 1 2 - 4029136 + 4029118 @@ -23062,7 +23061,7 @@ 1 2 - 97603 + 97602 2 @@ -23087,7 +23086,7 @@ 7 12 - 15861 + 15860 12 @@ -23113,7 +23112,7 @@ 1 2 - 97603 + 97602 2 @@ -23138,7 +23137,7 @@ 7 12 - 15861 + 15860 12 @@ -23164,7 +23163,7 @@ 1 2 - 198202 + 198201 @@ -23180,7 +23179,7 @@ 1 2 - 3962096 + 3962078 2 @@ -23201,7 +23200,7 @@ 1 2 - 3962096 + 3962078 2 @@ -23222,7 +23221,7 @@ 1 2 - 3995616 + 3995598 @@ -23280,26 +23279,26 @@ is_function_template - 1402931 + 1403103 id - 1402931 + 1403103 function_instantiation - 894823 + 894819 to - 894823 + 894819 from - 144434 + 144433 @@ -23313,7 +23312,7 @@ 1 2 - 894823 + 894819 @@ -23359,11 +23358,11 @@ function_template_argument - 2313492 + 2313481 function_id - 1321577 + 1321571 index @@ -23371,7 +23370,7 @@ arg_type - 301235 + 301234 @@ -23385,22 +23384,22 @@ 1 2 - 674410 + 674407 2 3 - 390488 + 390486 3 4 - 186796 + 186795 4 15 - 69883 + 69882 @@ -23416,22 +23415,22 @@ 1 2 - 691828 + 691825 2 3 - 400277 + 400275 3 4 - 166869 + 166868 4 9 - 62602 + 62601 @@ -23569,7 +23568,7 @@ 1 2 - 184531 + 184530 2 @@ -23610,7 +23609,7 @@ 1 2 - 271728 + 271727 2 @@ -23630,11 +23629,11 @@ function_template_argument_value - 358995 + 358993 function_id - 192753 + 192752 index @@ -23642,7 +23641,7 @@ arg_value - 356382 + 356381 @@ -23656,7 +23655,7 @@ 1 2 - 183486 + 183485 2 @@ -23677,7 +23676,7 @@ 1 2 - 176136 + 176135 2 @@ -23815,7 +23814,7 @@ 1 2 - 353770 + 353768 2 @@ -23836,7 +23835,7 @@ 1 2 - 356382 + 356381 @@ -23857,11 +23856,11 @@ variable_instantiation - 204308 + 204307 to - 204308 + 204307 from @@ -23879,7 +23878,7 @@ 1 2 - 204308 + 204307 @@ -23940,11 +23939,11 @@ variable_template_argument - 383990 + 383988 variable_id - 195640 + 195639 index @@ -23952,7 +23951,7 @@ arg_type - 187562 + 187561 @@ -23981,7 +23980,7 @@ 4 17 - 10442 + 10441 @@ -24145,7 +24144,7 @@ 1 2 - 145597 + 145596 2 @@ -24176,7 +24175,7 @@ 1 2 - 170224 + 170223 2 @@ -24357,15 +24356,15 @@ routinetypes - 538824 + 538891 id - 538824 + 538891 return_type - 280751 + 280750 @@ -24379,7 +24378,7 @@ 1 2 - 538824 + 538891 @@ -24395,12 +24394,12 @@ 1 2 - 244521 + 244450 2 3 - 20971 + 21041 3 @@ -24415,19 +24414,19 @@ routinetypeargs - 983219 + 983339 routine - 423447 + 423499 index - 7936 + 7937 type_id - 226896 + 226924 @@ -24441,27 +24440,27 @@ 1 2 - 152665 + 152683 2 3 - 133990 + 134006 3 4 - 63493 + 63501 4 5 - 45752 + 45758 5 18 - 27545 + 27548 @@ -24477,27 +24476,27 @@ 1 2 - 182544 + 182566 2 3 - 133523 + 133539 3 4 - 58825 + 58832 4 5 - 33614 + 33618 5 11 - 14939 + 14941 @@ -24655,27 +24654,27 @@ 1 2 - 146595 + 146613 2 3 - 30813 + 30816 3 5 - 16807 + 16809 5 12 - 18207 + 18209 12 110 - 14472 + 14474 @@ -24691,22 +24690,22 @@ 1 2 - 172740 + 172761 2 3 - 30813 + 30816 3 6 - 18674 + 18676 6 14 - 4668 + 4669 @@ -24716,19 +24715,19 @@ ptrtomembers - 37816 + 37820 id - 37816 + 37820 type_id - 37816 + 37820 class_id - 15406 + 15408 @@ -24742,7 +24741,7 @@ 1 2 - 37816 + 37820 @@ -24758,7 +24757,7 @@ 1 2 - 37816 + 37820 @@ -24774,7 +24773,7 @@ 1 2 - 37816 + 37820 @@ -24790,7 +24789,7 @@ 1 2 - 37816 + 37820 @@ -24806,7 +24805,7 @@ 1 2 - 13539 + 13540 8 @@ -24832,7 +24831,7 @@ 1 2 - 13539 + 13540 8 @@ -24852,15 +24851,15 @@ specifiers - 24743 + 24746 id - 24743 + 24746 str - 24743 + 24746 @@ -24874,7 +24873,7 @@ 1 2 - 24743 + 24746 @@ -24890,7 +24889,7 @@ 1 2 - 24743 + 24746 @@ -24900,15 +24899,15 @@ typespecifiers - 1133083 + 1133221 type_id - 1114875 + 1115011 spec_id - 3734 + 3735 @@ -24922,12 +24921,12 @@ 1 2 - 1096667 + 1096801 2 3 - 18207 + 18209 @@ -24988,15 +24987,15 @@ funspecifiers - 10304659 + 10305922 func_id - 4068267 + 4068766 spec_id - 8403 + 8404 @@ -25010,27 +25009,27 @@ 1 2 - 1357645 + 1357811 2 3 - 641006 + 641085 3 4 - 985086 + 985207 4 5 - 780132 + 780228 5 8 - 304396 + 304433 @@ -25141,15 +25140,15 @@ varspecifiers - 2246090 + 2246366 var_id - 1225055 + 1225205 spec_id - 3734 + 3735 @@ -25163,22 +25162,22 @@ 1 2 - 730177 + 730267 2 3 - 202619 + 202644 3 4 - 58358 + 58365 4 5 - 233899 + 233928 @@ -25287,11 +25286,11 @@ attributes - 561639 + 561708 id - 561639 + 561708 kind @@ -25299,7 +25298,7 @@ name - 11204 + 11206 name_space @@ -25307,7 +25306,7 @@ location - 481338 + 481397 @@ -25321,7 +25320,7 @@ 1 2 - 561639 + 561708 @@ -25337,7 +25336,7 @@ 1 2 - 561639 + 561708 @@ -25353,7 +25352,7 @@ 1 2 - 561639 + 561708 @@ -25369,7 +25368,7 @@ 1 2 - 561639 + 561708 @@ -25560,7 +25559,7 @@ 1 2 - 10271 + 10272 2 @@ -25581,7 +25580,7 @@ 1 2 - 11204 + 11206 @@ -25752,17 +25751,17 @@ 1 2 - 431850 + 431903 2 3 - 20075 + 20077 3 7 - 29412 + 29416 @@ -25778,7 +25777,7 @@ 1 2 - 481338 + 481397 @@ -25794,17 +25793,17 @@ 1 2 - 433251 + 433304 2 3 - 19608 + 19610 3 4 - 28478 + 28482 @@ -25820,7 +25819,7 @@ 1 2 - 481338 + 481397 @@ -25830,11 +25829,11 @@ attribute_args - 344080 + 344122 id - 344080 + 344122 kind @@ -25842,7 +25841,7 @@ attribute - 262845 + 262877 index @@ -25850,7 +25849,7 @@ location - 327739 + 327779 @@ -25864,7 +25863,7 @@ 1 2 - 344080 + 344122 @@ -25880,7 +25879,7 @@ 1 2 - 344080 + 344122 @@ -25896,7 +25895,7 @@ 1 2 - 344080 + 344122 @@ -25912,7 +25911,7 @@ 1 2 - 344080 + 344122 @@ -26027,17 +26026,17 @@ 1 2 - 197484 + 197508 2 3 - 49487 + 49493 3 4 - 15873 + 15875 @@ -26053,12 +26052,12 @@ 1 2 - 252574 + 252605 2 3 - 10271 + 10272 @@ -26074,17 +26073,17 @@ 1 2 - 197484 + 197508 2 3 - 49487 + 49493 3 4 - 15873 + 15875 @@ -26100,17 +26099,17 @@ 1 2 - 197484 + 197508 2 3 - 49487 + 49493 3 4 - 15873 + 15875 @@ -26225,12 +26224,12 @@ 1 2 - 313733 + 313772 2 7 - 14005 + 14007 @@ -26246,12 +26245,12 @@ 1 2 - 315134 + 315172 2 3 - 12605 + 12606 @@ -26267,12 +26266,12 @@ 1 2 - 313733 + 313772 2 7 - 14005 + 14007 @@ -26288,7 +26287,7 @@ 1 2 - 327739 + 327779 @@ -26298,15 +26297,15 @@ attribute_arg_value - 25210 + 25213 arg - 25210 + 25213 value - 15873 + 15875 @@ -26320,7 +26319,7 @@ 1 2 - 25210 + 25213 @@ -26336,7 +26335,7 @@ 1 2 - 14472 + 14474 2 @@ -26399,15 +26398,15 @@ attribute_arg_constant - 318402 + 318441 arg - 318402 + 318441 constant - 318402 + 318441 @@ -26421,7 +26420,7 @@ 1 2 - 318402 + 318441 @@ -26437,7 +26436,7 @@ 1 2 - 318402 + 318441 @@ -26548,15 +26547,15 @@ typeattributes - 60997 + 61863 type_id - 37617 + 61469 spec_id - 60572 + 19701 @@ -26570,17 +26569,12 @@ 1 2 - 14636 + 61075 2 3 - 22580 - - - 3 - 4 - 400 + 394 @@ -26596,12 +26590,22 @@ 1 2 - 60477 + 16254 2 - 26 - 95 + 5 + 1576 + + + 5 + 23 + 1379 + + + 57 + 58 + 492 @@ -26611,15 +26615,15 @@ funcattributes - 630268 + 630345 func_id - 443522 + 443576 spec_id - 524757 + 524821 @@ -26633,17 +26637,17 @@ 1 2 - 338477 + 338519 2 3 - 64427 + 64435 3 6 - 39683 + 39688 6 @@ -26664,12 +26668,12 @@ 1 2 - 506082 + 506144 2 17 - 18674 + 18676 @@ -26805,15 +26809,15 @@ unspecifiedtype - 9489045 + 9490208 type_id - 9489045 + 9490208 unspecified_type_id - 6491300 + 6492096 @@ -26827,7 +26831,7 @@ 1 2 - 9489045 + 9490208 @@ -26843,17 +26847,17 @@ 1 2 - 4559877 + 4560436 2 3 - 1715731 + 1715941 3 145 - 215691 + 215718 @@ -26863,19 +26867,19 @@ member - 3881054 + 3881530 parent - 545766 + 545832 index - 92906 + 92917 child - 3809624 + 3810090 @@ -26889,47 +26893,47 @@ 1 2 - 129788 + 129804 2 3 - 64894 + 64902 3 4 - 73297 + 73306 4 5 - 75165 + 75174 5 6 - 40617 + 40622 6 8 - 46686 + 46692 8 14 - 45752 + 45758 14 30 - 41551 + 41556 30 200 - 28011 + 28015 @@ -26945,52 +26949,52 @@ 1 2 - 129788 + 129804 2 3 - 64894 + 64902 3 4 - 73297 + 73306 4 5 - 76099 + 76108 5 6 - 39683 + 39688 6 7 - 24277 + 24279 7 9 - 42017 + 42023 9 17 - 43885 + 43890 17 41 - 41551 + 41556 41 200 - 10271 + 10272 @@ -27006,57 +27010,57 @@ 1 2 - 26144 + 26147 2 3 - 7002 + 7003 3 4 - 3734 + 3735 4 5 - 7936 + 7937 5 6 - 5602 + 5603 6 7 - 5602 + 5603 7 9 - 7469 + 7470 9 16 - 7002 + 7003 16 52 - 7002 + 7003 52 107 - 7002 + 7003 108 577 - 7002 + 7003 737 @@ -27077,57 +27081,57 @@ 1 2 - 26144 + 26147 2 3 - 7002 + 7003 3 4 - 3734 + 3735 4 5 - 7936 + 7937 5 6 - 5602 + 5603 6 7 - 5602 + 5603 7 9 - 7469 + 7470 9 16 - 7002 + 7003 16 52 - 7002 + 7003 52 107 - 7002 + 7003 108 577 - 7002 + 7003 738 @@ -27148,7 +27152,7 @@ 1 2 - 3809624 + 3810090 @@ -27164,12 +27168,12 @@ 1 2 - 3738193 + 3738651 2 3 - 71430 + 71439 @@ -27179,15 +27183,15 @@ enclosingfunction - 118329 + 118327 child - 118329 + 118327 parent - 67665 + 67664 @@ -27201,7 +27205,7 @@ 1 2 - 118329 + 118327 @@ -27232,7 +27236,7 @@ 4 45 - 4888 + 4887 @@ -27242,15 +27246,15 @@ derivations - 391568 + 391566 derivation - 391568 + 391566 sub - 371293 + 371291 index @@ -27258,7 +27262,7 @@ super - 202751 + 202750 location @@ -27276,7 +27280,7 @@ 1 2 - 391568 + 391566 @@ -27292,7 +27296,7 @@ 1 2 - 391568 + 391566 @@ -27308,7 +27312,7 @@ 1 2 - 391568 + 391566 @@ -27324,7 +27328,7 @@ 1 2 - 391568 + 391566 @@ -27340,7 +27344,7 @@ 1 2 - 356313 + 356311 2 @@ -27361,7 +27365,7 @@ 1 2 - 356313 + 356311 2 @@ -27382,7 +27386,7 @@ 1 2 - 356313 + 356311 2 @@ -27403,7 +27407,7 @@ 1 2 - 356313 + 356311 2 @@ -27553,7 +27557,7 @@ 1 2 - 195366 + 195365 2 @@ -27574,7 +27578,7 @@ 1 2 - 195366 + 195365 2 @@ -27595,7 +27599,7 @@ 1 2 - 202298 + 202297 2 @@ -27616,7 +27620,7 @@ 1 2 - 199093 + 199092 2 @@ -27642,7 +27646,7 @@ 2 5 - 3205 + 3204 5 @@ -27678,7 +27682,7 @@ 2 5 - 3205 + 3204 5 @@ -27750,11 +27754,11 @@ derspecifiers - 393449 + 393447 der_id - 391184 + 391183 spec_id @@ -27772,7 +27776,7 @@ 1 2 - 388920 + 388918 2 @@ -27818,11 +27822,11 @@ direct_base_offsets - 362618 + 362617 der_id - 362618 + 362617 offset @@ -27840,7 +27844,7 @@ 1 2 - 362618 + 362617 @@ -28182,11 +28186,11 @@ frienddecls - 707052 + 707049 id - 707052 + 707049 type_id @@ -28212,7 +28216,7 @@ 1 2 - 707052 + 707049 @@ -28228,7 +28232,7 @@ 1 2 - 707052 + 707049 @@ -28244,7 +28248,7 @@ 1 2 - 707052 + 707049 @@ -28295,7 +28299,7 @@ 37 55 - 3205 + 3204 55 @@ -28351,7 +28355,7 @@ 37 55 - 3205 + 3204 55 @@ -28563,19 +28567,19 @@ comments - 8266137 + 8266100 id - 8266137 + 8266100 contents - 3147578 + 3147564 location - 8266137 + 8266100 @@ -28589,7 +28593,7 @@ 1 2 - 8266137 + 8266100 @@ -28605,7 +28609,7 @@ 1 2 - 8266137 + 8266100 @@ -28621,12 +28625,12 @@ 1 2 - 2879337 + 2879324 2 7 - 236620 + 236618 7 @@ -28647,12 +28651,12 @@ 1 2 - 2879337 + 2879324 2 7 - 236620 + 236618 7 @@ -28673,7 +28677,7 @@ 1 2 - 8266137 + 8266100 @@ -28689,7 +28693,7 @@ 1 2 - 8266137 + 8266100 @@ -28699,15 +28703,15 @@ commentbinding - 3091117 + 3091496 id - 2445442 + 2445742 element - 3014551 + 3014921 @@ -28721,12 +28725,12 @@ 1 2 - 2368409 + 2368699 2 97 - 77032 + 77042 @@ -28742,12 +28746,12 @@ 1 2 - 2937985 + 2938345 2 3 - 76565 + 76575 @@ -28757,15 +28761,15 @@ exprconv - 7033022 + 7032992 converted - 7033022 + 7032992 conversion - 7033022 + 7032992 @@ -28779,7 +28783,7 @@ 1 2 - 7033022 + 7032992 @@ -28795,7 +28799,7 @@ 1 2 - 7033022 + 7032992 @@ -28805,22 +28809,22 @@ compgenerated - 7908075 + 7908039 id - 7908075 + 7908039 synthetic_destructor_call - 512503 + 512501 element - 325805 + 325803 i @@ -28828,7 +28832,7 @@ destructor_call - 512503 + 512501 @@ -28842,7 +28846,7 @@ 1 2 - 227848 + 227847 2 @@ -28857,7 +28861,7 @@ 4 8 - 24622 + 24621 8 @@ -28878,7 +28882,7 @@ 1 2 - 227848 + 227847 2 @@ -28893,7 +28897,7 @@ 4 8 - 24622 + 24621 8 @@ -29126,7 +29130,7 @@ 1 2 - 512503 + 512501 @@ -29142,7 +29146,7 @@ 1 2 - 512503 + 512501 @@ -29152,15 +29156,15 @@ namespaces - 12138 + 12139 id - 12138 + 12139 name - 9804 + 9805 @@ -29174,7 +29178,7 @@ 1 2 - 12138 + 12139 @@ -29190,7 +29194,7 @@ 1 2 - 8403 + 8404 2 @@ -29221,15 +29225,15 @@ namespacembrs - 2388018 + 2388310 parentid - 10271 + 10272 memberid - 2388018 + 2388310 @@ -29304,7 +29308,7 @@ 1 2 - 2388018 + 2388310 @@ -29314,11 +29318,11 @@ exprparents - 14206517 + 14206453 expr_id - 14206517 + 14206453 child_index @@ -29326,7 +29330,7 @@ parent_id - 9453690 + 9453648 @@ -29340,7 +29344,7 @@ 1 2 - 14206517 + 14206453 @@ -29356,7 +29360,7 @@ 1 2 - 14206517 + 14206453 @@ -29474,17 +29478,17 @@ 1 2 - 5409361 + 5409337 2 3 - 3706591 + 3706574 3 712 - 337737 + 337736 @@ -29500,17 +29504,17 @@ 1 2 - 5409361 + 5409337 2 3 - 3706591 + 3706574 3 712 - 337737 + 337736 @@ -29520,11 +29524,11 @@ expr_isload - 5096886 + 5096863 expr_id - 5096886 + 5096863 @@ -29604,11 +29608,11 @@ iscall - 3218003 + 3217989 caller - 3218003 + 3217989 kind @@ -29626,7 +29630,7 @@ 1 2 - 3218003 + 3217989 @@ -29662,11 +29666,11 @@ numtemplatearguments - 393832 + 393830 expr_id - 393832 + 393830 num @@ -29684,7 +29688,7 @@ 1 2 - 393832 + 393830 @@ -29788,23 +29792,23 @@ namequalifiers - 1513800 + 1513793 id - 1513800 + 1513793 qualifiableelement - 1513800 + 1513793 qualifyingelement - 97519 + 97518 location - 304298 + 304297 @@ -29818,7 +29822,7 @@ 1 2 - 1513800 + 1513793 @@ -29834,7 +29838,7 @@ 1 2 - 1513800 + 1513793 @@ -29850,7 +29854,7 @@ 1 2 - 1513800 + 1513793 @@ -29866,7 +29870,7 @@ 1 2 - 1513800 + 1513793 @@ -29882,7 +29886,7 @@ 1 2 - 1513800 + 1513793 @@ -29898,7 +29902,7 @@ 1 2 - 1513800 + 1513793 @@ -30017,7 +30021,7 @@ 1 2 - 100559 + 100558 2 @@ -30058,7 +30062,7 @@ 1 2 - 100559 + 100558 2 @@ -30099,7 +30103,7 @@ 1 2 - 137074 + 137073 2 @@ -30124,15 +30128,15 @@ varbind - 6029127 + 6029100 expr - 6029127 + 6029100 var - 768530 + 768527 @@ -30146,7 +30150,7 @@ 1 2 - 6029127 + 6029100 @@ -30167,12 +30171,12 @@ 2 3 - 137874 + 137873 3 4 - 106293 + 106292 4 @@ -30202,7 +30206,7 @@ 13 28 - 58880 + 58879 28 @@ -30217,15 +30221,15 @@ funbind - 3224501 + 3224486 expr - 3218288 + 3218274 fun - 511344 + 511323 @@ -30239,7 +30243,7 @@ 1 2 - 3212076 + 3212061 2 @@ -30260,12 +30264,12 @@ 1 2 - 315090 + 315050 2 3 - 77893 + 77912 3 @@ -30421,11 +30425,11 @@ expr_deallocator - 54694 + 54693 expr - 54694 + 54693 func @@ -30447,7 +30451,7 @@ 1 2 - 54694 + 54693 @@ -30463,7 +30467,7 @@ 1 2 - 54694 + 54693 @@ -30568,15 +30572,15 @@ expr_cond_guard - 657237 + 657235 cond - 657237 + 657235 guard - 657237 + 657235 @@ -30590,7 +30594,7 @@ 1 2 - 657237 + 657235 @@ -30606,7 +30610,7 @@ 1 2 - 657237 + 657235 @@ -30616,15 +30620,15 @@ expr_cond_true - 657235 + 657232 cond - 657235 + 657232 true - 657235 + 657232 @@ -30638,7 +30642,7 @@ 1 2 - 657235 + 657232 @@ -30654,7 +30658,7 @@ 1 2 - 657235 + 657232 @@ -30664,15 +30668,15 @@ expr_cond_false - 657237 + 657235 cond - 657237 + 657235 false - 657237 + 657235 @@ -30686,7 +30690,7 @@ 1 2 - 657237 + 657235 @@ -30702,7 +30706,7 @@ 1 2 - 657237 + 657235 @@ -30712,11 +30716,11 @@ values - 10776699 + 10776651 id - 10776699 + 10776651 str @@ -30734,7 +30738,7 @@ 1 2 - 10776699 + 10776651 @@ -30750,7 +30754,7 @@ 1 2 - 59545 + 59544 2 @@ -30780,11 +30784,11 @@ valuetext - 4757348 + 4757344 id - 4757348 + 4757344 text @@ -30802,7 +30806,7 @@ 1 2 - 4757348 + 4757344 @@ -30843,15 +30847,15 @@ valuebind - 11210920 + 11210870 val - 10776699 + 10776651 expr - 11210920 + 11210870 @@ -30865,12 +30869,12 @@ 1 2 - 10365022 + 10364976 2 7 - 411677 + 411675 @@ -30886,7 +30890,7 @@ 1 2 - 11210920 + 11210870 @@ -30896,11 +30900,11 @@ fieldoffsets - 1054697 + 1054692 id - 1054697 + 1054692 byteoffset @@ -30922,7 +30926,7 @@ 1 2 - 1054697 + 1054692 @@ -30938,7 +30942,7 @@ 1 2 - 1054697 + 1054692 @@ -31283,23 +31287,23 @@ initialisers - 1710781 + 1710773 init - 1710781 + 1710773 var - 719764 + 719761 expr - 1710781 + 1710773 location - 394651 + 394649 @@ -31313,7 +31317,7 @@ 1 2 - 1710781 + 1710773 @@ -31329,7 +31333,7 @@ 1 2 - 1710781 + 1710773 @@ -31345,7 +31349,7 @@ 1 2 - 1710781 + 1710773 @@ -31361,7 +31365,7 @@ 1 2 - 633988 + 633986 2 @@ -31387,7 +31391,7 @@ 1 2 - 633988 + 633986 2 @@ -31413,7 +31417,7 @@ 1 2 - 719758 + 719754 2 @@ -31434,7 +31438,7 @@ 1 2 - 1710781 + 1710773 @@ -31450,7 +31454,7 @@ 1 2 - 1710781 + 1710773 @@ -31466,7 +31470,7 @@ 1 2 - 1710781 + 1710773 @@ -31482,7 +31486,7 @@ 1 2 - 321715 + 321714 2 @@ -31513,7 +31517,7 @@ 1 2 - 344607 + 344605 2 @@ -31539,7 +31543,7 @@ 1 2 - 321715 + 321714 2 @@ -31575,15 +31579,15 @@ expr_ancestor - 516626 + 516623 exp - 516626 + 516623 ancestor - 308516 + 308515 @@ -31597,7 +31601,7 @@ 1 2 - 516626 + 516623 @@ -31613,7 +31617,7 @@ 1 2 - 203568 + 203567 2 @@ -31628,7 +31632,7 @@ 4 7 - 25154 + 25153 7 @@ -31643,11 +31647,11 @@ exprs - 18387506 + 18387424 id - 18387506 + 18387424 kind @@ -31655,7 +31659,7 @@ location - 8488094 + 8488154 @@ -31669,7 +31673,7 @@ 1 2 - 18387506 + 18387424 @@ -31685,7 +31689,7 @@ 1 2 - 18387506 + 18387424 @@ -31863,22 +31867,22 @@ 1 2 - 7145154 + 7145204 2 3 - 663031 + 663036 3 18 - 638103 + 638107 18 71656 - 41805 + 41806 @@ -31894,17 +31898,17 @@ 1 2 - 7251222 + 7251273 2 3 - 618242 + 618246 3 32 - 618630 + 618634 @@ -31914,15 +31918,15 @@ expr_reuse - 373719 + 373717 reuse - 373719 + 373717 original - 373700 + 373698 value_category @@ -31940,7 +31944,7 @@ 1 2 - 373719 + 373717 @@ -31956,7 +31960,7 @@ 1 2 - 373719 + 373717 @@ -31972,7 +31976,7 @@ 1 2 - 373681 + 373679 2 @@ -31993,7 +31997,7 @@ 1 2 - 373700 + 373698 @@ -32045,15 +32049,15 @@ expr_types - 18451524 + 18451442 id - 18319863 + 18319782 typeid - 1214606 + 1214616 value_category @@ -32071,12 +32075,12 @@ 1 2 - 18188202 + 18188122 2 3 - 131661 + 131659 @@ -32092,7 +32096,7 @@ 1 2 - 18319863 + 18319782 @@ -32108,42 +32112,42 @@ 1 2 - 438558 + 438565 2 3 - 249335 + 249332 3 4 - 102807 + 102839 4 5 - 81888 + 81865 5 8 - 109275 + 109274 8 14 - 96485 + 96495 14 41 - 91665 + 91664 41 125325 - 44590 + 44578 @@ -32159,12 +32163,12 @@ 1 2 - 1050219 + 1050230 2 3 - 154193 + 154192 3 @@ -32193,8 +32197,8 @@ 11 - 1239479 - 1239480 + 1239489 + 1239490 11 @@ -32219,8 +32223,8 @@ 11 - 90427 - 90428 + 90429 + 90430 11 @@ -32274,7 +32278,7 @@ 2 3 - 14736 + 14735 3 @@ -33483,7 +33487,7 @@ type_id - 20104 + 20103 @@ -33528,11 +33532,11 @@ sizeof_bind - 199184 + 199183 expr - 199184 + 199183 type_id @@ -33550,7 +33554,7 @@ 1 2 - 199184 + 199183 @@ -33659,11 +33663,11 @@ lambdas - 21475 + 21478 expr - 21475 + 21478 default_capture @@ -33685,7 +33689,7 @@ 1 2 - 21475 + 21478 @@ -33701,7 +33705,7 @@ 1 2 - 21475 + 21478 @@ -33775,15 +33779,15 @@ lambda_capture - 28011 + 28015 id - 28011 + 28015 lambda - 20542 + 20544 index @@ -33791,7 +33795,7 @@ field - 28011 + 28015 captured_by_reference @@ -33817,7 +33821,7 @@ 1 2 - 28011 + 28015 @@ -33833,7 +33837,7 @@ 1 2 - 28011 + 28015 @@ -33849,7 +33853,7 @@ 1 2 - 28011 + 28015 @@ -33865,7 +33869,7 @@ 1 2 - 28011 + 28015 @@ -33881,7 +33885,7 @@ 1 2 - 28011 + 28015 @@ -33897,7 +33901,7 @@ 1 2 - 28011 + 28015 @@ -33913,12 +33917,12 @@ 1 2 - 13072 + 13073 2 3 - 7469 + 7470 @@ -33934,12 +33938,12 @@ 1 2 - 13072 + 13073 2 3 - 7469 + 7470 @@ -33955,12 +33959,12 @@ 1 2 - 13072 + 13073 2 3 - 7469 + 7470 @@ -33976,7 +33980,7 @@ 1 2 - 20542 + 20544 @@ -33992,7 +33996,7 @@ 1 2 - 20542 + 20544 @@ -34008,12 +34012,12 @@ 1 2 - 13072 + 13073 2 3 - 7469 + 7470 @@ -34145,7 +34149,7 @@ 1 2 - 28011 + 28015 @@ -34161,7 +34165,7 @@ 1 2 - 28011 + 28015 @@ -34177,7 +34181,7 @@ 1 2 - 28011 + 28015 @@ -34193,7 +34197,7 @@ 1 2 - 28011 + 28015 @@ -34209,7 +34213,7 @@ 1 2 - 28011 + 28015 @@ -34225,7 +34229,7 @@ 1 2 - 28011 + 28015 @@ -34654,11 +34658,11 @@ stmts - 4630345 + 4630324 id - 4630345 + 4630324 kind @@ -34666,7 +34670,7 @@ location - 2171742 + 2171732 @@ -34680,7 +34684,7 @@ 1 2 - 4630345 + 4630324 @@ -34696,7 +34700,7 @@ 1 2 - 4630345 + 4630324 @@ -34924,12 +34928,12 @@ 1 2 - 1725789 + 1725781 2 3 - 178302 + 178301 3 @@ -34955,7 +34959,7 @@ 1 2 - 2117857 + 2117848 2 @@ -35114,15 +35118,15 @@ if_then - 725914 + 725911 if_stmt - 725914 + 725911 then_id - 725914 + 725911 @@ -35136,7 +35140,7 @@ 1 2 - 725914 + 725911 @@ -35152,7 +35156,7 @@ 1 2 - 725914 + 725911 @@ -35162,15 +35166,15 @@ if_else - 184669 + 184668 if_stmt - 184669 + 184668 else_id - 184669 + 184668 @@ -35184,7 +35188,7 @@ 1 2 - 184669 + 184668 @@ -35200,7 +35204,7 @@ 1 2 - 184669 + 184668 @@ -35258,15 +35262,15 @@ constexpr_if_then - 52998 + 52997 constexpr_if_stmt - 52998 + 52997 then_id - 52998 + 52997 @@ -35280,7 +35284,7 @@ 1 2 - 52998 + 52997 @@ -35296,7 +35300,7 @@ 1 2 - 52998 + 52997 @@ -35354,15 +35358,15 @@ while_body - 29317 + 29316 while_stmt - 29317 + 29316 body_id - 29317 + 29316 @@ -35376,7 +35380,7 @@ 1 2 - 29317 + 29316 @@ -35392,7 +35396,7 @@ 1 2 - 29317 + 29316 @@ -35402,15 +35406,15 @@ do_body - 148874 + 148873 do_stmt - 148874 + 148873 body_id - 148874 + 148873 @@ -35424,7 +35428,7 @@ 1 2 - 148874 + 148873 @@ -35440,7 +35444,7 @@ 1 2 - 148874 + 148873 @@ -35498,7 +35502,7 @@ switch_case - 207501 + 207500 switch_stmt @@ -35510,7 +35514,7 @@ case_id - 207501 + 207500 @@ -35738,7 +35742,7 @@ 1 2 - 207501 + 207500 @@ -35754,7 +35758,7 @@ 1 2 - 207501 + 207500 @@ -36004,11 +36008,11 @@ stmtparents - 4053474 + 4053456 id - 4053474 + 4053456 index @@ -36016,7 +36020,7 @@ parent - 1719861 + 1719854 @@ -36030,7 +36034,7 @@ 1 2 - 4053474 + 4053456 @@ -36046,7 +36050,7 @@ 1 2 - 4053474 + 4053456 @@ -36184,17 +36188,17 @@ 1 2 - 987702 + 987697 2 3 - 372623 + 372621 3 4 - 105638 + 105637 4 @@ -36225,17 +36229,17 @@ 1 2 - 987702 + 987697 2 3 - 372623 + 372621 3 4 - 105638 + 105637 4 @@ -36260,11 +36264,11 @@ ishandler - 62676 + 62675 block - 62676 + 62675 @@ -36297,7 +36301,7 @@ 1 2 - 520372 + 520373 2 @@ -36318,7 +36322,7 @@ 1 2 - 520372 + 520373 2 @@ -36578,7 +36582,7 @@ 1 2 - 520372 + 520373 2 @@ -36599,7 +36603,7 @@ 1 2 - 520372 + 520373 2 @@ -36833,15 +36837,15 @@ blockscope - 1410868 + 1410861 block - 1410868 + 1410861 enclosing - 1295552 + 1295546 @@ -36855,7 +36859,7 @@ 1 2 - 1410868 + 1410861 @@ -36871,12 +36875,12 @@ 1 2 - 1230191 + 1230185 2 13 - 65361 + 65360 @@ -36886,15 +36890,15 @@ jumpinfo - 254457 + 254455 id - 254457 + 254455 str - 21191 + 21190 target @@ -36912,7 +36916,7 @@ 1 2 - 254457 + 254455 @@ -36928,7 +36932,7 @@ 1 2 - 254457 + 254455 @@ -37072,19 +37076,19 @@ preprocdirects - 4190586 + 4191099 id - 4190586 + 4191099 kind - 5135 + 5136 location - 4149969 + 4150477 @@ -37098,7 +37102,7 @@ 1 2 - 4190586 + 4191099 @@ -37114,7 +37118,7 @@ 1 2 - 4190586 + 4191099 @@ -37262,7 +37266,7 @@ 1 2 - 4149502 + 4150010 88 @@ -37283,7 +37287,7 @@ 1 2 - 4149969 + 4150477 @@ -37293,15 +37297,15 @@ preprocpair - 1431410 + 1431585 begin - 1197043 + 1197190 elseelifend - 1431410 + 1431585 @@ -37315,17 +37319,17 @@ 1 2 - 978550 + 978670 2 3 - 208222 + 208247 3 11 - 10271 + 10272 @@ -37341,7 +37345,7 @@ 1 2 - 1431410 + 1431585 @@ -37351,41 +37355,41 @@ preproctrue - 767060 + 767154 branch - 767060 + 767154 preprocfalse - 331474 + 331515 branch - 331474 + 331515 preproctext - 3367747 + 3367732 id - 3367747 + 3367732 head - 2440673 + 2440662 body - 1426418 + 1426412 @@ -37399,7 +37403,7 @@ 1 2 - 3367747 + 3367732 @@ -37415,7 +37419,7 @@ 1 2 - 3367747 + 3367732 @@ -37431,12 +37435,12 @@ 1 2 - 2301873 + 2301863 2 740 - 138800 + 138799 @@ -37452,7 +37456,7 @@ 1 2 - 2381962 + 2381951 2 @@ -37473,12 +37477,12 @@ 1 2 - 1291263 + 1291258 2 6 - 106981 + 106980 6 @@ -37499,7 +37503,7 @@ 1 2 - 1294120 + 1294114 2 @@ -37519,15 +37523,15 @@ includes - 313266 + 313305 id - 313266 + 313305 included - 117183 + 117197 @@ -37541,7 +37545,7 @@ 1 2 - 313266 + 313305 @@ -37557,27 +37561,27 @@ 1 2 - 61159 + 61166 2 3 - 21942 + 21945 3 4 - 12605 + 12606 4 6 - 10271 + 10272 6 14 - 8870 + 8871 14 @@ -37640,11 +37644,11 @@ link_parent - 28676866 + 28676738 element - 3584451 + 3584435 link_target @@ -37662,7 +37666,7 @@ 1 2 - 432954 + 432952 2 @@ -37672,7 +37676,7 @@ 9 10 - 3131152 + 3131138 diff --git a/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme b/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/old.dbscheme new file mode 100644 index 000000000000..7ff6a6e53dbc --- /dev/null +++ b/cpp/ql/lib/upgrades/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/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..6f5d51e89e76 --- /dev/null +++ b/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/semmlecode.cpp.dbscheme @@ -0,0 +1,2316 @@ + +/** + * 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 +| 390 = @requires_expr +; + +@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/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties b/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties new file mode 100644 index 000000000000..dddc448b8e13 --- /dev/null +++ b/cpp/ql/lib/upgrades/7ff6a6e53dbcff09d1b9b758b594bc6d17366863/upgrade.properties @@ -0,0 +1,2 @@ +description: Add requires expressions +compatibility: full diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 986ce6dd158a..1e0ef80c269b 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -23564,6 +23564,26 @@ ir.cpp: # 2686| Value = [CStyleCast] 0 # 2686| ValueCategory = prvalue # 2687| getStmt(1): [ReturnStmt] return ... +# 2691| [TopLevelFunction] int concepts::requires_use() +# 2691| : +# 2691| getEntryPoint(): [BlockStmt] { ... } +# 2692| getStmt(0): [DeclStmt] declaration +# 2692| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2692| Type = [IntType] int +# 2692| getVariable().getInitializer(): [Initializer] initializer for y +#-----| getExpr(): [RequiresExpr] requires ... +#-----| Type = [BoolType] bool +#-----| Value = [RequiresExpr] 1 +#-----| ValueCategory = prvalue +#-----| getExpr().getFullyConverted(): [CStyleCast] (int)... +#-----| Conversion = [IntegralConversion] integral conversion +#-----| Type = [IntType] int +#-----| Value = [CStyleCast] 1 +#-----| ValueCategory = prvalue +# 2693| getStmt(1): [ReturnStmt] return ... +# 2693| getExpr(): [VariableAccess] y +# 2693| Type = [IntType] int +# 2693| ValueCategory = prvalue(load) many-defs-per-use.cpp: # 34| [TopLevelFunction] void many_defs_per_use() # 34| : 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 57c806278672..9fcaf04382d3 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -19099,6 +19099,24 @@ ir.cpp: # 2684| Block 8 # 2684| v2684_14(void) = Unreached : +# 2691| int concepts::requires_use() +# 2691| Block 0 +# 2691| v2691_1(void) = EnterFunction : +# 2691| m2691_2(unknown) = AliasedDefinition : +# 2691| m2691_3(unknown) = InitializeNonLocal : +# 2691| m2691_4(unknown) = Chi : total:m2691_2, partial:m2691_3 +# 2692| r2692_1(glval) = VariableAddress[y] : +#-----| r0_1(int) = Constant[1] : +#-----| m0_2(int) = Store[y] : &:r2692_1, r0_1 +# 2693| r2693_1(glval) = VariableAddress[#return] : +# 2693| r2693_2(glval) = VariableAddress[y] : +# 2693| r2693_3(int) = Load[y] : &:r2693_2, m0_2 +# 2693| m2693_4(int) = Store[#return] : &:r2693_1, r2693_3 +# 2691| r2691_5(glval) = VariableAddress[#return] : +# 2691| v2691_6(void) = ReturnValue : &:r2691_5, m2693_4 +# 2691| v2691_7(void) = AliasedUse : m2691_3 +# 2691| v2691_8(void) = ExitFunction : + many-defs-per-use.cpp: # 34| void many_defs_per_use() # 34| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index f8e163685373..105cdbf3ae65 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2686,4 +2686,13 @@ void test(bool b) twice_call_use(b ? "" : ""); } +namespace concepts { + +int requires_use() { + int y = requires { sizeof(int) > 0; }; + return y; +} + +} + // semmle-extractor-options: -std=c++20 --clang 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 a2d605daef17..ff4f47f3c22f 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -17422,6 +17422,23 @@ ir.cpp: # 2684| v2684_7(void) = AliasedUse : ~m? # 2684| v2684_8(void) = ExitFunction : +# 2691| int concepts::requires_use() +# 2691| Block 0 +# 2691| v2691_1(void) = EnterFunction : +# 2691| mu2691_2(unknown) = AliasedDefinition : +# 2691| mu2691_3(unknown) = InitializeNonLocal : +# 2692| r2692_1(glval) = VariableAddress[y] : +#-----| r0_1(int) = Constant[1] : +#-----| mu0_2(int) = Store[y] : &:r2692_1, r0_1 +# 2693| r2693_1(glval) = VariableAddress[#return] : +# 2693| r2693_2(glval) = VariableAddress[y] : +# 2693| r2693_3(int) = Load[y] : &:r2693_2, ~m? +# 2693| mu2693_4(int) = Store[#return] : &:r2693_1, r2693_3 +# 2691| r2691_4(glval) = VariableAddress[#return] : +# 2691| v2691_5(void) = ReturnValue : &:r2691_4, ~m? +# 2691| v2691_6(void) = AliasedUse : ~m? +# 2691| v2691_7(void) = ExitFunction : + many-defs-per-use.cpp: # 34| void many_defs_per_use() # 34| Block 0