diff --git a/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h index 00f645545a2be..27af2d60c837f 100644 --- a/llvm/include/llvm/Support/YAMLTraits.h +++ b/llvm/include/llvm/Support/YAMLTraits.h @@ -1850,39 +1850,29 @@ template <> struct IsFlowSequenceBase { static const bool flow = true; }; -template -struct IsResizable : std::false_type {}; - template -struct IsResizable().resize(0))>> - : public std::true_type {}; - -template struct IsResizableBase { - using type = typename T::value_type; - - static type &element(IO &io, T &seq, size_t index) { - if (index >= seq.size()) - seq.resize(index + 1); - return seq[index]; - } -}; +using check_resize_t = decltype(std::declval().resize(0)); -template struct IsResizableBase { +template struct IsResizableBase { using type = typename T::value_type; static type &element(IO &io, T &seq, size_t index) { - if (index >= seq.size()) { - io.setError(Twine("value sequence extends beyond static size (") + - Twine(seq.size()) + ")"); - return seq[0]; + if constexpr (is_detected::value) { + if (index >= seq.size()) + seq.resize(index + 1); + } else { + if (index >= seq.size()) { + io.setError(Twine("value sequence extends beyond static size (") + + Twine(seq.size()) + ")"); + return seq[0]; + } } return seq[index]; } }; template -struct SequenceTraitsImpl : IsFlowSequenceBase, - IsResizableBase::value> { +struct SequenceTraitsImpl : IsFlowSequenceBase, IsResizableBase { static size_t size(IO &io, T &seq) { return seq.size(); } };