================ @@ -0,0 +1,419 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --clang-args ['-fopenmp', '-std=c++20'] --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ +// RUN: %clang_cc1 -verify -fopenmp -std=c++20 -emit-llvm %s -o - | FileCheck %s +// expected-no-diagnostics +#ifndef HEADER +#define HEADER + +enum a {}; +class b { +public: + b(int); +}; +struct c { + typedef b h; +}; +using e = b; +using f = b; +template <typename> class g {}; +template <typename l> class i { +public: + using j = long; + l::h aa; + i(g<l>) : aa{0} {} + bool operator!=(i); + void operator++(); + auto operator*() { + int k; + return k; + } + j operator-(i); + void operator+=(j); +}; +class o : public g<c> { +public: + using p = int; + o(p, e, f); +}; +// CHECK1-LABEL: @_Z5begin1gI1cE( +// CHECK1-NEXT: entry: +// CHECK1-NEXT: [[RETVAL:%.*]] = alloca [[CLASS_I:%.*]], align 1 +// CHECK1-NEXT: [[AC:%.*]] = alloca [[CLASS_G:%.*]], align 1 +// CHECK1-NEXT: [[AGG_TMP:%.*]] = alloca [[CLASS_G]], align 1 +// CHECK1-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[CLASS_G]], ptr [[AC]], i32 0, i32 0 +// CHECK1-NEXT: store i8 [[AC_COERCE:%.*]], ptr [[COERCE_DIVE]], align 1 +// CHECK1-NEXT: [[COERCE_DIVE1:%.*]] = getelementptr inbounds nuw [[CLASS_G]], ptr [[AGG_TMP]], i32 0, i32 0 +// CHECK1-NEXT: [[TMP0:%.*]] = load i8, ptr [[COERCE_DIVE1]], align 1 +// CHECK1-NEXT: [[CALL:%.*]] = call noundef ptr @_ZN1iI1cEC1E1gIS0_E(ptr noundef nonnull align 1 dereferenceable(1) [[RETVAL]], i8 [[TMP0]]) +// CHECK1-NEXT: [[COERCE_DIVE2:%.*]] = getelementptr inbounds nuw [[CLASS_I]], ptr [[RETVAL]], i32 0, i32 0 +// CHECK1-NEXT: [[TMP1:%.*]] = load i8, ptr [[COERCE_DIVE2]], align 1 +// CHECK1-NEXT: ret i8 [[TMP1]] +auto begin(g<c> ac) { + i ad(ac); + return ad; +} +template <typename l> auto end(l ac) { + i ad(ac); + return ad; +} +using m = b; +using n = b; +class D { +protected: + D(int, int, n, m, a); +}; +class H : D { + int af; + o t; + +public: + a v; + int q; +// CHECK1-LABEL: @_ZN1HC1E1bS0_( +// CHECK1-NEXT: entry: +// CHECK1-NEXT: [[AG:%.*]] = alloca [[CLASS_B:%.*]], align 1 +// CHECK1-NEXT: [[R:%.*]] = alloca [[CLASS_B]], align 1 +// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 +// CHECK1-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds nuw [[CLASS_B]], ptr [[AG]], i32 0, i32 0 +// CHECK1-NEXT: store i8 [[AG_COERCE:%.*]], ptr [[COERCE_DIVE]], align 1 +// CHECK1-NEXT: [[COERCE_DIVE1:%.*]] = getelementptr inbounds nuw [[CLASS_B]], ptr [[R]], i32 0, i32 0 +// CHECK1-NEXT: store i8 [[R_COERCE:%.*]], ptr [[COERCE_DIVE1]], align 1 +// CHECK1-NEXT: store ptr [[THIS:%.*]], ptr [[THIS_ADDR]], align 8 +// CHECK1-NEXT: [[THIS2:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 +// CHECK1-NEXT: [[COERCE_DIVE3:%.*]] = getelementptr inbounds nuw [[CLASS_B]], ptr [[AG]], i32 0, i32 0 +// CHECK1-NEXT: [[TMP0:%.*]] = load i8, ptr [[COERCE_DIVE3]], align 1 +// CHECK1-NEXT: [[COERCE_DIVE4:%.*]] = getelementptr inbounds nuw [[CLASS_B]], ptr [[R]], i32 0, i32 0 +// CHECK1-NEXT: [[TMP1:%.*]] = load i8, ptr [[COERCE_DIVE4]], align 1 +// CHECK1-NEXT: [[CALL:%.*]] = call noundef ptr @_ZN1HC2E1bS0_(ptr noundef nonnull align 4 dereferenceable(16) [[THIS2]], i8 [[TMP0]], i8 [[TMP1]]) +// CHECK1-NEXT: ret ptr [[THIS2]] + H(n ag, m r) : D(0, 0, ag, r, a{}), af(0), t{o(0, 0, 0)}, q(0), v() {} +// CHECK1-LABEL: @_ZN1H1sEv( +// CHECK1-NEXT: entry: +// CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca ptr, align 8 +// CHECK1-NEXT: store ptr [[THIS:%.*]], ptr [[THIS_ADDR]], align 8 +// CHECK1-NEXT: [[THIS1:%.*]] = load ptr, ptr [[THIS_ADDR]], align 8 +// CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[THIS1]], i64 4 +// CHECK1-NEXT: ret void + auto s() { return t; } +}; +template <typename> class F { void ak(H &) const; }; +template <typename am> void F<am>::ak(H &an) const { + auto ao = an.s(); + auto ap = [ao](H) { +#pragma omp for ---------------- alexey-bataev wrote:
1. hmm, the subject says about parallel for, but here it is only for. Why is that? 2. Need to simplify the test https://github.com/llvm/llvm-project/pull/146772 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits