blob: 90b392bdb58fa9f284c554bb9d7d245a4c7ac71b [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_STRUCT_OPERATORS_ADD_ASSIGN_H_
#define CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_ADD_ASSIGN_H_
#include <cstdint>
#pragma clang lifetime_elision
struct AddAssignMemberInt final {
int operator+=(int rhs) {
this->i += rhs;
return i;
}
int i;
};
struct AddAssignMemberByValue final {
AddAssignMemberByValue& operator+=(AddAssignMemberByValue rhs) {
this->i += rhs.i;
return *this;
}
int i;
};
struct AddAssignMemberByRef final {
AddAssignMemberByRef& operator+=(AddAssignMemberByRef& rhs) {
this->i += rhs.i;
return *this;
}
int i;
};
struct AddAssignMemberByConstRef final {
AddAssignMemberByConstRef& operator+=(const AddAssignMemberByConstRef& rhs) {
this->i += rhs.i;
return *this;
}
int i;
};
// This tests the following aspect of
// https://en.cppreference.com/w/cpp/language/adl: "ADL can find a friend
// function (typically, an overloaded operator) that is defined entirely within
// a class or class template, even if it was never declared at namespace level."
struct AddAssignFriendByValue final {
friend AddAssignFriendByValue& operator+=(AddAssignFriendByValue& lhs,
AddAssignFriendByValue rhs);
int i;
};
struct AddAssignFreeByValue final {
int i;
};
AddAssignFreeByValue& operator+=(AddAssignFreeByValue& lhs,
AddAssignFreeByValue rhs);
// This provides additional test coverage for b/244311755.
struct AddAssignInlineFriendByValue final {
friend inline AddAssignInlineFriendByValue& operator+=(
AddAssignInlineFriendByValue& lhs, AddAssignInlineFriendByValue rhs);
int i;
};
inline AddAssignInlineFriendByValue& operator+=(
AddAssignInlineFriendByValue& lhs, AddAssignInlineFriendByValue rhs) {
lhs.i += rhs.i;
return lhs;
}
#endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_ADD_ASSIGN_H_