@@ -105,7 +105,11 @@ class SwiftDispatcher {
105105 return *l;
106106 }
107107 waitingForNewLabel = e;
108- visit (e, std::forward<Args>(args)...);
108+ if constexpr (std::is_pointer_v<E>) {
109+ visit (*e, std::forward<Args>(args)...);
110+ } else {
111+ visit (e, std::forward<Args>(args)...);
112+ }
109113 // TODO when everything is moved to structured C++ classes, this should be moved to createEntry
110114 if (auto l = store.get (e)) {
111115 if constexpr (IsLocatable<E>) {
@@ -331,15 +335,15 @@ class SwiftDispatcher {
331335 // TODO: for const correctness these should consistently be `const` (and maybe const references
332336 // as we don't expect `nullptr` here. However `swift::ASTVisitor` and `swift::TypeVisitor` do not
333337 // accept const pointers
334- virtual void visit (const swift::Decl* decl) = 0;
335- virtual void visit (const swift::Stmt* stmt) = 0;
336- virtual void visit (const swift::StmtCondition* cond) = 0;
337- virtual void visit (const swift::StmtConditionElement* cond) = 0;
338- virtual void visit (const swift::CaseLabelItem* item) = 0;
339- virtual void visit (const swift::Expr* expr) = 0;
340- virtual void visit (const swift::Pattern* pattern) = 0;
341- virtual void visit (const swift::TypeRepr* typeRepr, swift::Type type) = 0;
342- virtual void visit (swift::TypeBase* type) = 0;
338+ virtual void visit (const swift::Decl& decl) = 0;
339+ virtual void visit (const swift::Stmt& stmt) = 0;
340+ virtual void visit (const swift::StmtCondition& cond) = 0;
341+ virtual void visit (const swift::StmtConditionElement& cond) = 0;
342+ virtual void visit (const swift::CaseLabelItem& item) = 0;
343+ virtual void visit (const swift::Expr& expr) = 0;
344+ virtual void visit (const swift::Pattern& pattern) = 0;
345+ virtual void visit (const swift::TypeRepr& typeRepr, swift::Type type) = 0;
346+ virtual void visit (const swift::TypeBase& type) = 0;
343347
344348 void visit (const std::filesystem::path& file) {
345349 auto entry = createEntry (file, file.string ());
0 commit comments