[llvm] [llvm][Support] Add indirection to call correct validate(...) function (PR #71966)

via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 10 09:46:21 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: None (arrv-sc)

<details>
<summary>Changes</summary>

    Previously "yamlize" overload for validatedMappingTraits was
    unconditionally calling "MappingTraits<T>::validate" even if
    "MappingContextTraits<T, Context>" was passed to it. Therefore
    compilation failed when specifying
    "MappingContextTraits<T,Context>::validate()"

---
Full diff: https://github.com/llvm/llvm-project/pull/71966.diff


1 Files Affected:

- (modified) llvm/include/llvm/Support/YAMLTraits.h (+15-2) 


``````````diff
diff --git a/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h
index 99074105a556989..86226ef46cf5482 100644
--- a/llvm/include/llvm/Support/YAMLTraits.h
+++ b/llvm/include/llvm/Support/YAMLTraits.h
@@ -1058,6 +1058,19 @@ yamlize(IO &io, T &Val, bool, EmptyContext &Ctx) {
   }
 }
 
+template <typename T, typename Context,
+          std::enable_if_t<validatedMappingTraits<T, Context>::value, int> = 0>
+std::string callValidate(IO &io, T &Val, Context &Ctx) {
+  return MappingContextTraits<T, Context>::validate(io, Val, Ctx);
+}
+
+template <
+    typename T,
+    std::enable_if_t<validatedMappingTraits<T, EmptyContext>::value, int> = 0>
+std::string callValidate(IO &io, T &Val, EmptyContext = {}) {
+  return MappingTraits<T>::validate(io, Val);
+}
+
 template <typename T, typename Context>
 std::enable_if_t<validatedMappingTraits<T, Context>::value, void>
 yamlize(IO &io, T &Val, bool, Context &Ctx) {
@@ -1066,7 +1079,7 @@ yamlize(IO &io, T &Val, bool, Context &Ctx) {
   else
     io.beginMapping();
   if (io.outputting()) {
-    std::string Err = MappingTraits<T>::validate(io, Val);
+    std::string Err = callValidate(io, Val, Ctx);
     if (!Err.empty()) {
       errs() << Err << "\n";
       assert(Err.empty() && "invalid struct trying to be written as yaml");
@@ -1074,7 +1087,7 @@ yamlize(IO &io, T &Val, bool, Context &Ctx) {
   }
   detail::doMapping(io, Val, Ctx);
   if (!io.outputting()) {
-    std::string Err = MappingTraits<T>::validate(io, Val);
+    std::string Err = callValidate(io, Val, Ctx);
     if (!Err.empty())
       io.setError(Err);
   }

``````````

</details>


https://github.com/llvm/llvm-project/pull/71966


More information about the llvm-commits mailing list