From e92140f82d0a5f4f93e92a29be5bf6c9df9e298c Mon Sep 17 00:00:00 2001 From: David Neto Date: Wed, 1 Oct 2025 16:40:43 -0400 Subject: [PATCH] Add helper to wrap result of std::filesystem::path::u8string() (#2535) In C++17 the return type of std::filesystem::path::u8string() is std::string, but in C++20 the return type changed to std::u8string. Add a helper to copy a std::u8string to a std::string, to be used when a std::string is required. This fixes the build for C++20. --- test_common/harness/stringHelpers.h | 16 ++++++++++++++++ test_conformance/compiler/main.cpp | 3 ++- test_conformance/compiler/test_compile.cpp | 10 ++++++---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/test_common/harness/stringHelpers.h b/test_common/harness/stringHelpers.h index e1275f10..5f474bb1 100644 --- a/test_common/harness/stringHelpers.h +++ b/test_common/harness/stringHelpers.h @@ -39,4 +39,20 @@ inline std::string str_sprintf(const std::string &str, Args... args) return std::string(buffer.get(), buffer.get() + s - 1); } +// Returns the argument, converted to std::string. +// The return type of std::filesystem::path::u8string() was +// std::string in C++17, but became std::u8string in C++20. +// Use this method to wrap the result when a std::string +// is desired. +// +// Use a template with a specialization for std::string, +// so the generic template applies when std::u8string exists +// and is used. +template +inline std::string to_string(const STRING_TYPE &str) +{ + return std::string(str.begin(), str.end()); +} +inline std::string to_string(const std::string &str) { return str; } + #endif // STRING_HELPERS_H diff --git a/test_conformance/compiler/main.cpp b/test_conformance/compiler/main.cpp index e4c6ade7..3845f2fd 100644 --- a/test_conformance/compiler/main.cpp +++ b/test_conformance/compiler/main.cpp @@ -17,9 +17,10 @@ #include #include "harness/testHarness.h" +#include "harness/stringHelpers.h" std::string spvBinariesPath = - (std::filesystem::path("compiler") / "spirv_bin").u8string(); + to_string((std::filesystem::path("compiler") / "spirv_bin").u8string()); const std::string spvBinariesPathArg = "--spirv-binaries-path"; void printUsage() diff --git a/test_conformance/compiler/test_compile.cpp b/test_conformance/compiler/test_compile.cpp index 70ca9449..6e6e5f53 100644 --- a/test_conformance/compiler/test_compile.cpp +++ b/test_conformance/compiler/test_compile.cpp @@ -24,6 +24,7 @@ #include #endif #include "harness/conversions.h" +#include "harness/stringHelpers.h" #define MAX_LINE_SIZE_IN_PROGRAM 1024 #define MAX_LOG_SIZE_IN_PROGRAM 2048 @@ -3059,12 +3060,13 @@ REGISTER_TEST(execute_after_included_header_link) } const auto simple_header_path = temp_dir_path / simple_header_name; - FILE *simple_header_file = - fopen(simple_header_path.u8string().c_str(), "w"); + const std::string simple_header_path_str = + to_string(simple_header_path.u8string()); + FILE *simple_header_file = fopen(simple_header_path_str.c_str(), "w"); if (simple_header_file == NULL) { log_error("ERROR: Unable to create simple header file %s! (in %s:%d)\n", - simple_header_path.u8string().c_str(), __FILE__, __LINE__); + simple_header_path_str.c_str(), __FILE__, __LINE__); return -1; } if (fprintf(simple_header_file, "%s", simple_header) < 0) @@ -3082,7 +3084,7 @@ REGISTER_TEST(execute_after_included_header_link) } const std::string include_path = - std::string("-I") + temp_dir_path.generic_u8string(); + std::string("-I") + to_string(temp_dir_path.generic_u8string()); error = clCompileProgram(program, 1, &device, include_path.c_str(), 0, NULL, NULL, NULL, NULL); test_error(error,