blob: c1583ebd0522a4f796e63b13f247883279fe4349 [file] [log] [blame]
// 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_GOLDEN_TRIVIAL_TYPE_H_
#define CRUBIT_RS_BINDINGS_FROM_CC_TEST_GOLDEN_TRIVIAL_TYPE_H_
#pragma clang lifetime_elision
namespace ns {
// Implicitly defined special member functions are trivial on a struct with
// only trivial members.
struct Trivial final {
int trivial_field;
void Unqualified();
void ConstQualified() const;
void LvalueRefQualified() &;
void ConstLvalueRefQualified() const&;
void RvalueRefQualified() &&;
void ConstRvalueRefQualified() const&&;
};
// This struct is trivial, and therefore trivially relocatable etc., but still
// not safe to pass by reference as it is not final.
struct TrivialNonfinal {
int trivial_field;
};
Trivial TakesByValue(Trivial trivial);
TrivialNonfinal TakesTrivialNonfinalByValue(TrivialNonfinal trivial);
Trivial& TakesByReference(Trivial& trivial);
TrivialNonfinal& TakesTrivialNonfinalByReference(TrivialNonfinal& trivial);
const Trivial& TakesByConstReference(const Trivial& trivial);
const TrivialNonfinal& TakesTrivialNonfinalByConstReference(
const TrivialNonfinal& trivial);
Trivial&& TakesByRvalueReference(Trivial&& trivial);
TrivialNonfinal&& TakesTrivialNonfinalByRvalueReference(
TrivialNonfinal&& trivial);
const Trivial&& TakesByConstRvalueReference(const Trivial&& trivial);
const TrivialNonfinal&& TakesTrivialNonfinalByConstRvalueReference(
const TrivialNonfinal&& trivial);
} // namespace ns
#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_GOLDEN_TRIVIAL_TYPE_H_