llvm-project/clang/test/OpenMP/deferred-diags.cpp
Vlad Serebrennikov 788731cdbd
[clang] Implement P3144R2 "Deleting a Pointer to an Incomplete Type..." (#97733)
This patch implements (not yet published)
[P3144R2](https://wiki.edg.com/pub/Wg21stlouis2024/StrawPolls/p3144r2.pdf)
"Deleting a Pointer to an Incomplete Type Should be Ill-formed". Wording
changes (not yet merged into the working draft) read:
> 7.6.2.9 [expr.delete] Delete
> If the object being deleted has incomplete class type at the point of
deletion <del>and the complete class has a
non-trivial destructor or a deallocation function, the behavior is
undefined</del>, <ins>the program is ill-formed</ins>.

We preserve status quo of emitting a warning when deleting a pointer to
incomplete type up to, and including, C++23, but make it ill-formed
since C++26. Same goes for deleting pointers to `void`, which has been
allowed as an extension.
2024-07-05 22:27:04 +04:00

49 lines
1.1 KiB
C++

// RUN: %clang_cc1 -triple x86_64 -verify=expected,dev -std=c++11\
// RUN: -verify-ignore-unexpected=note \
// RUN: -fopenmp -fopenmp-version=45 -o - %s
// RUN: %clang_cc1 -triple x86_64 -verify=expected,dev -std=c++11\
// RUN: -verify-ignore-unexpected=note \
// RUN: -fopenmp -o - %s
// Test no infinite recursion in DeferredDiagnosticEmitter.
constexpr int foo(int *x) {
return 0;
}
int a = foo(&a);
// Test no crash when both caller and callee have target directives.
int foo();
class B {
public:
void barB(int *isHost) {
#pragma omp target map(tofrom: isHost)
{
*isHost = foo();
}
}
};
class A : public B {
public:
void barA(int *isHost) {
#pragma omp target map(tofrom: isHost)
{
barB(isHost);
}
}
};
// Test that deleting an incomplete class type doesn't cause an assertion.
namespace TestDeleteIncompleteClassDefinition {
struct a;
struct b {
b() {
delete c; // expected-warning {{deleting pointer to incomplete type 'a' is incompatible with C++2c and may cause undefined behavior}}
}
a *c;
};
} // namespace TestDeleteIncompleteClassDefinition