diff options
Diffstat (limited to 'clang/test/CodeGenCXX/cxx2a-consteval.cpp')
| -rw-r--r-- | clang/test/CodeGenCXX/cxx2a-consteval.cpp | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/clang/test/CodeGenCXX/cxx2a-consteval.cpp b/clang/test/CodeGenCXX/cxx2a-consteval.cpp index 075cab58358a..a58a09554699 100644 --- a/clang/test/CodeGenCXX/cxx2a-consteval.cpp +++ b/clang/test/CodeGenCXX/cxx2a-consteval.cpp @@ -1,4 +1,3 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py // RUN: %clang_cc1 -emit-llvm %s -std=c++2a -triple x86_64-unknown-linux-gnu -o %t.ll // RUN: FileCheck -check-prefix=EVAL -input-file=%t.ll %s // RUN: FileCheck -check-prefix=EVAL-STATIC -input-file=%t.ll %s @@ -118,9 +117,9 @@ consteval Agg retAgg() { // EVAL-FN-NEXT: entry: // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 -// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 +// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 // EVAL-FN-NEXT: store i32 13, ptr [[TMP0]], align 8 -// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 +// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 // EVAL-FN-NEXT: store i64 17, ptr [[TMP1]], align 8 // EVAL-FN-NEXT: store i64 17, ptr [[B]], align 8 // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, ptr [[B]], align 8 @@ -145,9 +144,9 @@ consteval const Agg &retRefAgg() { // EVAL-FN-NEXT: entry: // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 -// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 +// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 // EVAL-FN-NEXT: store i32 13, ptr [[TMP0]], align 8 -// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 +// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 // EVAL-FN-NEXT: store i64 17, ptr [[TMP1]], align 8 // EVAL-FN-NEXT: store i64 17, ptr [[B]], align 8 // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, ptr [[B]], align 8 @@ -168,9 +167,9 @@ consteval Agg is_const() { // EVAL-FN-NEXT: entry: // EVAL-FN-NEXT: [[B:%.*]] = alloca i64, align 8 // EVAL-FN-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_AGG:%.*]], align 8 -// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 +// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 0 // EVAL-FN-NEXT: store i32 5, ptr [[TMP0]], align 8 -// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 +// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_AGG]], ptr [[REF_TMP]], i32 0, i32 1 // EVAL-FN-NEXT: store i64 19, ptr [[TMP1]], align 8 // EVAL-FN-NEXT: store i64 19, ptr [[B]], align 8 // EVAL-FN-NEXT: [[TMP2:%.*]] = load i64, ptr [[B]], align 8 @@ -194,14 +193,14 @@ struct AggCtor { // EVAL-FN-NEXT: [[I:%.*]] = alloca i32, align 4 // EVAL-FN-NEXT: [[C:%.*]] = alloca [[STRUCT_AGGCTOR:%.*]], align 8 // EVAL-FN-NEXT: store i32 2, ptr [[I]], align 4 -// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 0 +// EVAL-FN-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 0 // EVAL-FN-NEXT: store i32 4, ptr [[TMP0]], align 8 -// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 1 +// EVAL-FN-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 1 // EVAL-FN-NEXT: store i64 10, ptr [[TMP1]], align 8 -// EVAL-FN-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 0 +// EVAL-FN-NEXT: [[A:%.*]] = getelementptr inbounds nuw [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 0 // EVAL-FN-NEXT: [[TMP2:%.*]] = load i32, ptr [[A]], align 8 // EVAL-FN-NEXT: [[CONV:%.*]] = sext i32 [[TMP2]] to i64 -// EVAL-FN-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 1 +// EVAL-FN-NEXT: [[B:%.*]] = getelementptr inbounds nuw [[STRUCT_AGGCTOR]], ptr [[C]], i32 0, i32 1 // EVAL-FN-NEXT: [[TMP3:%.*]] = load i64, ptr [[B]], align 8 // EVAL-FN-NEXT: [[ADD:%.*]] = add nsw i64 [[CONV]], [[TMP3]] // EVAL-FN-NEXT: ret i64 [[ADD]] @@ -275,3 +274,26 @@ void f() { // EVAL-FN: call void @_ZN7GH821542S3C2Ei } } + +namespace GH93040 { +struct C { char c = 1; }; +struct Empty { consteval Empty() {} }; +struct Empty2 { consteval Empty2() {} }; +struct Test : C, Empty { + [[no_unique_address]] Empty2 e; +}; +static_assert(sizeof(Test) == 1); +void f() { + Test test; + +// Make sure we don't overwrite the initialization of c. + +// EVAL-FN-LABEL: define {{.*}} void @_ZN7GH930404TestC2Ev +// EVAL-FN: entry: +// EVAL-FN-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 +// EVAL-FN-NEXT: store ptr {{.*}}, ptr [[THIS_ADDR]], align 8 +// EVAL-FN-NEXT: [[THIS:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 +// EVAL-FN-NEXT: call void @_ZN7GH930401CC2Ev(ptr noundef nonnull align 1 dereferenceable(1) [[THIS]]) +// EVAL-FN-NEXT: ret void +} +} |
