On Mon, Sep 23, 2013 at 9:01 PM, Alexey Bataev <[email protected]> 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
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
