Index: mlir/include/mlir/IR/TypeRange.h =================================================================== --- mlir/include/mlir/IR/TypeRange.h +++ mlir/include/mlir/IR/TypeRange.h @@ -46,13 +46,21 @@ explicit TypeRange(OperandRange values); explicit TypeRange(ResultRange values); explicit TypeRange(ValueRange values); - explicit TypeRange(ArrayRef values); - explicit TypeRange(ArrayRef values) - : TypeRange(ArrayRef(values.data(), values.size())) {} template TypeRange(ValueTypeRange values) - : TypeRange(ValueRangeT(values.begin().getCurrent(), - values.end().getCurrent())) {} + : TypeRange( +// When ValueRangeT is of type ArrayRef, gcc and msvc consider +// both TypeRange(ValueRange) and TypeRange(iterator_range) inherited from the +// base class to be the best match, so we explicit call TypeRange(ValueRange), +// while clang reporte imcomplete type of ValueType +#if !defined(__clang__) + ValueRange(ValueRangeT(values.begin().getCurrent(), + values.end().getCurrent())) +#else + ValueRangeT(values.begin().getCurrent(), values.end().getCurrent()) +#endif + ) { + } template , Arg>::value>> Index: mlir/lib/IR/TypeRange.cpp =================================================================== --- mlir/lib/IR/TypeRange.cpp +++ mlir/lib/IR/TypeRange.cpp @@ -23,8 +23,6 @@ : TypeRange(values.begin().getBase(), values.size()) {} TypeRange::TypeRange(ResultRange values) : TypeRange(values.getBase(), values.size()) {} -TypeRange::TypeRange(ArrayRef values) - : TypeRange(values.data(), values.size()) {} TypeRange::TypeRange(ValueRange values) : TypeRange(OwnerT(), values.size()) { if (count == 0) return;