[OPENMP] Do not emit warning for implicitly declared target functions.
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 2 May 2018 17:39:00 +0000 (17:39 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 2 May 2018 17:39:00 +0000 (17:39 +0000)
Since upcoming OpenMP 5.0 functions can be mapped implicitly as declare
target and we should not emit warnings for such functions.

llvm-svn: 331377

clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/declare_target_messages.cpp

index 896954f..832f03b 100644 (file)
@@ -12964,21 +12964,23 @@ static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR,
   if (LD && !LD->hasAttr<OMPDeclareTargetDeclAttr>() &&
       ((isa<VarDecl>(LD) && !isa<ParmVarDecl>(LD)) || isa<FunctionDecl>(LD))) {
     // Outlined declaration is not declared target.
-    if (LD->isOutOfLine()) {
-      SemaRef.Diag(LD->getLocation(), diag::warn_omp_not_in_target_context);
-      SemaRef.Diag(SL, diag::note_used_here) << SR;
-    } else {
-      const DeclContext *DC = LD->getDeclContext();
-      while (DC &&
-             (!isa<FunctionDecl>(DC) ||
-              !cast<FunctionDecl>(DC)->hasAttr<OMPDeclareTargetDeclAttr>()))
-        DC = DC->getParent();
-      if (DC)
-        return;
+    if (!isa<FunctionDecl>(LD)) {
+      if (LD->isOutOfLine()) {
+        SemaRef.Diag(LD->getLocation(), diag::warn_omp_not_in_target_context);
+        SemaRef.Diag(SL, diag::note_used_here) << SR;
+      } else {
+        const DeclContext *DC = LD->getDeclContext();
+        while (DC &&
+               (!isa<FunctionDecl>(DC) ||
+                !cast<FunctionDecl>(DC)->hasAttr<OMPDeclareTargetDeclAttr>()))
+          DC = DC->getParent();
+        if (DC)
+          return;
 
-      // Is not declared in target context.
-      SemaRef.Diag(LD->getLocation(), diag::warn_omp_not_in_target_context);
-      SemaRef.Diag(SL, diag::note_used_here) << SR;
+        // Is not declared in target context.
+        SemaRef.Diag(LD->getLocation(), diag::warn_omp_not_in_target_context);
+        SemaRef.Diag(SL, diag::note_used_here) << SR;
+      }
     }
     // Mark decl as declared target to prevent further diagnostic.
     auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(
index 72ea33c..c8e73f6 100644 (file)
@@ -19,7 +19,7 @@ void f();
 
 #pragma omp declare target link(foo2) // expected-error {{use of undeclared identifier 'foo2'}}
 
-void c(); // expected-warning {{declaration is not declared in any declare target region}}
+void c();
 
 void func() {} // expected-note {{'func' defined here}}
 
@@ -98,7 +98,7 @@ void foo(int p) {
   g += object.method1();
   g += object1.method() + p;
   f();
-  c(); // expected-note {{used here}}
+  c();
 }
 #pragma omp declare target // expected-error {{expected '#pragma omp end declare target'}}
 void foo1() {}