Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 5d3d281c4eabcd465b84b7b5001ee86b376872d1)
+++ src/AST/Pass.impl.hpp	(revision 36dfdac15a1061978a1b23f2ae753434d890fdd1)
@@ -218,7 +218,7 @@
 	__pass::resultNstmt<container_t> new_kids;
 	for ( auto value : enumerate( statements ) ) {
+		size_t i = value.idx;
+		const Stmt * stmt = value.val;
 		try {
-			size_t i = value.idx;
-			const Stmt * stmt = value.val;
 			__pedantic_pass_assert( stmt );
 			const ast::Stmt * new_stmt = stmt->accept( *this );
@@ -246,5 +246,11 @@
 			new_kids.take_all( stmts_after );
 		} catch ( SemanticErrorException &e ) {
+			if ( auto dstmt = dynamic_cast<const DeclStmt *>( stmt ) ) {
+				assert( dstmt->decl->unique() );
+				auto & declLink = const_cast< ptr<Decl> & >( dstmt->decl );
+		  if ( !__pass::on_error (core, declLink, 0) ) goto handled;
+			}
 			errors.append( e );
+		  handled:;
 		}
 	}
Index: tests/raii/.expect/partial.txt
===================================================================
--- tests/raii/.expect/partial.txt	(revision 5d3d281c4eabcd465b84b7b5001ee86b376872d1)
+++ tests/raii/.expect/partial.txt	(revision 36dfdac15a1061978a1b23f2ae753434d890fdd1)
@@ -1,2 +1,3 @@
+====== Top-level declarations ======
 test1
 custom ctor
@@ -15,2 +16,19 @@
 custom ctor
 custom dtor
+====== Function-nested declarations ======
+test1
+custom ctor
+test2
+custom ctor
+custom dtor
+custom dtor
+test3
+test4
+custom ctor
+custom dtor
+test5
+custom ctor
+custom dtor
+test6
+custom ctor
+custom dtor
Index: tests/raii/partial.cfa
===================================================================
--- tests/raii/partial.cfa	(revision 5d3d281c4eabcd465b84b7b5001ee86b376872d1)
+++ tests/raii/partial.cfa	(revision 36dfdac15a1061978a1b23f2ae753434d890fdd1)
@@ -7,4 +7,74 @@
 #define BAD(...)
 #endif
+
+void testAllNested() {
+
+    // Declaring your own empty ctor leaves an autogen dtor usable
+    struct thing1 {};
+    void ?{}( thing1 & this ) {  printf( "custom ctor\n"); }
+    void test1() {
+        printf("test1\n");
+        thing1 x;
+    }
+
+    // Declaring your own empty ctor and dtor leaves an autogen copy ctor usable
+    struct thing2 {};
+    void  ?{}( thing2 & this ) {  printf( "custom ctor\n"); }
+    void ^?{}( thing2 & this ) {  printf( "custom dtor\n"); }
+    void test2() {
+        printf("test2\n");
+        thing2 x;
+        thing2 y = x;
+    }
+
+    // Deleting the autogen copy ctor also deletes the autogen empty ctor
+    struct thing3 {};
+    void  ?{}( thing3 &, thing3 ) = void;
+    void test3() {
+        printf("test3\n");
+        BAD( thing3 x; )  // Unique best alternative includes deleted identifier
+    }
+
+    struct thing456 {};
+    void    ?{}( thing456 & this ) {  printf( "custom ctor\n"); }
+    void    ?{}( thing456 &, thing456 ) = void;
+    thing456 & ?=?( thing456 &, thing456 ) = void;
+    void   ^?{}( thing456 & this ) {  printf( "custom dtor\n"); }
+
+    struct wrapper1 { thing456 x; };
+    struct wrapper2 { wrapper1 x; };
+
+    // Deleting some autogens and declaring your own for the others leaves yours usable
+    // and the deleted ones cleanly deleted
+    void test4() {
+        printf("test4\n");
+        thing456 x;
+        BAD(  thing456 y = x;  )   // Unique best alternative includes deleted identifier
+    }
+
+    // Wrapping v4 leaves yours usable via autogen
+    // and the autogen-lifts of your deleted ones are not usable
+    void test5() {
+        printf("test5\n");
+        wrapper1 x;
+        BAD(  wrapper1 y = x;  )  //  Unique best alternative includes deleted identifier
+    }
+
+    // Wrapping again works similarly
+    void test6() {
+        printf("test6\n");
+        wrapper2 x;
+        BAD(  wrapper2 y = x;  )  //  Unique best alternative includes deleted identifier
+    }
+
+    test1();
+    test2();
+    test3();
+    test4();
+    test5();
+    test6();
+}
+
+// ===== Repeat, now as top-level declarations
 
 // Declaring your own empty ctor leaves an autogen dtor usable
@@ -67,4 +137,5 @@
 
 int main() {
+    printf("====== Top-level declarations ======\n");
     test1();
     test2();
@@ -73,3 +144,5 @@
     test5();
     test6();
+    printf("====== Function-nested declarations ======\n");
+    testAllNested();
 }
