[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
DavidSpickett added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23148 + GlobalDeclRefChecker Checker; + if (auto *TargetVarDecl = dyn_cast_or_null(TargetDecl)) +Checker.declareTargetInitializer(TargetDecl); FYI I fixed an unused var warning here: https://github.com/llvm/llvm-project/commit/f3ca99a87c566fb5e910071f4cbb474ddb4e7f37 Potentially you could pass the result of the cast into declareTargetInitializer but I don't know enough about the code to change that too. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG453e02ca0903: [OpenMP] Add support for declare target initializer expressions (authored by RitanyaB, committed by Sandeep Kosuri kosu...@pe32.us.cray.com). Changed prior to commit: https://reviews.llvm.org/D146418?vs=526915=527351#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev accepted this revision. ABataev added a comment. This revision is now accepted and ready to land. LG CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 526915. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target + Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23127 + /// OMPDeclareTargetDeclAttr, and has global storage in the DeclVector. Pop + /// each Decl one at a time and use the inherited Visit functions to look for + /// DeclRefExpr. Fix the strange symbol in the comment Comment at: clang/lib/Sema/SemaOpenMP.cpp:23129 + /// DeclRefExpr. + void declTargetInitializer(Decl *TD) { +A = TD->getAttr(); Function names should be verb phrases (as they represent actions), and command-like function should be imperative. (https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly) CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 526694. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target + Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23106 +class GlobalDeclRefChecker final +: public ConstStmtVisitor { + SmallVector DeclVector; Use just a StmtVisitor, if you still dropping const modifier. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23114 + void VisitDeclRefExpr(const DeclRefExpr *Node) { +if (auto *VD = const_cast(dyn_cast(Node->getDecl( { + VD->addAttr(A); remove const_cast Comment at: clang/lib/Sema/SemaOpenMP.cpp:23131 +A = TD->getAttr(); +DeclVector.push_back(dyn_cast(TD)); +while (!DeclVector.empty()) { You don't need to use dyn_cast here, use just cast CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 526665. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target + Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23136 + TargetVarDecl->hasInit() && TargetVarDecl->hasGlobalStorage()) { +if (auto *Ex = TargetVarDecl->getInit()) + Visit(Ex); Better to expand `auto` here Comment at: clang/lib/Sema/SemaOpenMP.cpp:23137 +if (auto *Ex = TargetVarDecl->getInit()) + Visit(Ex); + } Formatting? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 526377. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target + Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23121-23122 + void VisitExpr(const Expr *Ex) { +for (Expr::const_child_iterator it = Ex->child_begin(); + it != Ex->child_end(); ++it) { + Visit(*it); `for (const Expr *Child : Ex->children())` Comment at: clang/lib/Sema/SemaOpenMP.cpp:23138-23143 +if (Ex) { + if (auto *DeclRef = dyn_cast_or_null(Ex)) +VisitDeclRefExpr(DeclRef); + else +VisitExpr(Ex); +} Shall just something like this work here: ``` if (Ex) Visit(Ex); ``` CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 525531. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,112 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target + Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaDecl.cpp:14475-14477 + VD->hasGlobalStorage()) { +ActOnOpenMPDeclareTargetInitializer(D); + } Remove braces Comment at: clang/lib/Sema/SemaOpenMP.cpp:23091 +class GlobalDeclRefChecker final +: public ConstStmtVisitor { Please, add comments, describing the class and its functionality Comment at: clang/lib/Sema/SemaOpenMP.cpp:23095 + Decl *TargetDecl; + void SetTargetDecl(Decl *TD) { TargetDecl = TD; } + bool CheckDeclVector() { return DeclVector.empty(); } setTargetDecl Comment at: clang/lib/Sema/SemaOpenMP.cpp:23096 + void SetTargetDecl(Decl *TD) { TargetDecl = TD; } + bool CheckDeclVector() { return DeclVector.empty(); } + void pushDecl(VarDecl *TargetVarDecl) { DeclVector.push_back(TargetVarDecl); } 1. checkDeclVector 2. const member function Comment at: clang/lib/Sema/SemaOpenMP.cpp:23098 + void pushDecl(VarDecl *TargetVarDecl) { DeclVector.push_back(TargetVarDecl); } + VarDecl *popDecl() { return DeclVector.pop_back_val(); } + const member function Comment at: clang/lib/Sema/SemaOpenMP.cpp:23104 + VD->addAttr(this->TargetDecl->getAttr()); + this->pushDecl(VD); +} Remove this-> Comment at: clang/lib/Sema/SemaOpenMP.cpp:23113 + } + void DeclTargetInitializer(Decl *TD) { +SetTargetDecl(TD); 1. Better to make it static member function. 2. Follow the rules for function names. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 524290. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to'
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/include/clang/Sema/Sema.h:11329 + /// directive. + void ActOnOpenMPImplicitDeclareTarget(Decl *D); + Do I understand correctly, that the variable itself is marked explicitly, but the initializer shall be marked implicitly? If so, please fix the function name Comment at: clang/lib/Sema/SemaOpenMP.cpp:23097-23098 +public: + void SetTargetDecl(Decl *TargetDecl) { this->TargetDecl = TargetDecl; } + bool CheckDeclVector() { return this->DeclVector.empty(); } + void PushDeclVector(VarDecl *TargetVarDecl) { Remove `this->`, where not required. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23099 + bool CheckDeclVector() { return this->DeclVector.empty(); } + void PushDeclVector(VarDecl *TargetVarDecl) { +this->DeclVector.push_back(TargetVarDecl); 1. Wrong function name format. 2. Do you really need to make it public? Hide as much as possible. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23102 + } + VarDecl *PopDeclVector() { return (this->DeclVector.pop_back_val()); } + void VisitDeclRefExpr(const DeclRefExpr *Node) { Same, as for Push Comment at: clang/lib/Sema/SemaOpenMP.cpp:23126-23140 + while (!Checker.CheckDeclVector()) { +VarDecl *TargetVarDecl = Checker.PopDeclVector(); +if (TargetVarDecl->hasAttr()) { + if (TargetVarDecl->hasInit() && TargetVarDecl->hasGlobalStorage()) { +Expr *Ex = TargetVarDecl->getInit(); +if (Ex) { + if (auto *DeclRef = dyn_cast_or_null(Ex)) { Better to hide this in GlobalDeclRefChecker CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 521902. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to'
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23106-23107 + it != Ex->child_end(); ++it) { + if (isa(*it)) +VisitExpr(dyn_cast(*it)); + if (isa(*it)) Why just a regular Visit does not work here? Plus, isa + dyn_cast is weird. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23094-23095 +public: + SmallVector DeclVector; + Decl *TargetDecl; + void VisitDeclRefExpr(const DeclRefExpr *Node) { RitanyaB wrote: > ABataev wrote: > > Why public? > As the data members are accessed from outside the class (in > ActOnOpenMPImplicitDeclareTarget function), I have made them public. If you need them, implement getters for them and make them private. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB added inline comments. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23094-23095 +public: + SmallVector DeclVector; + Decl *TargetDecl; + void VisitDeclRefExpr(const DeclRefExpr *Node) { ABataev wrote: > Why public? As the data members are accessed from outside the class (in ActOnOpenMPImplicitDeclareTarget function), I have made them public. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23107-23110 + if (isa(*it)) +VisitExpr(dyn_cast(*it)); + if (isa(*it)) +Visit(*it); ABataev wrote: > Just Visit(*it)? Or I can call VisitDeclRefExpr directly. Would that be more suitable? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 521014. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to'
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaDecl.cpp:14473 + // directive and has static storage duration. + if (auto *VD = dyn_cast_or_null(D); + LangOpts.OpenMP && VD && VD->hasAttr() && В is already checked that is not nullptr, so just a dyn_cast should be enough Comment at: clang/lib/Sema/SemaOpenMP.cpp:23094-23095 +public: + SmallVector DeclVector; + Decl *TargetDecl; + void VisitDeclRefExpr(const DeclRefExpr *Node) { Why public? Comment at: clang/lib/Sema/SemaOpenMP.cpp:23098 +Decl *DeclVar = nullptr; +if (const VarDecl *VD = dyn_cast(Node->getDecl())) { + DeclVar = (Decl *)Node->getDecl(); const auto *VD Comment at: clang/lib/Sema/SemaOpenMP.cpp:23099 +if (const VarDecl *VD = dyn_cast(Node->getDecl())) { + DeclVar = (Decl *)Node->getDecl(); + DeclVar->addAttr((this->TargetDecl)->getAttr()); Use VD instead of this and drop const Comment at: clang/lib/Sema/SemaOpenMP.cpp:23100-23101 + DeclVar = (Decl *)Node->getDecl(); + DeclVar->addAttr((this->TargetDecl)->getAttr()); + (this->DeclVector).push_back(DeclVar); +} Drop this and extra parens Comment at: clang/lib/Sema/SemaOpenMP.cpp:23107-23110 + if (isa(*it)) +VisitExpr(dyn_cast(*it)); + if (isa(*it)) +Visit(*it); Just Visit(*it)? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 520729. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to'
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Sema/SemaDecl.cpp:14467-14468 + // directive and has static storage duration. + if (D && D->hasAttr() && isa(D)) { +if ((cast(D))->hasGlobalStorage()) + ActOnOpenMPImplicitDeclareTarget(D); if (auto *VD = dyn_cast_or_null(D); LangOpts.OpenMP && VD && VD->hasAttr() && VD->hasGlobalStorage()) Comment at: clang/lib/Sema/SemaOpenMP.cpp:23091 +/// Adds OMPDeclareTargetDeclAttr to the referenced variables. +void *AddOMPDeclareTargetDeclAttr(const DeclRefExpr *DeclRef, Decl *TargetDecl, + SmallVector ) { static void addOMP... Comment at: clang/lib/Sema/SemaOpenMP.cpp:23092 +void *AddOMPDeclareTargetDeclAttr(const DeclRefExpr *DeclRef, Decl *TargetDecl, + SmallVector ) { + Decl *DeclVar = nullptr; SmallVectorImpl Comment at: clang/lib/Sema/SemaOpenMP.cpp:23093-23100 + Decl *DeclVar = nullptr; + if (DeclRef) { +DeclVar = (Decl *)DeclRef->getDecl(); +if (isa(DeclVar)) { + DeclVar->addAttr(TargetDecl->getAttr()); + DeclVector.push_back(DeclVar); +} if (!DeclRef) return; if (auto *VD = dyn_cast_or_null(DeclRef->getDecl()) { DeclVar->addAttr(TargetDecl->getAttr()); DeclVector.push_back(DeclVar); } Comment at: clang/lib/Sema/SemaOpenMP.cpp:23103-23114 +void RecursiveExprReader(Expr *Ex, Decl *TargetDecl, + SmallVector ) { + for (Expr::child_iterator it = Ex->child_begin(); it != Ex->child_end(); + ++it) { +if (const DeclRefExpr *refExpr = dyn_cast(*it)) { + AddOMPDeclareTargetDeclAttr(refExpr, TargetDecl, DeclVector); +} else if (isa(*it)) Use StmtVisitor to implement this correctly. Comment at: clang/lib/Sema/SemaOpenMP.cpp:23120 +void Sema::ActOnOpenMPImplicitDeclareTarget(Decl *TargetDecl) { + SmallVector DeclVector; + DeclVector.push_back(TargetDecl); 100 is to much, use either default value `SmallVector DeclVector;` or smaller value (4 should be enough) Comment at: clang/lib/Sema/SemaOpenMP.cpp:23122 + DeclVector.push_back(TargetDecl); + while (DeclVector.size() != 0) { +Decl *D = DeclVector[DeclVector.size() - 1]; while (!DeclVector.empty()) Comment at: clang/lib/Sema/SemaOpenMP.cpp:23123-23124 + while (DeclVector.size() != 0) { +Decl *D = DeclVector[DeclVector.size() - 1]; +DeclVector.pop_back(); +if (isa(D) && D->hasAttr()) { Decl *D = DeclVector.pop_back_val(); Comment at: clang/lib/Sema/SemaOpenMP.cpp:23125-23126 +DeclVector.pop_back(); +if (isa(D) && D->hasAttr()) { + VarDecl *TargetVarDecl = cast(D); + if (TargetVarDecl->hasInit() && TargetVarDecl->hasGlobalStorage()) { Use dyn_cast instead of isa/cast CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB updated this revision to Diff 516733. RitanyaB added a comment. Adding the support in SemaOpenMP.cpp. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int variable = 100; +static float variable1 = 200; +static float variable2 = variable1; + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int target_var = variable; +float target_var1 = variable2; +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int variable = 100; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable1 = 200; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static float variable2 = variable1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int target_var = variable; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: float target_var1 = variable2; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,42 @@ #pragma omp declare target to(MultiDevTy)
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { RitanyaB wrote: > ABataev wrote: > > RitanyaB wrote: > > > ABataev wrote: > > > > RitanyaB wrote: > > > > > ABataev wrote: > > > > > > It has nothing to do with parsing, sema analysis. Make it part of > > > > > > Sema::checkDeclIsAllowedInOpenMPTarget > > > > > The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is > > > > > incomplete. > > > > > > > > > > ``` > > > > > VarDecl 0x1582b278 col:7 ptr1 'int **' > > > > > `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To > > > > > DT_Any 1 > > > > > `-<<>> > > > > > > > > > > ``` > > > > > At this point, I do not have access to the initializer expression. > > > > > Any suggestions? > > > > The try to do it ActOnOpenMPDeclareTargetName > > > In the absence of a declare target clause, this function is not invoked > > > (in the examples used above, the function is never called). Do you have > > > any suggestions? > > For such decls use checkDeclIsAllowedInOpenMPTarget > As mentioned in my previous comment, the Decl in > checkDeclIsAllowedInOpenMPTarget is not complete and I don't have access to > the initializer expression hence I am unable to move my functionality into > checkDeclIsAllowedInOpenMPTarget. > After ParseDeclarationAfterDeclaratorAndAttributes returns, the Decl is > complete and I can process it accordingly. For decls, explicitly marked as DeclareTarget, use The try to do it ActOnOpenMPDeclareTargetName. For decls, referenced in the initializers, use checkDeclIsAllowedInOpenMPTarget. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB marked an inline comment as not done. RitanyaB added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { ABataev wrote: > RitanyaB wrote: > > ABataev wrote: > > > RitanyaB wrote: > > > > ABataev wrote: > > > > > It has nothing to do with parsing, sema analysis. Make it part of > > > > > Sema::checkDeclIsAllowedInOpenMPTarget > > > > The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is > > > > incomplete. > > > > > > > > ``` > > > > VarDecl 0x1582b278 col:7 ptr1 'int **' > > > > `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To DT_Any > > > > 1 > > > > `-<<>> > > > > > > > > ``` > > > > At this point, I do not have access to the initializer expression. Any > > > > suggestions? > > > The try to do it ActOnOpenMPDeclareTargetName > > In the absence of a declare target clause, this function is not invoked (in > > the examples used above, the function is never called). Do you have any > > suggestions? > For such decls use checkDeclIsAllowedInOpenMPTarget As mentioned in my previous comment, the Decl in checkDeclIsAllowedInOpenMPTarget is not complete and I don't have access to the initializer expression hence I am unable to move my functionality into checkDeclIsAllowedInOpenMPTarget. After ParseDeclarationAfterDeclaratorAndAttributes returns, the Decl is complete and I can process it accordingly. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { RitanyaB wrote: > ABataev wrote: > > RitanyaB wrote: > > > ABataev wrote: > > > > It has nothing to do with parsing, sema analysis. Make it part of > > > > Sema::checkDeclIsAllowedInOpenMPTarget > > > The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is incomplete. > > > > > > ``` > > > VarDecl 0x1582b278 col:7 ptr1 'int **' > > > `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To DT_Any 1 > > > `-<<>> > > > > > > ``` > > > At this point, I do not have access to the initializer expression. Any > > > suggestions? > > The try to do it ActOnOpenMPDeclareTargetName > In the absence of a declare target clause, this function is not invoked (in > the examples used above, the function is never called). Do you have any > suggestions? For such decls use checkDeclIsAllowedInOpenMPTarget Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { ABataev wrote: > RitanyaB wrote: > > ABataev wrote: > > > It has nothing to do with parsing, sema analysis. Make it part of > > > Sema::checkDeclIsAllowedInOpenMPTarget > > The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is incomplete. > > > > ``` > > VarDecl 0x1582b278 col:7 ptr1 'int **' > > `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To DT_Any 1 > > `-<<>> > > > > ``` > > At this point, I do not have access to the initializer expression. Any > > suggestions? > The try to do it ActOnOpenMPDeclareTargetName In the absence of a declare target clause, this function is not invoked (in the examples used above, the function is never called). Do you have any suggestions? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { RitanyaB wrote: > ABataev wrote: > > It has nothing to do with parsing, sema analysis. Make it part of > > Sema::checkDeclIsAllowedInOpenMPTarget > The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is incomplete. > > ``` > VarDecl 0x1582b278 col:7 ptr1 'int **' > `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To DT_Any 1 > `-<<>> > > ``` > At this point, I do not have access to the initializer expression. Any > suggestions? The try to do it ActOnOpenMPDeclareTargetName Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { ABataev wrote: > It has nothing to do with parsing, sema analysis. Make it part of > Sema::checkDeclIsAllowedInOpenMPTarget The Declaration in Sema::checkDeclIsAllowedInOpenMPTarget is incomplete. ``` VarDecl 0x1582b278 col:7 ptr1 'int **' `-OMPDeclareTargetDeclAttr 0x1582b2e0 Implicit MT_To DT_Any 1 `-<<>> ``` At this point, I do not have access to the initializer expression. Any suggestions? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2107 + DeclVar->addAttr(TargetDecl->getAttr()); + ParseImplicitDeclareTargetAttr(DeclVar); +} RitanyaB wrote: > ABataev wrote: > > Try to avoid recursion here > Consider the following example- > > ```static int var1 = 10; > static int *var2 = > #pragma omp declare target > int **ptr1= > #pragma omp end declare target > ``` > In this case, by default ptr1 gets OMPDeclareTargetDeclAttr and the function > mentioned above (ParseImplicitDeclareTargetAttr) would add > OMPDeclareTargetDeclAttr to var2. But, in order to add > OMPDeclareTargetDeclAttr to var1, recursion would be required. I do not ask to remove it, but use extra memory (SamllVector) to save the decls, requiring analysis, and iterate through this vector. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2107 + DeclVar->addAttr(TargetDecl->getAttr()); + ParseImplicitDeclareTargetAttr(DeclVar); +} ABataev wrote: > Try to avoid recursion here Consider the following example- ```static int var1 = 10; static int *var2 = #pragma omp declare target int **ptr1= #pragma omp end declare target ``` In this case, by default ptr1 gets OMPDeclareTargetDeclAttr and the function mentioned above (ParseImplicitDeclareTargetAttr) would add OMPDeclareTargetDeclAttr to var2. But, in order to add OMPDeclareTargetDeclAttr to var1, recursion would be required. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
ABataev added inline comments. Comment at: clang/lib/Parse/ParseDecl.cpp:2093-2115 +void ParseImplicitDeclareTargetAttr(Decl *TargetDecl) { + if (TargetDecl && TargetDecl->hasAttr() && + isa(TargetDecl)) { +VarDecl *TargetVarDecl = cast(TargetDecl); +Expr *Ex = TargetVarDecl->getInit()->IgnoreCasts(); +const DeclRefExpr *DeclRef = nullptr; +if (Ex && isa(Ex) && TargetVarDecl->hasGlobalStorage()) { It has nothing to do with parsing, sema analysis. Make it part of Sema::checkDeclIsAllowedInOpenMPTarget Comment at: clang/lib/Parse/ParseDecl.cpp:2107 + DeclVar->addAttr(TargetDecl->getAttr()); + ParseImplicitDeclareTargetAttr(DeclVar); +} Try to avoid recursion here Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146418/new/ https://reviews.llvm.org/D146418 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D146418: Support for OpenMP 5.0 sec 2.12.7 - Declare Target initializer expressions
RitanyaB created this revision. RitanyaB added reviewers: sandeepkosuri, koops, soumitra, dreachem, ABataev, cchen. Herald added subscribers: sunshaoce, mattd, asavonic, guansong, yaxunl. Herald added a project: All. RitanyaB requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: cfe-commits, jplehr, sstefan1. Herald added a project: clang. Initial support for OpenMP 5.0 declare target "as if" behavior for "initializer expressions". If a variable with static storage duration or a function (except lambda for C++) is referenced in the initializer expression list of a variable with static storage duration that appears as a list item in a to clause on a declare target directive then the name of the referenced variable or function is treated as if it had appeared in a to clause on a declare target directive. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D146418 Files: clang/lib/Parse/ParseDecl.cpp clang/test/OpenMP/declare_target_messages.cpp clang/test/OpenMP/declare_target_variables_ast_print.cpp clang/test/OpenMP/nvptx_target_exceptions_messages.cpp Index: clang/test/OpenMP/nvptx_target_exceptions_messages.cpp === --- clang/test/OpenMP/nvptx_target_exceptions_messages.cpp +++ clang/test/OpenMP/nvptx_target_exceptions_messages.cpp @@ -95,7 +95,7 @@ int (*D)() = C; // expected-note {{used here}} // host-note@-1 {{used here}} #pragma omp end declare target -int foobar3() { throw 1; } +int foobar3() { throw 1; } // expected-error {{cannot use 'throw' with exceptions disabled}} // Check no infinite recursion in deferred diagnostic emitter. long E = (long) Index: clang/test/OpenMP/declare_target_variables_ast_print.cpp === --- /dev/null +++ clang/test/OpenMP/declare_target_variables_ast_print.cpp @@ -0,0 +1,88 @@ +// RUN: %clang_cc1 -w -verify -fopenmp -I %S/Inputs -ast-print %s | FileCheck %s --check-prefix=CHECK +// expected-no-diagnostics + +static int var = 1; + +static int var1 = 10; +static int *var2 = +static int **ptr1 = + +int arr[2] = {1,2}; +int (*arrptr)[2] = + +class declare{ + public: int x; + void print(); +}; +declare obj1; +declare *obj2 = + +struct target{ + int x; + void print(); +}; +static target S; + +#pragma omp declare target +int *ptr = +int ***ptr2 = +int (**ptr3)[2] = +declare **obj3 = +target *S1 = +#pragma omp end declare target +// CHECK: #pragma omp declare target +// CHECK-NEXT: static int var = 1; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int var1 = 10; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int *var2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static int **ptr1 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int arr[2] = {1, 2}; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (*arrptr)[2] = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: class declare { +// CHECK-NEXT: public: +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare obj1; +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare *obj2 = +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: struct target { +// CHECK-NEXT: int x; +// CHECK-NEXT: void print(); +// CHECK-NEXT: }; +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: static target S; +// CHECK-NEXT: #pragma omp end declare target + +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int *ptr = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int ***ptr2 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: int (**ptr3)[2] = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: declare **obj3 = +// CHECK-NEXT: #pragma omp end declare target +// CHECK-NEXT: #pragma omp declare target +// CHECK-NEXT: target *S1 = +// CHECK-NEXT: #pragma omp end declare target Index: clang/test/OpenMP/declare_target_messages.cpp === --- clang/test/OpenMP/declare_target_messages.cpp +++ clang/test/OpenMP/declare_target_messages.cpp @@ -233,6 +233,36 @@ #pragma omp declare target to(MultiDevTy) device_type(host) // omp45-error {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}} omp5-error {{'device_type(host)' does not match previously specified