mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-05-13 17:37:00 +00:00

Close https://github.com/llvm/llvm-project/issues/59601. This is actually a workaround for the issue. See the comments and the test for example. The proper fix should make the placement allocation functions acceptable based on the context. But it is harder and more complex on the one side. On the other side, such workaround won't be too bad in practice since users rarely call the placement allocation functions directly. So personally I prefer to address such problems in the simpler way. Reviewed By: royjacobson Differential Revision: https://reviews.llvm.org/D141023
40 lines
962 B
C++
40 lines
962 B
C++
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/Use.cpp -fprebuilt-module-path=%t -fsyntax-only -verify
|
|
|
|
//--- placement.h
|
|
namespace std {
|
|
using size_t = decltype(sizeof(0));
|
|
}
|
|
void *operator new(std::size_t, void *p) { return p; }
|
|
|
|
//--- A.cppm
|
|
module;
|
|
#include "placement.h"
|
|
export module A;
|
|
export template<class T>
|
|
struct A {
|
|
A(void *p) : ptr(new (p) T(43)) {}
|
|
private:
|
|
void *ptr;
|
|
};
|
|
|
|
export struct B {
|
|
B(void *p) : ptr(new (p) int(43)) {}
|
|
private:
|
|
void *ptr;
|
|
};
|
|
|
|
//--- Use.cpp
|
|
// expected-no-diagnostics
|
|
import A;
|
|
void bar(int *);
|
|
void foo(void *ptr) {
|
|
A<int>(nullptr); // Good. It should be OK to construct A.
|
|
void *p = ::operator new(sizeof(int), ptr); // Bad. The function shouldn't be visible here.
|
|
void *q = new (ptr) int(43); // Good. We don't call the placement allocation function directly.
|
|
}
|