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.
This commit is contained in:
David Neto
2025-10-01 16:40:43 -04:00
committed by GitHub
parent ac673e5e8c
commit e92140f82d
3 changed files with 24 additions and 5 deletions

View File

@@ -39,4 +39,20 @@ inline std::string str_sprintf(const std::string &str, Args... args)
return std::string(buffer.get(), buffer.get() + s - 1); 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 <typename STRING_TYPE>
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 #endif // STRING_HELPERS_H

View File

@@ -17,9 +17,10 @@
#include <filesystem> #include <filesystem>
#include "harness/testHarness.h" #include "harness/testHarness.h"
#include "harness/stringHelpers.h"
std::string spvBinariesPath = 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"; const std::string spvBinariesPathArg = "--spirv-binaries-path";
void printUsage() void printUsage()

View File

@@ -24,6 +24,7 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#include "harness/conversions.h" #include "harness/conversions.h"
#include "harness/stringHelpers.h"
#define MAX_LINE_SIZE_IN_PROGRAM 1024 #define MAX_LINE_SIZE_IN_PROGRAM 1024
#define MAX_LOG_SIZE_IN_PROGRAM 2048 #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; const auto simple_header_path = temp_dir_path / simple_header_name;
FILE *simple_header_file = const std::string simple_header_path_str =
fopen(simple_header_path.u8string().c_str(), "w"); to_string(simple_header_path.u8string());
FILE *simple_header_file = fopen(simple_header_path_str.c_str(), "w");
if (simple_header_file == NULL) if (simple_header_file == NULL)
{ {
log_error("ERROR: Unable to create simple header file %s! (in %s:%d)\n", 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; return -1;
} }
if (fprintf(simple_header_file, "%s", simple_header) < 0) 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 = 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, error = clCompileProgram(program, 1, &device, include_path.c_str(), 0, NULL,
NULL, NULL, NULL); NULL, NULL, NULL);
test_error(error, test_error(error,