@@ -211,7 +211,9 @@ class SwiftDispatcher {
211211 template <typename Iterable>
212212 auto fetchRepeatedLabels (Iterable&& arg) {
213213 std::vector<decltype (fetchLabel (*arg.begin ()))> ret;
214- ret.reserve (arg.size ());
214+ if constexpr (HasSize<Iterable>::value) {
215+ ret.reserve (arg.size ());
216+ }
215217 for (auto && e : arg) {
216218 ret.push_back (fetchLabel (e));
217219 }
@@ -262,6 +264,12 @@ class SwiftDispatcher {
262264 }
263265
264266 private:
267+ template <typename T, typename = void >
268+ struct HasSize : std::false_type {};
269+
270+ template <typename T>
271+ struct HasSize <T, decltype (std::declval<T>().size(), void ())> : std::true_type {};
272+
265273 void attachLocation (swift::SourceLoc start,
266274 swift::SourceLoc end,
267275 TrapLabel<LocatableTag> locatableLabel) {
@@ -320,18 +328,15 @@ class SwiftDispatcher {
320328 return ret;
321329 }
322330
323- // TODO: for const correctness these should consistently be `const` (and maybe const references
324- // as we don't expect `nullptr` here. However `swift::ASTVisitor` and `swift::TypeVisitor` do not
325- // accept const pointers
326- virtual void visit (swift::Decl* decl) = 0;
327- virtual void visit (swift::Stmt* stmt) = 0;
331+ virtual void visit (const swift::Decl* decl) = 0;
332+ virtual void visit (const swift::Stmt* stmt) = 0;
328333 virtual void visit (const swift::StmtCondition* cond) = 0;
329334 virtual void visit (const swift::StmtConditionElement* cond) = 0;
330- virtual void visit (swift::CaseLabelItem* item) = 0;
331- virtual void visit (swift::Expr* expr) = 0;
332- virtual void visit (swift::Pattern* pattern) = 0;
333- virtual void visit (swift::TypeRepr* typeRepr, swift::Type type) = 0;
334- virtual void visit (swift::TypeBase* type) = 0;
335+ virtual void visit (const swift::CaseLabelItem* item) = 0;
336+ virtual void visit (const swift::Expr* expr) = 0;
337+ virtual void visit (const swift::Pattern* pattern) = 0;
338+ virtual void visit (const swift::TypeRepr* typeRepr, swift::Type type) = 0;
339+ virtual void visit (const swift::TypeBase* type) = 0;
335340
336341 void visit (const std::filesystem::path& file) {
337342 auto entry = createEntry (file, file.string ());
0 commit comments