Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -6683,6 +6683,7 @@ D.setFunctionDefinitionKind(FunctionDefinitionKind::Declaration); Decl *BaseD = HandleDeclarator(S, D, TemplateParamLists); BaseD->setImplicit(true); + BaseD->setIsUsed(); if (auto *BaseTemplD = dyn_cast(BaseD)) Bases.push_back(BaseTemplD->getTemplatedDecl()); else Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_11.c =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_11.c +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_11.c @@ -179,7 +179,7 @@ // CXX-NEXT: | | `-ReturnStmt [[ADDR_27:0x[a-z0-9]*]] // CXX-NEXT: | | `-IntegerLiteral [[ADDR_28:0x[a-z0-9]*]] 'int' 0 // CXX-NEXT: | `-AlwaysInlineAttr [[ADDR_29:0x[a-z0-9]*]] always_inline -// CXX-NEXT: |-FunctionDecl [[ADDR_30:0x[a-z0-9]*]] line:27:5 invalid also_after1 'int ({{.*}})' +// CXX-NEXT: |-FunctionDecl [[ADDR_30:0x[a-z0-9]*]] line:27:5 used invalid also_after1 'int ({{.*}})' // CXX-NEXT: | |-CompoundStmt [[ADDR_31:0x[a-z0-9]*]] // CXX-NEXT: | | `-ReturnStmt [[ADDR_32:0x[a-z0-9]*]] // CXX-NEXT: | | `-IntegerLiteral [[ADDR_33:0x[a-z0-9]*]] 'int' 1 @@ -197,7 +197,7 @@ // CXX-NEXT: | | `-IntegerLiteral [[ADDR_43:0x[a-z0-9]*]] 'int' 3 // CXX-NEXT: | `-OMPDeclareVariantAttr [[ADDR_44:0x[a-z0-9]*]] <> Inherited Implicit implementation={vendor(llvm)} // CXX-NEXT: | `-DeclRefExpr [[ADDR_16]] 'int ({{.*}}) __attribute__((nothrow))' Function [[ADDR_17]] 'also_after3[implementation={vendor(llvm)}]' 'int ({{.*}}) __attribute__((nothrow))' -// CXX-NEXT: |-FunctionDecl [[ADDR_45:0x[a-z0-9]*]] line:36:5 invalid also_after4 'int ({{.*}})' +// CXX-NEXT: |-FunctionDecl [[ADDR_45:0x[a-z0-9]*]] line:36:5 used invalid also_after4 'int ({{.*}})' // CXX-NEXT: | |-CompoundStmt [[ADDR_46:0x[a-z0-9]*]] // CXX-NEXT: | | `-ReturnStmt [[ADDR_47:0x[a-z0-9]*]] // CXX-NEXT: | | `-IntegerLiteral [[ADDR_48:0x[a-z0-9]*]] 'int' 4 Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_7.c =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_7.c +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_7.c @@ -41,7 +41,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_4:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_5:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_6:0x[a-z0-9]*]] 'int' 1 -// CHECK-NEXT: |-FunctionDecl [[ADDR_7:0x[a-z0-9]*]] col:5 implicit OK_2 'int ({{.*}})' +// CHECK-NEXT: |-FunctionDecl [[ADDR_7:0x[a-z0-9]*]] col:5 implicit used OK_2 'int ({{.*}})' // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_8:0x[a-z0-9]*]] <> Implicit implementation={vendor(intel)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_9:0x[a-z0-9]*]] 'int ({{.*}})' Function [[ADDR_10:0x[a-z0-9]*]] 'OK_2[implementation={vendor(intel)}]' 'int ({{.*}})' // CHECK-NEXT: |-FunctionDecl [[ADDR_10]] line:11:1 OK_2[implementation={vendor(intel)}] 'int ({{.*}})' Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_namespace_1.cpp =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_namespace_1.cpp +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_namespace_1.cpp @@ -82,7 +82,7 @@ // CHECK-NEXT: | | `-IntegerLiteral [[ADDR_17:0x[a-z0-9]*]] 'int' 2 // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_18:0x[a-z0-9]*]] <> Implicit implementation={vendor(llvm)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_19:0x[a-z0-9]*]] 'int ({{.*}})' Function [[ADDR_20:0x[a-z0-9]*]] 'baz[implementation={vendor(llvm)}]' 'int ({{.*}})' -// CHECK-NEXT: |-FunctionDecl [[ADDR_21:0x[a-z0-9]*]] col:5 implicit foo 'int ({{.*}})' +// CHECK-NEXT: |-FunctionDecl [[ADDR_21:0x[a-z0-9]*]] col:5 implicit used foo 'int ({{.*}})' // CHECK-NEXT: | |-OMPDeclareVariantAttr [[ADDR_22:0x[a-z0-9]*]] <> Implicit implementation={vendor(llvm)} // CHECK-NEXT: | | `-DeclRefExpr [[ADDR_23:0x[a-z0-9]*]] 'int ({{.*}})' Function [[ADDR_24:0x[a-z0-9]*]] 'foo[implementation={vendor(llvm)}]' 'int ({{.*}})' // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_25:0x[a-z0-9]*]] <> Implicit implementation={vendor(llvm)} Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_template_1.cpp =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_template_1.cpp +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_template_1.cpp @@ -58,14 +58,14 @@ // CHECK-NEXT: | | `-IntegerLiteral [[ADDR_3:0x[a-z0-9]*]] 'int' 1 // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_4:0x[a-z0-9]*]] <> Implicit implementation={vendor(score(0): llvm)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_5:0x[a-z0-9]*]] 'int ({{.*}})' Function [[ADDR_6:0x[a-z0-9]*]] 'also_before[implementation={vendor(llvm)}]' 'int ({{.*}})' -// CHECK-NEXT: |-FunctionDecl [[ADDR_7:0x[a-z0-9]*]] col:5 implicit also_after 'int ({{.*}})' +// CHECK-NEXT: |-FunctionDecl [[ADDR_7:0x[a-z0-9]*]] col:5 implicit used also_after 'int ({{.*}})' // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_8:0x[a-z0-9]*]] <> Implicit implementation={vendor(score(100): llvm)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_9:0x[a-z0-9]*]] 'int ({{.*}})' Function [[ADDR_10:0x[a-z0-9]*]] 'also_after[implementation={vendor(llvm)}]' 'int ({{.*}})' // CHECK-NEXT: |-FunctionDecl [[ADDR_10]] line:10:1 also_after[implementation={vendor(llvm)}] 'int ({{.*}})' // CHECK-NEXT: | `-CompoundStmt [[ADDR_11:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_12:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_13:0x[a-z0-9]*]] 'int' 2 -// CHECK-NEXT: |-FunctionDecl [[ADDR_14:0x[a-z0-9]*]] col:5 implicit also_after 'int (int)' +// CHECK-NEXT: |-FunctionDecl [[ADDR_14:0x[a-z0-9]*]] col:5 implicit used also_after 'int (int)' // CHECK-NEXT: | |-ParmVarDecl [[ADDR_15:0x[a-z0-9]*]] col:19 'int' // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_16:0x[a-z0-9]*]] <> Implicit implementation={vendor(score(100): llvm)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_17:0x[a-z0-9]*]] 'int (int)' Function [[ADDR_18:0x[a-z0-9]*]] 'also_after[implementation={vendor(llvm)}]' 'int (int)' @@ -87,13 +87,13 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_30:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_31:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_32:0x[a-z0-9]*]] 'int' 0 -// CHECK-NEXT: |-FunctionDecl [[ADDR_33:0x[a-z0-9]*]] prev [[ADDR_7]] line:26:5 also_after 'int ({{.*}})' +// CHECK-NEXT: |-FunctionDecl [[ADDR_33:0x[a-z0-9]*]] prev [[ADDR_7]] line:26:5 used also_after 'int ({{.*}})' // CHECK-NEXT: | |-CompoundStmt [[ADDR_34:0x[a-z0-9]*]] // CHECK-NEXT: | | `-ReturnStmt [[ADDR_35:0x[a-z0-9]*]] // CHECK-NEXT: | | `-IntegerLiteral [[ADDR_36:0x[a-z0-9]*]] 'int' 4 // CHECK-NEXT: | `-OMPDeclareVariantAttr [[ADDR_37:0x[a-z0-9]*]] <> Inherited Implicit implementation={vendor(score(100): llvm)} // CHECK-NEXT: | `-DeclRefExpr [[ADDR_9]] 'int ({{.*}})' Function [[ADDR_10]] 'also_after[implementation={vendor(llvm)}]' 'int ({{.*}})' -// CHECK-NEXT: |-FunctionDecl [[ADDR_38:0x[a-z0-9]*]] prev [[ADDR_14]] line:29:5 also_after 'int (int)' +// CHECK-NEXT: |-FunctionDecl [[ADDR_38:0x[a-z0-9]*]] prev [[ADDR_14]] line:29:5 used also_after 'int (int)' // CHECK-NEXT: | |-ParmVarDecl [[ADDR_39:0x[a-z0-9]*]] col:19 'int' // CHECK-NEXT: | |-CompoundStmt [[ADDR_40:0x[a-z0-9]*]] // CHECK-NEXT: | | `-ReturnStmt [[ADDR_41:0x[a-z0-9]*]] Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_template_2.cpp =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_template_2.cpp +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_template_2.cpp @@ -101,7 +101,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_38:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_39:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_36]] 'int' 0 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_40:0x[a-z0-9]*]] col:5 implicit also_after +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_40:0x[a-z0-9]*]] col:5 implicit used also_after // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_41:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | |-FunctionDecl [[ADDR_42:0x[a-z0-9]*]] col:5 also_after 'int (T)' // CHECK-NEXT: | | |-ParmVarDecl [[ADDR_43:0x[a-z0-9]*]] col:17 'T' @@ -130,7 +130,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_61:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_62:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_59]] 'int' 0 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_63:0x[a-z0-9]*]] col:5 implicit also_after_mismatch +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_63:0x[a-z0-9]*]] col:5 implicit used also_after_mismatch // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_64:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_65:0x[a-z0-9]*]] col:32 referenced typename depth 0 index 1 Q // CHECK-NEXT: | `-FunctionDecl [[ADDR_66:0x[a-z0-9]*]] col:5 also_after_mismatch 'int (T, Q)' @@ -147,7 +147,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_73:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_74:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_75:0x[a-z0-9]*]] 'int' 2 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_76:0x[a-z0-9]*]] col:5 implicit also_before_mismatch +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_76:0x[a-z0-9]*]] col:5 implicit used also_before_mismatch // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_77:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | `-FunctionDecl [[ADDR_78:0x[a-z0-9]*]] col:5 also_before_mismatch 'int (T)' // CHECK-NEXT: | |-ParmVarDecl [[ADDR_79:0x[a-z0-9]*]] col:27 'T' @@ -160,7 +160,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_84:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_85:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_86:0x[a-z0-9]*]] 'int' 3 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_87:0x[a-z0-9]*]] col:5 implicit also_before_non_template +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_87:0x[a-z0-9]*]] col:5 implicit used also_before_non_template // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_88:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | `-FunctionDecl [[ADDR_89:0x[a-z0-9]*]] col:5 also_before_non_template 'int (T)' // CHECK-NEXT: | |-ParmVarDecl [[ADDR_90:0x[a-z0-9]*]] col:31 'T' @@ -173,7 +173,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_95:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_96:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_97:0x[a-z0-9]*]] 'int' 4 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_98:0x[a-z0-9]*]] col:5 implicit only_def +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_98:0x[a-z0-9]*]] col:5 implicit used only_def // CHECK-NEXT: | |-NonTypeTemplateParmDecl [[ADDR_99:0x[a-z0-9]*]] col:15 'int' depth 0 index 0 V // CHECK-NEXT: | |-FunctionDecl [[ADDR_100:0x[a-z0-9]*]] col:5 only_def 'int ({{.*}})' // CHECK-NEXT: | | `-OMPDeclareVariantAttr [[ADDR_101:0x[a-z0-9]*]] <> Implicit implementation={extension(allow_templates)} @@ -193,7 +193,7 @@ // CHECK-NEXT: | `-CompoundStmt [[ADDR_112:0x[a-z0-9]*]] // CHECK-NEXT: | `-ReturnStmt [[ADDR_113:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_111]] 'int' 0 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_114:0x[a-z0-9]*]] prev [[ADDR_40]] line:44:5 also_after +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_114:0x[a-z0-9]*]] prev [[ADDR_40]] line:44:5 used also_after // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_115:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | |-FunctionDecl [[ADDR_116:0x[a-z0-9]*]] prev [[ADDR_42]] line:44:5 also_after 'int (T)' // CHECK-NEXT: | | |-ParmVarDecl [[ADDR_117:0x[a-z0-9]*]] col:17 'T' Index: clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp =================================================================== --- clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp +++ clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp @@ -129,7 +129,7 @@ // CHECK-NEXT: | |-TemplateArgument type 'double' // CHECK-NEXT: | | `-BuiltinType [[ADDR_21]] 'double' // CHECK-NEXT: | `-ParmVarDecl [[ADDR_57:0x[a-z0-9]*]] col:22 s 'S':'S' -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_58:0x[a-z0-9]*]] col:5 implicit special +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_58:0x[a-z0-9]*]] col:5 implicit used special // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_59:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | |-FunctionDecl [[ADDR_60:0x[a-z0-9]*]] col:5 special 'int (S)' // CHECK-NEXT: | | |-ParmVarDecl [[ADDR_61:0x[a-z0-9]*]] col:18 s 'S' @@ -171,7 +171,7 @@ // CHECK-NEXT: | | `-DeclRefExpr [[ADDR_90:0x[a-z0-9]*]] 'int':'int' {{.*}}Var [[ADDR_85]] 't' 'int':'int' // CHECK-NEXT: | `-ReturnStmt [[ADDR_91:0x[a-z0-9]*]] // CHECK-NEXT: | `-IntegerLiteral [[ADDR_81]] 'int' 0 -// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_92:0x[a-z0-9]*]] col:5 implicit also_after +// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_92:0x[a-z0-9]*]] col:5 implicit used also_after // CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_93:0x[a-z0-9]*]] col:20 referenced typename depth 0 index 0 T // CHECK-NEXT: | `-FunctionDecl [[ADDR_94:0x[a-z0-9]*]] col:5 also_after 'int (S)' // CHECK-NEXT: | |-ParmVarDecl [[ADDR_95:0x[a-z0-9]*]] col:21 s 'S' Index: clang/test/OpenMP/declare_variant.cpp =================================================================== --- /dev/null +++ clang/test/OpenMP/declare_variant.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fopenmp -verify %s + +// expected-no-diagnostics + +#pragma omp begin declare variant match(device = {kind(host)}) +static void foo(){} +#pragma omp end declare variant + +int main() { + foo(); + + return 0; +}