]> granicus.if.org Git - clang/commitdiff
[OPENMP] Prohibit variably modified types in 'copyprivate' clause.
authorAlexey Bataev <a.bataev@hotmail.com>
Tue, 19 May 2015 08:19:24 +0000 (08:19 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Tue, 19 May 2015 08:19:24 +0000 (08:19 +0000)
Runtime does not allow to work with VLAs in copyprivate clause.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237672 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaOpenMP.cpp
test/OpenMP/single_copyprivate_messages.cpp

index 2f419215782b3f41722b9d08e8827da55f104f47..91575b8b3674c40a541075a56bbec006504505c1 100644 (file)
@@ -7418,6 +7418,8 @@ def err_omp_no_dsa_for_variable : Error<
   "variable %0 must have explicitly specified data sharing attributes">;
 def err_omp_wrong_dsa : Error<
   "%0 variable cannot be %1">;
+def err_omp_variably_modified_type_not_supported : Error<
+  "arguments of OpenMP clause '%0' cannot be of variably-modified type %1">;
 def note_omp_explicit_dsa : Note<
   "defined as %0">;
 def note_omp_predetermined_dsa : Note<
index 9d45f8213ce2787576fff5a111011cfe58e8bc70..e34fb2bc7d6682894f89caf5c3a5771a21d511b2 100644 (file)
@@ -6195,6 +6195,17 @@ OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
       }
     }
 
+    // Variably modified types are not supported.
+    if (Type->isVariablyModifiedType()) {
+      Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
+          << getOpenMPClauseName(OMPC_copyprivate) << Type;
+      bool IsDecl =
+          VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
+      Diag(VD->getLocation(),
+           IsDecl ? diag::note_previous_decl : diag::note_defined_here)
+          << VD;
+      continue;
+    }
     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
     //  A variable of class type (or array thereof) that appears in a
     //  copyin clause requires an accessible, unambiguous copy assignment
index cb31f0cd10719185309a3922dd20a4afff5086e8..a2ffdef033d5406a8b12c694437ecc83e2a501e3 100644 (file)
@@ -105,8 +105,8 @@ T tmain(T argc, C **argv) {
   return T();
 }
 
-void bar(S4 a[2]) {
-#pragma omp single copyprivate(a) // expected-error {{'operator=' is a private member of 'S4'}}
+void bar(S4 a[2], int n, int b[n]) { // expected-note {{'b' defined here}}
+#pragma omp single copyprivate(a, b) // expected-error {{'operator=' is a private member of 'S4'}} expected-error {{arguments of OpenMP clause 'copyprivate' cannot be of variably-modified type 'int [n]'}}
     foo();
 }