Skip to content

Commit

Permalink
[clang] Add some CodeGen tests for CWG 1xx issues (#80338)
Browse files Browse the repository at this point in the history
Covers CWG issues
[124](https://cplusplus.github.io/CWG/issues/124.html)
[185](https://cplusplus.github.io/CWG/issues/185.html),
[193](https://cplusplus.github.io/CWG/issues/193.html),
[199](https://cplusplus.github.io/CWG/issues/199.html).

I also looked at [190](https://cplusplus.github.io/CWG/issues/190.html),
but concluded that we should try to test it via C++20
`std::is_layout_compatible` first.

I tried to group tests under `dr1xx-codegen.cpp`, but found out that
CodeGen can arbitrarily reorder function definitions in LLVM module. In
particular, interleaving between regular function definitions and
destructor definitions present in the source might not be preserved,
which messes up FileCheck directives. `CHECK-DAG` can help with that,
but its interaction with `CHECK-LABEL` (lack of thereof) would require
me to relax tests too much.
  • Loading branch information
Endilll committed Feb 12, 2024
1 parent b04dd5d commit a9845d6
Show file tree
Hide file tree
Showing 6 changed files with 169 additions and 8 deletions.
51 changes: 51 additions & 0 deletions clang/test/CXX/drs/dr124.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// RUN: %clang_cc1 -std=c++98 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++11 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++14 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++17 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++20 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++23 %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK
// RUN: %clang_cc1 -std=c++2c %s -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes -o - -fexceptions -fcxx-exceptions -pedantic-errors | llvm-cxxfilt -n | FileCheck %s --check-prefixes CHECK

#if __cplusplus == 199711L
#define NOTHROW throw()
#else
#define NOTHROW noexcept(true)
#endif

namespace dr124 { // dr124: 2.7

extern void full_expr_fence() NOTHROW;

struct A {
A() NOTHROW {}
~A() NOTHROW {}
};

struct B {
B(A = A()) NOTHROW {}
~B() NOTHROW {}
};

void f() {
full_expr_fence();
B b[2];
full_expr_fence();
}

// CHECK-LABEL: define {{.*}} void @dr124::f()()
// CHECK: call void @dr124::full_expr_fence()
// CHECK: br label %arrayctor.loop
// CHECK-LABEL: arrayctor.loop:
// CHECK: call void @dr124::A::A()
// CHECK: call void @dr124::B::B(dr124::A)
// CHECK: call void @dr124::A::~A()
// CHECK: br {{.*}}, label %arrayctor.cont, label %arrayctor.loop
// CHECK-LABEL: arrayctor.cont:
// CHECK: call void @dr124::full_expr_fence()
// CHECK: br label %arraydestroy.body
// CHECK-LABEL: arraydestroy.body:
// CHECK: call void @dr124::B::~B()
// CHECK-LABEL: }


} // namespace dr124
30 changes: 30 additions & 0 deletions clang/test/CXX/drs/dr185.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// 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
// 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
// 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
// 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
// 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
// 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
// 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

namespace dr185 { // dr185: 2.7
struct A {
mutable int value;
explicit A(int i) : value(i) {}
void mutate(int i) const { value = i; }
};

int foo() {
A const& t = A(1);
A n(t);
t.mutate(2);
return n.value;
}

// CHECK-LABEL: define {{.*}} i32 @dr185::foo()
// CHECK: call void @dr185::A::A(int)(ptr {{[^,]*}} %ref.tmp, {{.*}})
// CHECK: store ptr %ref.tmp, ptr %t
// CHECK-NOT: %t =
// CHECK: [[DR185_T:%.+]] = load ptr, ptr %t
// CHECK: call void @llvm.memcpy.p0.p0.i64(ptr {{[^,]*}} %n, ptr {{[^,]*}} [[DR185_T]], {{.*}})
// CHECK-LABEL: }
} // namespace dr185
46 changes: 46 additions & 0 deletions clang/test/CXX/drs/dr193.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// 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
// 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
// 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
// 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
// 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
// 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
// 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

#if __cplusplus == 199711L
#define NOTHROW throw()
#else
#define NOTHROW noexcept(true)
#endif

namespace dr193 { // dr193: 2.7
struct A {
~A() NOTHROW {}
};

struct B {
~B() NOTHROW {}
};

struct C {
~C() NOTHROW {}
};

struct D : A {
B b;
~D() NOTHROW { C c; }
};

void foo() {
D d;
}

// skipping over D1 (complete object destructor)
// CHECK-LABEL: define {{.*}} void @dr193::D::~D(){{.*}}
// CHECK-LABEL: define {{.*}} void @dr193::D::~D(){{.*}}
// CHECK-NOT: call void @dr193::A::~A()
// CHECK-NOT: call void @dr193::B::~B()
// CHECK: call void @dr193::C::~C()
// CHECK: call void @dr193::B::~B()
// CHECK: call void @dr193::A::~A()
// CHECK-LABEL: }
} // namespace dr193
33 changes: 33 additions & 0 deletions clang/test/CXX/drs/dr199.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// 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
// 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
// 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
// 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
// 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
// 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
// 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

#if __cplusplus == 199711L
#define NOTHROW throw()
#else
#define NOTHROW noexcept(true)
#endif

namespace dr199 { // dr199: 2.8
struct A {
~A() NOTHROW {}
};

struct B {
~B() NOTHROW {}
};

void foo() {
A(), B();
}

// CHECK-LABEL: define {{.*}} void @dr199::foo()
// CHECK-NOT: call void @dr199::A::~A()
// CHECK: call void @dr199::B::~B()
// CHECK: call void @dr199::A::~A()
// CHECK-LABEL: }
} // namespace dr199
9 changes: 5 additions & 4 deletions clang/test/CXX/drs/dr1xx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ namespace dr122 { // dr122: yes
}

// dr123: na
// dr124: dup 201
// dr124 is in dr124.cpp

// dr125: yes
struct dr125_A { struct dr125_B {}; }; // #dr125_B
Expand Down Expand Up @@ -1169,7 +1169,7 @@ namespace dr184 { // dr184: yes
void h() { A<B>().g(); }
}

// dr185 FIXME: add codegen test
// dr185 is in dr185.cpp

namespace dr187 { // dr187: sup 481
const int Z = 1;
Expand All @@ -1184,6 +1184,7 @@ namespace dr188 { // dr188: yes
}

// dr190 FIXME: add codegen test for tbaa
// or implement C++20 std::is_layout_compatible and test it this way

int dr191_j;
namespace dr191 { // dr191: yes
Expand Down Expand Up @@ -1215,7 +1216,7 @@ namespace dr191 { // dr191: yes
}
}

// dr193 FIXME: add codegen test
// dr193 is in dr193.cpp

namespace dr194 { // dr194: yes
struct A {
Expand Down Expand Up @@ -1290,4 +1291,4 @@ namespace dr198 { // dr198: yes
};
}

// dr199 FIXME: add codegen test
// dr199 is in dr199.cpp
8 changes: 4 additions & 4 deletions clang/www/cxx_dr_status.html
Original file line number Diff line number Diff line change
Expand Up @@ -782,7 +782,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/124.html">124</a></td>
<td>CD1</td>
<td>Lifetime of temporaries in default initialization of class arrays</td>
<td class="unknown" align="center">Duplicate of <a href="#201">201</a></td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="125">
<td><a href="https://cplusplus.github.io/CWG/issues/125.html">125</a></td>
Expand Down Expand Up @@ -1148,7 +1148,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/185.html">185</a></td>
<td>TC1</td>
<td>"Named" temporaries and copy elision</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr class="open" id="186">
<td><a href="https://cplusplus.github.io/CWG/issues/186.html">186</a></td>
Expand Down Expand Up @@ -1196,7 +1196,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/193.html">193</a></td>
<td>TC1</td>
<td>Order of destruction of local automatics of destructor</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Clang 2.7</td>
</tr>
<tr id="194">
<td><a href="https://cplusplus.github.io/CWG/issues/194.html">194</a></td>
Expand Down Expand Up @@ -1232,7 +1232,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2>
<td><a href="https://cplusplus.github.io/CWG/issues/199.html">199</a></td>
<td>CD1</td>
<td>Order of destruction of temporaries</td>
<td class="unknown" align="center">Unknown</td>
<td class="full" align="center">Clang 2.8</td>
</tr>
<tr id="200">
<td><a href="https://cplusplus.github.io/CWG/issues/200.html">200</a></td>
Expand Down

0 comments on commit a9845d6

Please sign in to comment.