]> granicus.if.org Git - clang/commitdiff
[OPENMP] Emit an additional note during analysis of 'if' clause.
authorAlexey Bataev <a.bataev@hotmail.com>
Tue, 15 Sep 2015 17:23:56 +0000 (17:23 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Tue, 15 Sep 2015 17:23:56 +0000 (17:23 +0000)
Patch adds emission of additional note for 'if' clauses with name modifiers in case if 'if' clause without name modified was specified or 'if' clause with the same name modifier was specified.

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

lib/Sema/SemaOpenMP.cpp
test/OpenMP/parallel_for_if_messages.cpp
test/OpenMP/parallel_for_simd_if_messages.cpp
test/OpenMP/parallel_if_messages.cpp
test/OpenMP/parallel_sections_if_messages.cpp
test/OpenMP/target_data_if_messages.cpp
test/OpenMP/target_if_messages.cpp
test/OpenMP/task_if_messages.cpp

index cf7ce23866d5aa6f981bf49fdde21e67679cb013..22170f3dde5dc3337f9ecd8bbb8888a55fb82222 100644 (file)
@@ -2015,6 +2015,7 @@ static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind,
   unsigned NamedModifiersNumber = 0;
   SmallVector<const OMPIfClause *, OMPC_unknown + 1> FoundNameModifiers(
       OMPD_unknown + 1);
+  SmallVector<SourceLocation, 4> NameModifierLoc;
   for (const auto *C : Clauses) {
     if (const auto *IC = dyn_cast_or_null<OMPIfClause>(C)) {
       // At most one if clause without a directive-name-modifier can appear on
@@ -2025,8 +2026,10 @@ static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind,
             << getOpenMPDirectiveName(Kind) << getOpenMPClauseName(OMPC_if)
             << (CurNM != OMPD_unknown) << getOpenMPDirectiveName(CurNM);
         ErrorFound = true;
-      } else if (CurNM != OMPD_unknown)
+      } else if (CurNM != OMPD_unknown) {
+        NameModifierLoc.push_back(IC->getNameModifierLoc());
         ++NamedModifiersNumber;
+      }
       FoundNameModifiers[CurNM] = IC;
       if (CurNM == OMPD_unknown)
         continue;
@@ -2079,6 +2082,9 @@ static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind,
              diag::err_omp_unnamed_if_clause)
           << (TotalAllowedNum > 1) << Values;
     }
+    for (auto Loc : NameModifierLoc) {
+      S.Diag(Loc, diag::note_omp_previous_named_if_clause);
+    }
     ErrorFound = true;
   }
   return ErrorFound;
