Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision c50d54d127a8d9ee804259333a744a4dcb787fac)
+++ src/InitTweak/InitTweak.cc	(revision fd236ed4157df27ec024f8383f9f7ce8254ae142)
@@ -5,4 +5,5 @@
 #include <memory>                  // for __shared_ptr
 
+#include "Common/PassVisitor.h"
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/UniqueName.h"     // for UniqueName
@@ -29,10 +30,20 @@
 namespace InitTweak {
 	namespace {
-		class HasDesignations : public Visitor {
+		class HasDesignations : public WithShortCircuiting {
 		public:
 			bool hasDesignations = false;
-			virtual void visit( Designation * des ) {
-				if ( ! des->get_designators().empty() ) hasDesignations = true;
-				else Visitor::visit( des );
+
+			void previsit( BaseSyntaxNode * ) {
+				// short circuit if we already know there are designations
+				if ( hasDesignations ) visit_children = false;
+			}
+
+			void previsit( Designation * des ) {
+				// short circuit if we already know there are designations
+				if ( hasDesignations ) visit_children = false;
+				else if ( ! des->get_designators().empty() ) {
+					hasDesignations = true;
+					visit_children = false;
+				}
 			}
 		};
@@ -86,7 +97,7 @@
 
 	bool isDesignated( Initializer * init ) {
-		HasDesignations finder;
+		PassVisitor<HasDesignations> finder;
 		maybeAccept( init, finder );
-		return finder.hasDesignations;
+		return finder.pass.hasDesignations;
 	}
 
