Author: abataev Date: Tue Oct 3 13:00:00 2017 New Revision: 314833 URL: http://llvm.org/viewvc/llvm-project?rev=314833&view=rev Log: [OPENMP] Allow use of declare target directive inside struct declaration.
Patch allows using of the `#pragma omp declare target`| `#pragma omp end declare target` directives inside the structures if we need to mark as declare target only some static members. Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/declare_target_ast_print.cpp cfe/trunk/test/OpenMP/declare_target_messages.cpp Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=314833&r1=314832&r2=314833&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original) +++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Tue Oct 3 13:00:00 2017 @@ -760,9 +760,17 @@ Parser::DeclGroupPtrTy Parser::ParseOpen DKind = ParseOpenMPDirectiveKind(*this); while (DKind != OMPD_end_declare_target && DKind != OMPD_declare_target && Tok.isNot(tok::eof) && Tok.isNot(tok::r_brace)) { - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX11Attributes(attrs); - ParseExternalDeclaration(attrs); + DeclGroupPtrTy Ptr; + // Here we expect to see some function declaration. + if (AS == AS_none) { + assert(TagType == DeclSpec::TST_unspecified); + MaybeParseCXX11Attributes(Attrs); + ParsingDeclSpec PDS(*this); + Ptr = ParseExternalDeclaration(Attrs, &PDS); + } else { + Ptr = + ParseCXXClassMemberDeclarationWithPragmas(AS, Attrs, TagType, Tag); + } if (Tok.isAnnotation() && Tok.is(tok::annot_pragma_openmp)) { TentativeParsingAction TPA(*this); ConsumeAnnotationToken(); Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=314833&r1=314832&r2=314833&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Tue Oct 3 13:00:00 2017 @@ -11914,7 +11914,11 @@ bool Sema::ActOnStartOpenMPDeclareTarget DeclContext *CurLexicalContext = getCurLexicalContext(); if (!CurLexicalContext->isFileContext() && !CurLexicalContext->isExternCContext() && - !CurLexicalContext->isExternCXXContext()) { + !CurLexicalContext->isExternCXXContext() && + !isa<CXXRecordDecl>(CurLexicalContext) && + !isa<ClassTemplateDecl>(CurLexicalContext) && + !isa<ClassTemplatePartialSpecializationDecl>(CurLexicalContext) && + !isa<ClassTemplateSpecializationDecl>(CurLexicalContext)) { Diag(Loc, diag::err_omp_region_not_file_context); return false; } Modified: cfe/trunk/test/OpenMP/declare_target_ast_print.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_target_ast_print.cpp?rev=314833&r1=314832&r2=314833&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_target_ast_print.cpp (original) +++ cfe/trunk/test/OpenMP/declare_target_ast_print.cpp Tue Oct 3 13:00:00 2017 @@ -124,6 +124,33 @@ void f3() { // CHECK: void f3() // CHECK: #pragma omp end declare target +struct SSSt { +#pragma omp declare target + static int a; + int b; +#pragma omp end declare target +}; + +// CHECK: struct SSSt { +// CHECK: #pragma omp declare target +// CHECK: static int a; +// CHECK: #pragma omp end declare target +// CHECK: int b; + +template <class T> +struct SSSTt { +#pragma omp declare target + static T a; + int b; +#pragma omp end declare target +}; + +// CHECK: template <class T> struct SSSTt { +// CHECK: #pragma omp declare target +// CHECK: static T a; +// CHECK: #pragma omp end declare target +// CHECK: int b; + int main (int argc, char **argv) { foo(); foo_c(); Modified: cfe/trunk/test/OpenMP/declare_target_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_target_messages.cpp?rev=314833&r1=314832&r2=314833&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_target_messages.cpp (original) +++ cfe/trunk/test/OpenMP/declare_target_messages.cpp Tue Oct 3 13:00:00 2017 @@ -73,9 +73,9 @@ int C::method() { } struct S { -#pragma omp declare target // expected-error {{directive must be at file or namespace scope}} +#pragma omp declare target int v; -#pragma omp end declare target // expected-error {{unexpected OpenMP directive '#pragma omp end declare target'}} +#pragma omp end declare target }; int main (int argc, char **argv) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits