mirror of
https://github.com/github/codeql.git
synced 2025-12-24 04:36:35 +01:00
C++: Support __is_assignable builtin
While here fix the documentation of `__is_trivially_assignable` and `__is_nothrow_assignable`.
This commit is contained in:
@@ -612,13 +612,10 @@ class BuiltInOperationIsTriviallyDestructible extends BuiltInOperation, @istrivi
|
|||||||
* The `__is_trivially_assignable` built-in operation (used by some
|
* The `__is_trivially_assignable` built-in operation (used by some
|
||||||
* implementations of the `<type_traits>` header).
|
* implementations of the `<type_traits>` header).
|
||||||
*
|
*
|
||||||
* Returns `true` if the assignment operator `C::operator =(const C& c)` is
|
* Returns `true` if the assignment operator `C::operator =(const D& d)` is
|
||||||
* trivial.
|
* trivial (i.e., it will not call any operation that is non-trivial).
|
||||||
* ```
|
* ```
|
||||||
* template<typename T>
|
* bool v = __is_trivially_assignable(MyType1, MyType2);
|
||||||
* struct is_trivially_assignable
|
|
||||||
* : public integral_constant<bool, __is_trivially_assignable(T) >
|
|
||||||
* { };
|
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
class BuiltInOperationIsTriviallyAssignable extends BuiltInOperation, @istriviallyassignableexpr {
|
class BuiltInOperationIsTriviallyAssignable extends BuiltInOperation, @istriviallyassignableexpr {
|
||||||
@@ -631,10 +628,10 @@ class BuiltInOperationIsTriviallyAssignable extends BuiltInOperation, @istrivial
|
|||||||
* The `__is_nothrow_assignable` built-in operation (used by some
|
* The `__is_nothrow_assignable` built-in operation (used by some
|
||||||
* implementations of the `<type_traits>` header).
|
* implementations of the `<type_traits>` header).
|
||||||
*
|
*
|
||||||
* Returns true if there exists a `C::operator =(const C& c) nothrow`
|
* Returns true if there exists a `C::operator =(const D& d) nothrow`
|
||||||
* assignment operator (i.e, with an empty exception specification).
|
* assignment operator (i.e, with an empty exception specification).
|
||||||
* ```
|
* ```
|
||||||
* bool v = __is_nothrow_assignable(MyType);
|
* bool v = __is_nothrow_assignable(MyType1, MyType2);
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
class BuiltInOperationIsNothrowAssignable extends BuiltInOperation, @isnothrowassignableexpr {
|
class BuiltInOperationIsNothrowAssignable extends BuiltInOperation, @isnothrowassignableexpr {
|
||||||
@@ -643,6 +640,22 @@ class BuiltInOperationIsNothrowAssignable extends BuiltInOperation, @isnothrowas
|
|||||||
override string getAPrimaryQlClass() { result = "BuiltInOperationIsNothrowAssignable" }
|
override string getAPrimaryQlClass() { result = "BuiltInOperationIsNothrowAssignable" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The `__is_assignable` built-in operation (used by some implementations
|
||||||
|
* of the `<type_traits>` header).
|
||||||
|
*
|
||||||
|
* Returns true if there exists a `C::operator =(const D& d)` assignment
|
||||||
|
* operator.
|
||||||
|
* ```
|
||||||
|
* bool v = __is_assignable(MyType1, MyType2);
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
class BuiltInOperationIsAssignable extends BuiltInOperation, @isassignable {
|
||||||
|
override string toString() { result = "__is_assignable" }
|
||||||
|
|
||||||
|
override string getAPrimaryQlClass() { result = "BuiltInOperationIsAssignable" }
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The `__is_standard_layout` built-in operation (used by some implementations
|
* The `__is_standard_layout` built-in operation (used by some implementations
|
||||||
* of the `<type_traits>` header).
|
* of the `<type_traits>` header).
|
||||||
|
|||||||
@@ -1650,6 +1650,7 @@ case @expr.kind of
|
|||||||
| 327 = @co_await
|
| 327 = @co_await
|
||||||
| 328 = @co_yield
|
| 328 = @co_yield
|
||||||
| 329 = @temp_init
|
| 329 = @temp_init
|
||||||
|
| 330 = @isassignable
|
||||||
;
|
;
|
||||||
|
|
||||||
@var_args_expr = @vastartexpr
|
@var_args_expr = @vastartexpr
|
||||||
@@ -1711,6 +1712,7 @@ case @expr.kind of
|
|||||||
| @isfinalexpr
|
| @isfinalexpr
|
||||||
| @builtinchooseexpr
|
| @builtinchooseexpr
|
||||||
| @builtincomplex
|
| @builtincomplex
|
||||||
|
| @isassignable
|
||||||
;
|
;
|
||||||
|
|
||||||
new_allocated_type(
|
new_allocated_type(
|
||||||
|
|||||||
@@ -296,3 +296,12 @@
|
|||||||
| ms.cpp:255:24:255:43 | a_struct | | <none> |
|
| ms.cpp:255:24:255:43 | a_struct | | <none> |
|
||||||
| ms.cpp:256:24:256:49 | __is_final | a_final_struct | 1 |
|
| ms.cpp:256:24:256:49 | __is_final | a_final_struct | 1 |
|
||||||
| ms.cpp:256:24:256:49 | a_final_struct | | <none> |
|
| ms.cpp:256:24:256:49 | a_final_struct | | <none> |
|
||||||
|
| ms.cpp:258:29:258:62 | __is_assignable | a_struct,a_struct | 1 |
|
||||||
|
| ms.cpp:258:29:258:62 | a_struct | | <none> |
|
||||||
|
| ms.cpp:258:29:258:62 | a_struct | | <none> |
|
||||||
|
| ms.cpp:259:29:259:59 | __is_assignable | a_struct,empty | 0 |
|
||||||
|
| ms.cpp:259:29:259:59 | a_struct | | <none> |
|
||||||
|
| ms.cpp:259:29:259:59 | empty | | <none> |
|
||||||
|
| ms.cpp:260:29:260:57 | __is_assignable | a_struct,int | 0 |
|
||||||
|
| ms.cpp:260:29:260:57 | a_struct | | <none> |
|
||||||
|
| ms.cpp:260:29:260:57 | int | | <none> |
|
||||||
|
|||||||
@@ -254,5 +254,8 @@ void f(void) {
|
|||||||
|
|
||||||
bool b_is_final1 = __is_final(a_struct);
|
bool b_is_final1 = __is_final(a_struct);
|
||||||
bool b_is_final2 = __is_final(a_final_struct);
|
bool b_is_final2 = __is_final(a_final_struct);
|
||||||
}
|
|
||||||
|
|
||||||
|
bool b_is_assignable1 = __is_assignable(a_struct,a_struct);
|
||||||
|
bool b_is_assignable2 = __is_assignable(a_struct,empty);
|
||||||
|
bool b_is_assignable3 = __is_assignable(a_struct,int);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user