index 555f3713b511f7b1d252cdf98723875cb188b53e..2b7a5f7e2b3e25512e90f653f1f614f4386f709e 100644 (file)
@@ -46,7 +46,7 @@ int tmain(T argc, S **argv) {
   for (i = 0; i < argc; ++i) foo();
   #pragma omp parallel for if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp parallel for' cannot contain more than one 'if' clause with 'parallel' name modifier}}
   for (i = 0; i < argc; ++i) foo();
-  #pragma omp parallel for if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel for if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   for (i = 0; i < argc; ++i) foo();
 
   return 0;
@@ -90,7 +90,7 @@ int main(int argc, char **argv) {
   for (i = 0; i < argc; ++i) foo();
   #pragma omp parallel for if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp parallel for' cannot contain more than one 'if' clause with 'parallel' name modifier}}
   for (i = 0; i < argc; ++i) foo();
-  #pragma omp parallel for if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel for if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   for (i = 0; i < argc; ++i) foo();
 
   return tmain(argc, argv);
index 7662d0f5e73af875222f5dc7739ded1df7556601..829b825aaf50d2a251341254b586b859d5d7e91a 100644 (file)
@@ -46,7 +46,7 @@ int tmain(T argc, S **argv) {
   for (i = 0; i < argc; ++i) foo();
   #pragma omp parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}
   for (i = 0; i < argc; ++i) foo();
-  #pragma omp parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   for (i = 0; i < argc; ++i) foo();
 
   return 0;
@@ -90,7 +90,7 @@ int main(int argc, char **argv) {
   for (i = 0; i < argc; ++i) foo();
   #pragma omp parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}
   for (i = 0; i < argc; ++i) foo();
-  #pragma omp parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   for (i = 0; i < argc; ++i) foo();
 
   return tmain(argc, argv);
index bba2861e64718a5a9b85dd5df80d2c54a0f0d441..1ffc567b59162e69c8b813a8b1a9a6faeb0084b2 100644 (file)
@@ -28,7 +28,7 @@ int tmain(T argc, S **argv) {
   #pragma omp parallel if(parallel : argc)
   #pragma omp parallel if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp parallel'}}
   #pragma omp parallel if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp parallel' cannot contain more than one 'if' clause with 'parallel' name modifier}}
-  #pragma omp parallel if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return 0;
@@ -53,7 +53,7 @@ int main(int argc, char **argv) {
   #pragma omp parallel if(parallel : argc)
   #pragma omp parallel if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp parallel'}}
   #pragma omp parallel if(parallel : argc) if (parallel:argc)  // expected-error {{directive '#pragma omp parallel' cannot contain more than one 'if' clause with 'parallel' name modifier}}
-  #pragma omp parallel if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return tmain(argc, argv);
index db4d0a1ec71241620f13ae46bea359d002dc9769..c2e3f5ec99bdfba2eb10ef7c14dd2f0be3e348a4 100644 (file)
@@ -75,7 +75,7 @@ int tmain(T argc, S **argv) {
   {
     foo();
   }
-  #pragma omp parallel sections if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel sections if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   {
     foo();
   }
@@ -152,7 +152,7 @@ int main(int argc, char **argv) {
   {
     foo();
   }
-  #pragma omp parallel sections if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp parallel sections if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   {
     foo();
   }
index 38008dd30fe50fd1f2a5c6be9f9dfd7c7dd0963b..77edefa48b8a45782e35e5bc2eb27456eef9fb6e 100644 (file)
@@ -25,7 +25,7 @@ int main(int argc, char **argv) {
   #pragma omp target data if(target data : argc)
   #pragma omp target data if(target data : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp target data'}}
   #pragma omp target data if(target data : argc) if (target data:argc) // expected-error {{directive '#pragma omp target data' cannot contain more than one 'if' clause with 'target data' name modifier}}
-  #pragma omp target data if(target data : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp target data if(target data : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return 0;
index 58a9ba2af891d5d4f7b78bc839d92f919673154e..4ee7302282f6cb618d5867b98606397fdf5fd7a1 100644 (file)
@@ -27,7 +27,7 @@ int tmain(T argc, S **argv) {
   #pragma omp target if(target : argc)
   #pragma omp target if(target : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp target'}}
   #pragma omp target if(target : argc) if (target:argc) // expected-error {{directive '#pragma omp target' cannot contain more than one 'if' clause with 'target' name modifier}}
-  #pragma omp target if(target : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp target if(target : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return 0;
@@ -51,7 +51,7 @@ int main(int argc, char **argv) {
   #pragma omp target if(target : argc)
   #pragma omp target if(target : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp target'}}
   #pragma omp target if(target : argc) if (target:argc) // expected-error {{directive '#pragma omp target' cannot contain more than one 'if' clause with 'target' name modifier}}
-  #pragma omp target if(target : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp target if(target : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return tmain(argc, argv);
index 029e4e1f1b7a6800b3eddc462a8f05598b9a9f00..f3f56d51673a07789524c623e98ef0afdbb1940f 100644 (file)
@@ -27,7 +27,7 @@ int tmain(T argc, S **argv) {
   #pragma omp task if(task : argc)
   #pragma omp task if(task : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp task'}}
   #pragma omp task if(task : argc) if (task:argc) // expected-error {{directive '#pragma omp task' cannot contain more than one 'if' clause with 'task' name modifier}}
-  #pragma omp task if(task : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp task if(task : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return 0;
@@ -51,7 +51,7 @@ int main(int argc, char **argv) {
   #pragma omp task if(task : argc)
   #pragma omp task if(task : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp task'}}
   #pragma omp task if(task : argc) if (task:argc) // expected-error {{directive '#pragma omp task' cannot contain more than one 'if' clause with 'task' name modifier}}
-  #pragma omp task if(task : argc) if (argc) // expected-error {{no more 'if' clause is allowed}}
+  #pragma omp task if(task : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}
   foo();
 
   return tmain(argc, argv);