From 3b49b51956bb0a1542146999ae9fd86d1707f63b Mon Sep 17 00:00:00 2001 From: Nicholas Bishop Date: Fri, 27 Feb 2026 14:22:08 -0500 Subject: [PATCH] Support bool template params (#6808) https://github.com/carbon-language/carbon-lang/issues/6717 --- toolchain/check/cpp/call.cpp | 16 +++++++++++++--- .../interop/cpp/template/non_type_param.carbon | 11 +++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/toolchain/check/cpp/call.cpp b/toolchain/check/cpp/call.cpp index d849ecbcd0ff..ef5b9c2c5e40 100644 --- a/toolchain/check/cpp/call.cpp +++ b/toolchain/check/cpp/call.cpp @@ -177,17 +177,27 @@ static auto ConvertArgToTemplateArg( context.constant_values().GetConstantInstId(converted_inst_id); if (const_inst_id.has_value()) { if (param_type->isIntegerType()) { + const bool is_signed = param_type->isSignedIntegerOrEnumerationType(); if (auto int_value = context.insts().TryGetAs(const_inst_id)) { const auto& ap_int = context.ints().Get(int_value->int_id); - const bool is_unsigned = - !param_type->isSignedIntegerOrEnumerationType(); auto aps_int = - llvm::APSInt(ap_int, is_unsigned) + llvm::APSInt(ap_int, !is_signed) .extOrTrunc(context.ast_context().getIntWidth(param_type)); clang::TemplateArgument template_arg(context.ast_context(), aps_int, param_type); return clang::TemplateArgumentLoc(template_arg, template_loc); + } else if (auto bool_value = + context.insts().TryGetAs( + const_inst_id)) { + llvm::APInt ap_int(context.ast_context().getIntWidth(param_type), + bool_value->value.ToBool(), is_signed); + auto aps_int = + llvm::APSInt(ap_int, !is_signed) + .extOrTrunc(context.ast_context().getIntWidth(param_type)); + auto template_arg = clang::TemplateArgument(context.ast_context(), + aps_int, param_type); + return clang::TemplateArgumentLoc(template_arg, template_loc); } } else if (param_type->isFloatingType()) { if (auto float_value = diff --git a/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon b/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon index 74220204b59f..79d2dd4521b8 100644 --- a/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon +++ b/toolchain/check/testdata/interop/cpp/template/non_type_param.carbon @@ -76,6 +76,17 @@ impl C as Core.ImplicitAs(i32) { } var s: Cpp.Simple({} as C) = Cpp.MakeSimple123(); +// --- bool.carbon + +library "[[@TEST_NAME]]"; + +import Cpp inline ''' +template struct Struct {}; +Struct MakeStruct() { return Struct(); } +'''; + +var s: Cpp.Struct(true) = Cpp.MakeStruct(); + // --- float.carbon library "[[@TEST_NAME]]";