Skip to content

Commit c829e46

Browse files
Move operator new weak attributes into cpp file
These were introduced in commit 4e469e0 (Allow overriding selected operator new and delete functions) with the intention to make the Arduino-provided definitions weak and allow them to be replaced by sketch-provided or library-provided versions. However, the attributes were placed in the `<new>` header file, causing *all* implementations (that `#include <new>`) to become weak (including sketch or library versions), which is not the intention. This commit fixes this by moving the weak attributes into the cpp file, causing only the Arduino-provided implementations to become weak. Note that in practice, the linking order (or maybe the use of an archive file for linking the core) seems to ensure that the sketch-provided versions are preferred over the the Arduino-provided versions, so even without this commit these operators can be replaced by the sketch.
1 parent 1cf2fd1 commit c829e46

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

Diff for: cores/arduino/new

+10-10
Original file line numberDiff line numberDiff line change
@@ -39,25 +39,25 @@ namespace std {
3939
using size_t = ::size_t;
4040
} // namespace std
4141

42-
[[gnu::weak]] void * operator new(std::size_t size);
43-
[[gnu::weak]] void * operator new[](std::size_t size);
42+
void * operator new(std::size_t size);
43+
void * operator new[](std::size_t size);
4444

45-
[[gnu::weak]] void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
46-
[[gnu::weak]] void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
45+
void * operator new(std::size_t size, const std::nothrow_t tag) noexcept;
46+
void * operator new[](std::size_t size, const std::nothrow_t& tag) noexcept;
4747

4848
void * operator new(std::size_t size, void *place) noexcept;
4949
void * operator new[](std::size_t size, void *place) noexcept;
5050

51-
[[gnu::weak]] void operator delete(void * ptr) noexcept;
52-
[[gnu::weak]] void operator delete[](void * ptr) noexcept;
51+
void operator delete(void * ptr) noexcept;
52+
void operator delete[](void * ptr) noexcept;
5353

5454
#if __cplusplus >= 201402L
55-
[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept;
56-
[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept;
55+
void operator delete(void* ptr, std::size_t size) noexcept;
56+
void operator delete[](void * ptr, std::size_t size) noexcept;
5757
#endif // __cplusplus >= 201402L
5858

59-
[[gnu::weak]] void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
60-
[[gnu::weak]] void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
59+
void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
60+
void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
6161

6262
void operator delete(void* ptr, void* place) noexcept;
6363
void operator delete[](void* ptr, void* place) noexcept;

Diff for: cores/arduino/new.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,19 @@ static void * new_helper(std::size_t size) {
4444
return malloc(size);
4545
}
4646

47-
void * operator new(std::size_t size) {
47+
[[gnu::weak]] void * operator new(std::size_t size) {
4848
void *res = new_helper(size);
4949
#if defined(NEW_TERMINATES_ON_FAILURE)
5050
if (!res)
5151
std::terminate();
5252
#endif
5353
return res;
5454
}
55-
void * operator new[](std::size_t size) {
55+
[[gnu::weak]] void * operator new[](std::size_t size) {
5656
return operator new(size);
5757
}
5858

59-
void * operator new(std::size_t size, [[gnu::unused]] const std::nothrow_t tag) noexcept {
59+
[[gnu::weak]] void * operator new(std::size_t size, [[gnu::unused]] const std::nothrow_t tag) noexcept {
6060
#if defined(NEW_TERMINATES_ON_FAILURE)
6161
// Cannot call throwing operator new as standard suggests, so call
6262
// new_helper directly then
@@ -65,7 +65,7 @@ void * operator new(std::size_t size, [[gnu::unused]] const std::nothrow_t tag)
6565
return operator new(size);
6666
#endif
6767
}
68-
void * operator new[](std::size_t size, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
68+
[[gnu::weak]] void * operator new[](std::size_t size, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
6969
#if defined(NEW_TERMINATES_ON_FAILURE)
7070
// Cannot call throwing operator new[] as standard suggests, so call
7171
// malloc directly then
@@ -84,26 +84,26 @@ void * operator new[](std::size_t size, void *place) noexcept {
8484
return operator new(size, place);
8585
}
8686

87-
void operator delete(void * ptr) noexcept {
87+
[[gnu::weak]] void operator delete(void * ptr) noexcept {
8888
free(ptr);
8989
}
90-
void operator delete[](void * ptr) noexcept {
90+
[[gnu::weak]] void operator delete[](void * ptr) noexcept {
9191
operator delete(ptr);
9292
}
9393

9494
#if __cplusplus >= 201402L
95-
void operator delete(void* ptr, std::size_t size) noexcept {
95+
[[gnu::weak]] void operator delete(void* ptr, std::size_t size) noexcept {
9696
operator delete(ptr);
9797
}
98-
void operator delete[](void * ptr, std::size_t size) noexcept {
98+
[[gnu::weak]] void operator delete[](void * ptr, std::size_t size) noexcept {
9999
operator delete[](ptr);
100100
}
101101
#endif // __cplusplus >= 201402L
102102

103-
void operator delete(void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
103+
[[gnu::weak]] void operator delete(void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
104104
operator delete(ptr);
105105
}
106-
void operator delete[](void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
106+
[[gnu::weak]] void operator delete[](void* ptr, [[gnu::unused]] const std::nothrow_t& tag) noexcept {
107107
operator delete[](ptr);
108108
}
109109

0 commit comments

Comments
 (0)