https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/77637
>From 545ee4900e48b186e1c9fff93dc62a459ee19754 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 10 Jan 2024 20:27:53 +0300 Subject: [PATCH 1/6] [clang] Add test for CWG1807 The test checks that objects in arrays are destructed in reverse order during stack unwinding. --- clang/test/CXX/drs/dr1807.cpp | 31 +++++++++++++++++++++++++++++++ clang/www/cxx_dr_status.html | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 clang/test/CXX/drs/dr1807.cpp diff --git a/clang/test/CXX/drs/dr1807.cpp b/clang/test/CXX/drs/dr1807.cpp new file mode 100644 index 00000000000000..f599a36c8b2cbd --- /dev/null +++ b/clang/test/CXX/drs/dr1807.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,CXX98 +// RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 + +namespace dr1807 { // dr1807: 3.0 +struct S { + S() {} + ~S() {} +}; + +void f() { + try { + S s[3]; + } catch (...) {} +} +} + +// CHECK: invoke void @dr1807::S::S(){{.+}} +// CHECK-NEXT: {{.+}} unwind label %lpad + +// CHECK-LABEL: lpad: +// CHECK: br {{.+}}, label {{.+}}, label %arraydestroy.body + +// CHECK-LABEL: arraydestroy.body: +// CHECK: %arraydestroy.element = getelementptr {{.+}}, i64 -1 +// CXX98-NEXT: invoke void @dr1807::S::~S(){{.*}}%arraydestroy.element +// SINCE-CXX11-NEXT: call void @dr1807::S::~S(){{.*}}%arraydestroy.element diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index 2bded63d5cd41c..bea9d0f54c471e 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -10649,7 +10649,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2> <td><a href="https://cplusplus.github.io/CWG/issues/1807.html">1807</a></td> <td>CD4</td> <td>Order of destruction of array elements after an exception</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Clang 3.0</td> </tr> <tr class="open" id="1808"> <td><a href="https://cplusplus.github.io/CWG/issues/1808.html">1808</a></td> >From 81b5f521c4e8e77f39ef1b01612a7866c6de8440 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 10 Jan 2024 21:57:30 +0300 Subject: [PATCH 2/6] Leave a comment in dr18xx.cpp --- clang/test/CXX/drs/dr18xx.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/test/CXX/drs/dr18xx.cpp b/clang/test/CXX/drs/dr18xx.cpp index 1d76804907a5c1..e092c83ab4ce42 100644 --- a/clang/test/CXX/drs/dr18xx.cpp +++ b/clang/test/CXX/drs/dr18xx.cpp @@ -164,6 +164,8 @@ void A<double, U>::C<V>::f4() { } } // namespace dr1804 +// dr1807 is in separate file + namespace dr1812 { // dr1812: no // NB: dup 1710 #if __cplusplus >= 201103L >From 59ec23c9cdd4d4557c0b471331683d577add31d6 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 10 Jan 2024 22:06:01 +0300 Subject: [PATCH 3/6] Eliminate the need for readers to guess how the file is named --- clang/test/CXX/drs/dr18xx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/CXX/drs/dr18xx.cpp b/clang/test/CXX/drs/dr18xx.cpp index e092c83ab4ce42..530122ccd1aab1 100644 --- a/clang/test/CXX/drs/dr18xx.cpp +++ b/clang/test/CXX/drs/dr18xx.cpp @@ -164,7 +164,7 @@ void A<double, U>::C<V>::f4() { } } // namespace dr1804 -// dr1807 is in separate file +// dr1807 is in dr1807.cpp namespace dr1812 { // dr1812: no // NB: dup 1710 >From 62f1fa6bb3c691dde2e903711634857de486e71e Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Wed, 10 Jan 2024 23:33:41 +0300 Subject: [PATCH 4/6] Simplify C++ part of the test --- clang/test/CXX/drs/dr1807.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/test/CXX/drs/dr1807.cpp b/clang/test/CXX/drs/dr1807.cpp index f599a36c8b2cbd..e654987b485c76 100644 --- a/clang/test/CXX/drs/dr1807.cpp +++ b/clang/test/CXX/drs/dr1807.cpp @@ -13,9 +13,7 @@ struct S { }; void f() { - try { - S s[3]; - } catch (...) {} + S s[3]; } } >From 95155829973bb1006bfc4bbc518fd208b9f06c5b Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Fri, 12 Jan 2024 14:01:32 +0300 Subject: [PATCH 5/6] Remove `-n` argument passed to llvm-cxxfilt It doesn't make a difference, and I don't really understand what it does. --- clang/test/CXX/drs/dr1807.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/clang/test/CXX/drs/dr1807.cpp b/clang/test/CXX/drs/dr1807.cpp index e654987b485c76..78940d93837141 100644 --- a/clang/test/CXX/drs/dr1807.cpp +++ b/clang/test/CXX/drs/dr1807.cpp @@ -1,10 +1,10 @@ -// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,CXX98 -// RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 -// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 -// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 -// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 -// RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 -// RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,CXX98 +// RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 +// RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt | FileCheck %s --check-prefixes CHECK,SINCE-CXX11 namespace dr1807 { // dr1807: 3.0 struct S { >From 1e77acaf19152695ecdaf0624ddbeb555a548638 Mon Sep 17 00:00:00 2001 From: Vlad Serebrennikov <serebrennikov.vladis...@gmail.com> Date: Fri, 12 Jan 2024 19:11:11 +0300 Subject: [PATCH 6/6] Replace some hard-coded strings with captures Label names has to be hard-coded, as variables are not allowed in `CHECK-LABEL` directives. --- clang/test/CXX/drs/dr1807.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/test/CXX/drs/dr1807.cpp b/clang/test/CXX/drs/dr1807.cpp index 78940d93837141..d367be7cf9465f 100644 --- a/clang/test/CXX/drs/dr1807.cpp +++ b/clang/test/CXX/drs/dr1807.cpp @@ -17,13 +17,12 @@ void f() { } } +// CHECK-LABEL: define dso_local void @dr1807::f() // CHECK: invoke void @dr1807::S::S(){{.+}} // CHECK-NEXT: {{.+}} unwind label %lpad - // CHECK-LABEL: lpad: // CHECK: br {{.+}}, label {{.+}}, label %arraydestroy.body - -// CHECK-LABEL: arraydestroy.body: -// CHECK: %arraydestroy.element = getelementptr {{.+}}, i64 -1 -// CXX98-NEXT: invoke void @dr1807::S::~S(){{.*}}%arraydestroy.element -// SINCE-CXX11-NEXT: call void @dr1807::S::~S(){{.*}}%arraydestroy.element +// CHECK-LABEL: arraydestroy.body: +// CHECK: [[ARRAYDESTROY_ELEMENT:%.*]] = getelementptr {{.+}}, i64 -1 +// CXX98-NEXT: invoke void @dr1807::S::~S(){{.*}}[[ARRAYDESTROY_ELEMENT]] +// SINCE-CXX11-NEXT: call void @dr1807::S::~S(){{.*}}[[ARRAYDESTROY_ELEMENT]] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits