diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11636,7 +11636,7 @@ // RISC-V builtin required extension warning def err_riscv_builtin_requires_extension : Error< - "builtin requires at least one of the following extensions to be enabled: %0">; + "builtin requires%select{| at least one of the following extensions to be enabled}0: %1">; def err_riscv_builtin_invalid_lmul : Error< "LMUL argument must be in the range [0,3] or [5,7]">; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4369,13 +4369,20 @@ if (llvm::none_of(ReqOpFeatures, [&TI](StringRef OF) { return TI.hasFeature(OF); })) { std::string FeatureStrs; + bool IsExtension = true; for (StringRef OF : ReqOpFeatures) { // If the feature is 64bit, alter the string so it will print better in // the diagnostic. - if (OF == "64bit") + if (OF == "64bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '64bit' to be alone"); OF = "RV64"; - if (OF == "32bit") + IsExtension = false; + } + if (OF == "32bit") { + assert(ReqOpFeatures.size() == 1 && "Expected '32bit' to be alone"); OF = "RV32"; + IsExtension = false; + } // Convert features like "zbr" and "experimental-zbr" to "Zbr". OF.consume_front("experimental-"); @@ -4390,6 +4397,7 @@ // Error message FeatureMissing = true; Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_requires_extension) + << IsExtension << TheCall->getSourceRange() << StringRef(FeatureStrs); } } diff --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c --- a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c +++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv32-zbb-error.c @@ -2,5 +2,5 @@ // RUN: %clang_cc1 -triple riscv32 -target-feature +zbb -verify %s -o - int orc_b_64(int a) { - return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV64'}} + return __builtin_riscv_orc_b_64(a); // expected-error {{builtin requires: 'RV64'}} } diff --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c --- a/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c +++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/riscv64-zbkb-error.c @@ -3,10 +3,10 @@ int zip(int rs1) { - return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_zip_32(rs1); // expected-error {{builtin requires: 'RV32'}} } int unzip(int rs1) { - return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires at least one of the following extensions to be enabled: 'RV32'}} + return __builtin_riscv_unzip_32(rs1); // expected-error {{builtin requires: 'RV32'}} }