================
@@ -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

Reply via email to