Repository: nodejs/node
Pull request: src: avoid C strings in more C++ exception throws

Similar to 2e2f4cd095ff93278, just missed them in that commit.

<!--
Before submitting a pull request, please read:

- the CONTRIBUTING guide at https://github.com/nodejs/node/blob/HEAD/CONTRIBUTING.md
- the commit message formatting guidelines at
  https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines

For code changes:
1. Include tests for any bug fixes or new features.
2. Update documentation if relevant.
3. Ensure that `make -j4 test` (UNIX), or `vcbuild test` (Windows) passes.

If you believe this PR should be highlighted in the Node.js CHANGELOG
please add the `notable-change` label.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
-->


Changed files:
filename: src/debug_utils-inl.h
patch: @@ -23,13 +23,26 @@ concept StringConvertible = requires(T a) {
                                 a.ToString()
                                 } -> std::convertible_to<std::string>;
                             };
+// For std::filesystem::path and similar types
+template <typename T>
+concept StringConvertibleFSPathLike = requires(T a) {
+                                        {
+                                          a.string()
+                                          } -> std::convertible_to<std::string>;
+                                      };
 
 struct ToStringHelper {
   template <typename T>
     requires(StringConvertible<T>) && (!StringViewConvertible<T>)
   static std::string Convert(const T& value) {
     return value.ToString();
   }
+  template <typename T>
+    requires(StringConvertibleFSPathLike<T>) && (!StringViewConvertible<T>) &&
+            (!StringConvertible<T>)
+  static std::string Convert(const T& value) {
+    return value.string();
+  }
   template <typename T>
     requires StringViewConvertible<T>
   static std::string_view Convert(const T& value) {

filename: src/node_file.cc
patch: @@ -3526,12 +3526,10 @@ static void CpSyncCopyDir(const FunctionCallbackInfo<Value>& args) {
               if (!dereference &&
                   std::filesystem::is_directory(symlink_target) &&
                   isInsideDir(symlink_target, current_dest_symlink_target)) {
-                std::string message =
+                static constexpr const char* message =
                     "Cannot copy %s to a subdirectory of self %s";
-                THROW_ERR_FS_CP_EINVAL(env,
-                                       message.c_str(),
-                                       symlink_target.c_str(),
-                                       current_dest_symlink_target.c_str());
+                THROW_ERR_FS_CP_EINVAL(
+                    env, message, symlink_target, current_dest_symlink_target);
                 return false;
               }
 
@@ -3540,12 +3538,10 @@ static void CpSyncCopyDir(const FunctionCallbackInfo<Value>& args) {
               // and therefore a broken symlink would be created.
               if (std::filesystem::is_directory(dest_file_path) &&
                   isInsideDir(current_dest_symlink_target, symlink_target)) {
-                std::string message = "cannot overwrite %s with %s";
+                static constexpr const char* message =
+                    "cannot overwrite %s with %s";
                 THROW_ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY(
-                    env,
-                    message.c_str(),
-                    current_dest_symlink_target.c_str(),
-                    symlink_target.c_str());
+                    env, message, current_dest_symlink_target, symlink_target);
                 return false;
               }
 
@@ -3597,7 +3593,7 @@ static void CpSyncCopyDir(const FunctionCallbackInfo<Value>& args) {
             THROW_ERR_FS_CP_EEXIST(isolate,
                                    "[ERR_FS_CP_EEXIST]: Target already exists: "
                                    "cp returned EEXIST (%s already exists)",
-                                   dest_file_path.c_str());
+                                   dest_file_path);
             return false;
           }
           env->ThrowStdErrException(error, "cp", dest_str.c_str());