Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 0b150eccb21118c3e0226446011f3008a38293e5)
+++ src/SymTab/Indexer.cc	(revision ff03f5cd8341dad2144710b51063ff0071ec6107)
@@ -124,8 +124,9 @@
 			};
 			// properties for this type
-			bool userDefinedFunc = false; // any user-defined function found
-			bool userDefinedCtor = false; // any user-defined constructor found
-			bool userDefinedDtor = false; // any user-defined destructor found
-			bool userDefinedCopyFunc = false; // user-defined copy ctor found
+			bool existsUserDefinedFunc = false;    // any user-defined function found
+			bool existsUserDefinedCtor = false;    // any user-defined constructor found
+			bool existsUserDefinedDtor = false;    // any user-defined destructor found
+			bool existsUserDefinedCopyFunc = false;    // user-defined copy ctor found
+			bool existsUserDefinedDefaultCtor = false; // user-defined default ctor found
 			std::list< DeclBall > decls;
 
@@ -138,8 +139,9 @@
 				bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() );
 				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } );
-				userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
-				userDefinedCtor = userDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) );
-				userDefinedDtor = userDefinedDtor || (isUserDefinedFunc && isDtor);
-				userDefinedCopyFunc = userDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc);
+				existsUserDefinedFunc = existsUserDefinedFunc || isUserDefinedFunc;
+				existsUserDefinedCtor = existsUserDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) );
+				existsUserDefinedDtor = existsUserDefinedDtor || (isUserDefinedFunc && isDtor);
+				existsUserDefinedCopyFunc = existsUserDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc);
+				existsUserDefinedDefaultCtor = existsUserDefinedDefaultCtor || (isUserDefinedFunc && isDefaultCtor);
 				return *this;
 			}
@@ -163,13 +165,19 @@
 		}
 
-		// if a type contains user defined ctor/dtors, then special rules trigger, which determine
-		// the set of ctor/dtors that are seen by the requester. In particular, if the user defines
+		// if a type contains user defined ctor/dtor/assign, then special rules trigger, which determine
+		// the set of ctor/dtor/assign that are seen by the requester. In particular, if the user defines
 		// a default ctor, then the generated default ctor should never be seen, likewise for copy ctor
 		// and dtor. If the user defines any ctor/dtor, then no generated field ctors should be seen.
-		// If the user defines any ctor then the generated default ctor should not be seen.
+		// If the user defines any ctor then the generated default ctor should not be seen (intrinsic default
+		// ctor must be overridden exactly).
 		for ( std::pair< const std::string, ValueType > & pair : funcMap ) {
 			ValueType & val = pair.second;
 			for ( ValueType::DeclBall ball : val.decls ) {
-				if ( ! val.userDefinedFunc || ball.isUserDefinedFunc || (! val.userDefinedCtor && ball.isDefaultCtor) || (! val.userDefinedCopyFunc && ball.isCopyFunc) || (! val.userDefinedDtor && ball.isDtor) ) {
+				bool noUserDefinedFunc = ! val.existsUserDefinedFunc;
+				bool isUserDefinedFunc = ball.isUserDefinedFunc;
+				bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl->get_linkage() == LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides
+				bool isAcceptableCopyFunc = ! val.existsUserDefinedCopyFunc && ball.isCopyFunc; // handles copy ctor and assignment operator
+				bool isAcceptableDtor = ! val.existsUserDefinedDtor && ball.isDtor;
+				if ( noUserDefinedFunc || isUserDefinedFunc || isAcceptableDefaultCtor || isAcceptableCopyFunc || isAcceptableDtor ) {
 					// decl conforms to the rules described above, so it should be seen by the requester
 					out.push_back( ball.decl );
