/// Return the range of indexes for the given tuple type element. static std::pair<unsigned,unsigned> getElementRange(CanTupleType tupleType, unsigned eltIndex) { assert(eltIndex < tupleType->getNumElements()); unsigned begin = 0; for (unsigned i = 0; i < eltIndex; ++i) { begin += getRValueSize(tupleType.getElementType(i)); } unsigned end = begin + getRValueSize(tupleType.getElementType(eltIndex)); return { begin, end }; }
clang::CanQualType GenClangType::visitTupleType(CanTupleType type) { unsigned e = type->getNumElements(); if (e == 0) return getClangASTContext().VoidTy; CanType eltTy = type.getElementType(0); for (unsigned i = 1; i < e; i++) { assert(eltTy == type.getElementType(i) && "Only tuples where all element types are equal " "map to fixed-size arrays"); } auto clangEltTy = Converter.convert(IGM, eltTy); if (!clangEltTy) return clang::CanQualType(); APInt size(32, e); auto &ctx = getClangASTContext(); return ctx.getCanonicalType( ctx.getConstantArrayType(clangEltTy, size, clang::ArrayType::Normal, 0)); llvm_unreachable("Unexpected tuple type in Clang type generation!"); }