Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions clang/lib/Serialization/ASTReaderDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1076,6 +1076,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
FD->setFriendConstraintRefersToEnclosingTemplate(
FunctionDeclBits.getNextBit());
FD->setUsesSEHTry(FunctionDeclBits.getNextBit());
FD->setIsDestroyingOperatorDelete(FunctionDeclBits.getNextBit());
FD->setIsTypeAwareOperatorNewOrDelete(FunctionDeclBits.getNextBit());

FD->EndRangeLoc = readSourceLocation();
if (FD->isExplicitlyDefaulted())
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Serialization/ASTWriterDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,8 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
FunctionDeclBits.addBit(D->isInstantiatedFromMemberTemplate());
FunctionDeclBits.addBit(D->FriendConstraintRefersToEnclosingTemplate());
FunctionDeclBits.addBit(D->usesSEHTry());
FunctionDeclBits.addBit(D->isDestroyingOperatorDelete());
FunctionDeclBits.addBit(D->isTypeAwareOperatorNewOrDelete());
Record.push_back(FunctionDeclBits);

Record.AddSourceLocation(D->getEndLoc());
Expand Down
1 change: 1 addition & 0 deletions clang/test/Modules/Inputs/PR137102/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module type_aware_destroying_new_delete { header "type_aware_destroying_new_delete.h" export * }
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

namespace std {
struct destroying_delete_t { };
template <class T> struct type_identity {
using type = T;
};
typedef __SIZE_TYPE__ size_t;
enum class align_val_t : size_t;
};

struct A {
A();
void *operator new(std::size_t);
void operator delete(A*, std::destroying_delete_t);
};

struct B {
B();
void *operator new(std::type_identity<B>, std::size_t, std::align_val_t);
void operator delete(std::type_identity<B>, void*, std::size_t, std::align_val_t);
};

struct C {
C();
template <class T> void *operator new(std::type_identity<T>, std::size_t, std::align_val_t);
template <class T> void operator delete(std::type_identity<T>, void*, std::size_t, std::align_val_t);
};

struct D {
D();
};
void *operator new(std::type_identity<D>, std::size_t, std::align_val_t);
void operator delete(std::type_identity<D>, void*, std::size_t, std::align_val_t);

struct E {
E();
};
template <class T> void *operator new(std::type_identity<T>, std::size_t, std::align_val_t);
template <class T> void operator delete(std::type_identity<T>, void*, std::size_t, std::align_val_t);

void in_module_tests() {
A* a = new A;
delete a;
B *b = new B;
delete b;
C *c = new C;
delete c;
D *d = new D;
delete d;
E *e = new E;
delete e;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x c++ -std=c++26 -fmodules-cache-path=%t -I %S/Inputs/PR137102 -emit-llvm-only %s
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x c++ -std=c++26 -fmodules-cache-path=%t -I %S/Inputs/PR137102 -emit-llvm-only %s -triple i686-windows

#include "type_aware_destroying_new_delete.h"


static void call_in_module_function(void) {
in_module_tests();
}

void out_of_module_tests() {
A* a = new A;
delete a;
B *b = new B;
delete b;
C *c = new C;
delete c;
D *d = new D;
delete d;
E *e = new E;
delete e;
}
52 changes: 52 additions & 0 deletions clang/test/PCH/Inputs/type_aware_destroying_new_delete.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@

namespace std {
struct destroying_delete_t { };
template <class T> struct type_identity {
using type = T;
};
typedef __SIZE_TYPE__ size_t;
enum class align_val_t : size_t;
};

struct A {
A();
void *operator new(std::size_t);
void operator delete(A*, std::destroying_delete_t);
};

struct B {
B();
void *operator new(std::type_identity<B>, std::size_t, std::align_val_t);
void operator delete(std::type_identity<B>, void*, std::size_t, std::align_val_t);
};

struct C {
C();
template <class T> void *operator new(std::type_identity<T>, std::size_t, std::align_val_t);
template <class T> void operator delete(std::type_identity<T>, void*, std::size_t, std::align_val_t);
};

struct D {
D();
};
void *operator new(std::type_identity<D>, std::size_t, std::align_val_t);
void operator delete(std::type_identity<D>, void*, std::size_t, std::align_val_t);

struct E {
E();
};
template <class T> void *operator new(std::type_identity<T>, std::size_t, std::align_val_t);
template <class T> void operator delete(std::type_identity<T>, void*, std::size_t, std::align_val_t);

void in_pch_tests() {
A* a = new A;
delete a;
B *b = new B;
delete b;
C *c = new C;
delete c;
D *d = new D;
delete d;
E *e = new E;
delete e;
}
27 changes: 27 additions & 0 deletions clang/test/PCH/type-aware-destroying-new-and-delete-pch.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Test this without pch.
// RUN: %clang_cc1 -x c++ -std=c++26 -include %S/Inputs/type_aware_destroying_new_delete.h -emit-llvm -o - %s

// Test with pch.
// RUN: %clang_cc1 -x c++ -std=c++26 -emit-pch -o %t %S/Inputs/type_aware_destroying_new_delete.h
// RUN: %clang_cc1 -x c++ -std=c++26 -include-pch %t -emit-llvm -o - %s

// RUN: %clang_cc1 -x c++ -std=c++11 -emit-pch -fpch-instantiate-templates -o %t %S/Inputs/type_aware_destroying_new_delete.h
// RUN: %clang_cc1 -x c++ -std=c++11 -include-pch %t -emit-llvm -o - %s


static void call_in_pch_function(void) {
in_pch_tests();
}

void out_of_pch_tests() {
A* a = new A;
delete a;
B *b = new B;
delete b;
C *c = new C;
delete c;
D *d = new D;
delete d;
E *e = new E;
delete e;
}
Loading