[OPENMP]Fix PR37283: Assertion failure on openmp task with by reference
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 13 Mar 2019 20:46:28 +0000 (20:46 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 13 Mar 2019 20:46:28 +0000 (20:46 +0000)
array.

If the firstprivate variable is a reference, we may incorrectly classify
the kind of the private copy. Use the type of the private copy instead
of the original shared variable.

llvm-svn: 356098

clang/lib/CodeGen/CGOpenMPRuntime.cpp
clang/test/OpenMP/task_firstprivate_codegen.cpp

index 4ed63e0..f3a0f0d 100644 (file)
@@ -4705,7 +4705,7 @@ static void emitPrivatesInit(CodeGenFunction &CGF,
         // Check if the variable is the target-based BasePointersArray,
         // PointersArray or SizesArray.
         LValue SharedRefLValue;
-        QualType Type = OriginalVD->getType();
+        QualType Type = PrivateLValue.getType();
         const FieldDecl *SharedField = CapturesInfo.lookup(OriginalVD);
         if (IsTargetTask && !SharedField) {
           assert(isa<ImplicitParamDecl>(OriginalVD) &&
index 09b1dea..dc0ba8a 100644 (file)
@@ -473,12 +473,13 @@ struct St {
   ~St() {}
 };
 
-void array_func(int n, float a[n], St s[2]) {
+void array_func(int n, float a[n], St s[2], int(& p)[1]) {
 // ARRAY: call i8* @__kmpc_omp_task_alloc(
 // ARRAY: call i32 @__kmpc_omp_task(
 // ARRAY: store float** %{{.+}}, float*** %{{.+}},
 // ARRAY: store %struct.St** %{{.+}}, %struct.St*** %{{.+}},
-#pragma omp task firstprivate(a, s)
+// ARRAY: store [1 x i32]* %{{.+}}, [1 x i32]** %{{.+}},
+#pragma omp task firstprivate(a, s, p)
   ;
 }
 #endif