Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision 861799c7471bc5f428e98ee82e5cc722ab2ffda7)
+++ src/SymTab/Indexer.cc	(revision 235114f58dbd5442fe755928fdeb3dd01f263d9f)
@@ -119,11 +119,13 @@
 				FunctionDecl * decl;
 				bool isUserDefinedFunc; // properties for this particular decl
-				bool isDefaultFunc;
+				bool isDefaultCtor;
+				bool isDtor;
 				bool isCopyFunc;
 			};
 			// properties for this type
-			bool userDefinedFunc = false; // any user defined function found
-			bool userDefinedDefaultFunc = false; // user defined default ctor found
-			bool userDefinedCopyFunc = false; // user defined copy ctor found
+			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
 			std::list< DeclBall > decls;
 
@@ -132,9 +134,11 @@
 			ValueType & operator+=( FunctionDecl * function ) {
 				bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() );
-				bool isDefaultFunc = function->get_functionType()->get_parameters().size() == 1;
+				bool isDefaultCtor = InitTweak::isDefaultConstructor( function );
+				bool isDtor = InitTweak::isDestructor( function );
 				bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() );
-				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultFunc, isCopyFunc } );
+				decls.push_back( DeclBall{ function, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } );
 				userDefinedFunc = userDefinedFunc || isUserDefinedFunc;
-				userDefinedDefaultFunc = userDefinedDefaultFunc || (isUserDefinedFunc && isDefaultFunc);
+				userDefinedCtor = userDefinedCtor || (isUserDefinedFunc && InitTweak::isConstructor( function->get_name() ) );
+				userDefinedDtor = userDefinedDtor || (isUserDefinedFunc && isDtor);
 				userDefinedCopyFunc = userDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc);
 				return *this;
@@ -163,8 +167,9 @@
 		// 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.
 		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.userDefinedDefaultFunc && ball.isDefaultFunc) || (! val.userDefinedCopyFunc && ball.isCopyFunc) ) {
+				if ( ! val.userDefinedFunc || ball.isUserDefinedFunc || (! val.userDefinedCtor && ball.isDefaultCtor) || (! val.userDefinedCopyFunc && ball.isCopyFunc) || (! val.userDefinedDtor && ball.isDtor) ) {
 					// decl conforms to the rules described above, so it should be seen by the requester
 					out.push_back( ball.decl );
