| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_CONSTRUCTORS_CONSTRUCTORS_H_ | |
| #define CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_CONSTRUCTORS_CONSTRUCTORS_H_ | |
| // `[[clang::trivial_abi]]` is used so that `is_trivial_abi` doesn't prevent | |
| // generating bindings for constructors, even though the presence of a | |
| // user-defined copy constructor technically means that the struct below | |
| // is non-trivial. | |
| struct [[clang::trivial_abi]] StructWithUserProvidedConstructors final { | |
| // `impl Default for StructWithUserProvidedConstructors { ... }`. | |
| StructWithUserProvidedConstructors(); | |
| // `impl Clone for StructWithUserProvidedConstructors { ... }`. | |
| StructWithUserProvidedConstructors(const StructWithUserProvidedConstructors&); | |
| int int_field; | |
| }; | |
| struct StructWithExplicitConversionConstructor final { | |
| // Testing `impl From<int> for ...` when the constructor is `explicit`. | |
| explicit StructWithExplicitConversionConstructor(int i) : int_field(i) {} | |
| int int_field; | |
| }; | |
| struct StructWithImplicitConversionConstructor final { | |
| // Testing `impl From<int> for ...` when the constructor is *not* `explicit`. | |
| // NOLINTNEXTLINE(google-explicit-constructor) | |
| StructWithImplicitConversionConstructor(int i) : int_field(i) {} | |
| int int_field; | |
| }; | |
| struct OtherSimpleStruct final { | |
| int int_field; | |
| }; | |
| struct StructWithImplicitConversionFromReference final { | |
| // Testing `impl<'b> From<&'b OtherSimpleStruct> for ...`. | |
| // NOLINTNEXTLINE(google-explicit-constructor) | |
| StructWithImplicitConversionFromReference(const OtherSimpleStruct& other) | |
| : int_field(other.int_field) {} | |
| int int_field; | |
| }; | |
| // Inline-defined constructors test that thunks are properly implemented by | |
| // `generate_rs_api_impl`. | |
| struct [[clang::trivial_abi]] StructWithInlineConstructors final { | |
| StructWithInlineConstructors() : int_field(123) {} | |
| StructWithInlineConstructors(const StructWithInlineConstructors& other) | |
| : int_field(20000 + other.int_field) {} | |
| // NOLINTNEXTLINE(google-explicit-constructor) | |
| StructWithInlineConstructors(int i) : int_field(i) {} | |
| int int_field; | |
| }; | |
| struct StructWithDeletedConstructors final { | |
| StructWithDeletedConstructors() = delete; | |
| StructWithDeletedConstructors(const StructWithDeletedConstructors&) = delete; | |
| explicit StructWithDeletedConstructors(int) = delete; | |
| int int_field; | |
| }; | |
| struct StructWithPrivateConstructors final { | |
| private: | |
| StructWithPrivateConstructors(); | |
| StructWithPrivateConstructors(const StructWithPrivateConstructors&); | |
| explicit StructWithPrivateConstructors(int); | |
| int int_field; | |
| }; | |
| struct StructWithExplicitlyDefaultedConstructors final { | |
| StructWithExplicitlyDefaultedConstructors() = default; | |
| StructWithExplicitlyDefaultedConstructors( | |
| const StructWithExplicitlyDefaultedConstructors&) = default; | |
| int field_with_explicit_initializer = 123; | |
| int field_with_no_initializer; | |
| }; | |
| // TODO(lukasza): Add StructWithImplicitlyDefaultedConstructor test (or is | |
| // that just testing the compiler and therefore not useful?). | |
| struct NonTrivialStructWithConstructors final { | |
| NonTrivialStructWithConstructors(); | |
| explicit NonTrivialStructWithConstructors(int); | |
| // Presence of a user-defined destructor makes this struct non-trivial. | |
| ~NonTrivialStructWithConstructors(); | |
| int int_field; | |
| }; | |
| #endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_CONSTRUCTORS_CONSTRUCTORS_H_ |