[PATCH] [OPENMP] Bug fixes and improvements, part 2

Eli Friedman eli.friedman at gmail.com
Tue Sep 24 14:55:42 PDT 2013


On Mon, Sep 23, 2013 at 9:01 PM, Alexey Bataev <a.bataev at hotmail.com> wrote:

> Hi doug.gregor, eli.friedman, gribozavr, cbergstrom, hfinkel, wwwwpan,
>
> Improved variable lookup procedure for threadprivate variables.
>
> http://llvm-reviews.chandlerc.com/D1746
>
> Files:
>   test/OpenMP/threadprivate_ast_print.cpp
>   test/OpenMP/threadprivate_messages.cpp
>   lib/Sema/SemaOpenMP.cpp
>   lib/AST/DeclPrinter.cpp
>
> Index: test/OpenMP/threadprivate_ast_print.cpp
> ===================================================================
> --- test/OpenMP/threadprivate_ast_print.cpp
> +++ test/OpenMP/threadprivate_ast_print.cpp
> @@ -15,7 +15,7 @@
>   static int b;
>  // CHECK: static int b;
>  #pragma omp threadprivate(b)
> -// CHECK-NEXT: #pragma omp threadprivate(b)
> +// CHECK-NEXT: #pragma omp threadprivate(St1::b)
>  } d;
>
>  int a, b;
> @@ -38,6 +38,15 @@
>  //CHECK-NEXT: static T v;
>  //CHECK-NEXT: #pragma omp threadprivate(v)
>
> +namespace ns{
> +  int a;
> +}
> +// CHECK: namespace ns {
> +// CHECK-NEXT: int a;
> +// CHECK-NEXT: }
> +#pragma omp threadprivate(ns::a)
> +// CHECK-NEXT: #pragma omp threadprivate(ns::a)
> +
>  int main () {
>    static int a;
>  // CHECK: static int a;
> Index: test/OpenMP/threadprivate_messages.cpp
> ===================================================================
> --- test/OpenMP/threadprivate_messages.cpp
> +++ test/OpenMP/threadprivate_messages.cpp
> @@ -60,12 +60,12 @@
>  #pragma omp threadprivate (g)
>
>  namespace ns {
> -  int m; // expected-note 2 {{'m' defined here}}
> +  int m;
>  #pragma omp threadprivate (m)
>  }
>  #pragma omp threadprivate (m) // expected-error {{use of undeclared
> identifier 'm'}}
> -#pragma omp threadprivate (ns::m) // expected-error {{'#pragma omp
> threadprivate' must appear in the scope of the 'ns::m' variable
> declaration}}
> -#pragma omp threadprivate (ns:m) // expected-error {{unexpected ':' in
> nested name specifier; did you mean '::'?}} expected-error {{'#pragma omp
> threadprivate' must appear in the scope of the 'ns::m' variable
> declaration}}
> +#pragma omp threadprivate (ns::m) // expected-error {{'#pragma omp
> threadprivate' must precede all references to variable 'ns::m'}}
> +#pragma omp threadprivate (ns:m) // expected-error {{unexpected ':' in
> nested name specifier; did you mean '::'?}} expected-error {{'#pragma omp
> threadprivate' must precede all references to variable 'ns::m'}}
>
>  const int h = 12;
>  const volatile int i = 10;
> Index: lib/Sema/SemaOpenMP.cpp
> ===================================================================
> --- lib/Sema/SemaOpenMP.cpp
> +++ lib/Sema/SemaOpenMP.cpp
> @@ -428,7 +428,9 @@
>    //   A threadprivate directive for static block-scope variables must
> appear
>    //   in the scope of the variable and not in a nested scope.
>    NamedDecl *ND = cast<NamedDecl>(VD);
> -  if (!isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
> +  if ((!getCurLexicalContext()->isFileContext() ||
> +       !VD->getDeclContext()->isFileContext()) &&
> +       !isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
>      Diag(Id.getLoc(), diag::err_omp_var_scope)
>        << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
>      bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
>

The comments before this check list four distinct rules for different kinds
of variables.  Please implement them explicitly.

-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130924/b8c2fa5b/attachment.html>


More information about the cfe-commits mailing list