diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -22986,6 +22986,9 @@ Context, MT, DTCI.DT, IndirectE, IsIndirect, Level, SourceRange(Loc, Loc)); ND->addAttr(A); + if (auto *CD = dyn_cast(ND->getCanonicalDecl())) + if (!CD->hasAttr()) + CD->addAttr(A); if (ASTMutationListener *ML = Context.getASTMutationListener()) ML->DeclarationMarkedOpenMPDeclareTarget(ND, A); checkDeclIsAllowedInOpenMPTarget(nullptr, ND, Loc); @@ -23090,6 +23093,9 @@ DTCI.DT, IndirectE, IsIndirect, Level, SourceRange(DTCI.Loc, DTCI.Loc)); D->addAttr(A); + if (auto *CD = dyn_cast(D->getCanonicalDecl())) + if (!CD->hasAttr()) + CD->addAttr(A); if (ASTMutationListener *ML = Context.getASTMutationListener()) ML->DeclarationMarkedOpenMPDeclareTarget(D, A); } diff --git a/clang/test/AST/dump.cpp b/clang/test/AST/dump.cpp --- a/clang/test/AST/dump.cpp +++ b/clang/test/AST/dump.cpp @@ -79,11 +79,32 @@ } #pragma omp end declare target -// CHECK: `-FunctionDecl {{.+}} line:[[@LINE-6]]:5 bar 'int ()' -// CHECK-NEXT: |-CompoundStmt {{.+}} -// CHECK-NEXT: | |-DeclStmt {{.+}} -// CHECK-NEXT: | | `-VarDecl {{.+}} col:7 used f 'int' -// CHECK-NEXT: | `-ReturnStmt {{.+}} -// CHECK-NEXT: | `-ImplicitCastExpr {{.+}} 'int' -// CHECK-NEXT: | `-DeclRefExpr {{.+}} 'int' lvalue Var {{.+}} 'f' 'int' -// CHECK-NEXT: `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 1 +// CHECK: |-FunctionDecl {{.+}} line:[[@LINE-6]]:5 bar 'int ()' +// CHECK-NEXT: | |-CompoundStmt {{.+}} +// CHECK-NEXT: | | |-DeclStmt {{.+}} +// CHECK-NEXT: | | | `-VarDecl {{.+}} col:7 used f 'int' +// CHECK-NEXT: | | `-ReturnStmt {{.+}} +// CHECK-NEXT: | | `-ImplicitCastExpr {{.+}} 'int' +// CHECK-NEXT: | | `-DeclRefExpr {{.+}} 'int' lvalue Var {{.+}} 'f' 'int' +// CHECK-NEXT: | `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 1 + +int dx; + +extern int dx; +#pragma omp declare target to(dx) + +// CHECK: |-VarDecl {{.+}} col:5 dx 'int' +// CHECK-NEXT: | `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 4294967295 +// CHECK: |-VarDecl {{.+}} prev {{.+}} col:12 dx 'int' extern +// CHECK-NEXT: | `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 4294967295 + +int dy; + +#pragma omp begin declare target +extern int dy; +#pragma omp end declare target + +// CHECK: |-VarDecl {{.+}} col:5 dy 'int' +// CHECK-NEXT: | `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 1 +// CHECK: `-VarDecl {{.+}} prev {{.+}} col:12 dy 'int' extern +// CHECK-NEXT: `-OMPDeclareTargetDeclAttr {{.+}} Implicit MT_To DT_Any 1