Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 9802f4c8da8def9df98bed67faa181aad798cc52)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 71d6bd8f286296bcd18128eea5d0f04ce5968247)
@@ -601,4 +601,18 @@
 		ast::ptr< ast::Type > & targetType;
 
+		enum Errors {
+			NotFound,
+			NoMatch,
+			ArgsToFew,
+			ArgsToMany,
+			RetsToFew,
+			RetsToMany,
+			NoReason
+		};
+
+		struct {
+			Errors code = NotFound;
+		} reason;
+
 		Finder( CandidateFinder & f )
 		: symtab( f.localSyms ), selfFinder( f ), candidates( f.candidates ), tenv( f.env ),
@@ -611,4 +625,5 @@
 		void addCandidate( Args &&... args ) {
 			candidates.emplace_back( new Candidate{ std::forward<Args>( args )... } );
+			reason.code = NoReason;
 		}
 
@@ -836,4 +851,6 @@
 			// short-circuit if no candidates
 			if ( funcFinder.candidates.empty() ) return;
+
+			reason.code = NoMatch;
 
 			std::vector< CandidateFinder > argCandidates =
@@ -989,4 +1006,9 @@
 			CandidateFinder finder{ symtab, tenv };
 			finder.find( addressExpr->arg );
+
+			if( finder.candidates.empty() ) return;
+
+			reason.code = NoMatch;
+
 			for ( CandidateRef & r : finder.candidates ) {
 				if ( ! isLvalue( r->expr ) ) continue;
@@ -1008,4 +1030,6 @@
 			CandidateFinder finder{ symtab, tenv, toType };
 			finder.find( castExpr->arg, ResolvMode::withAdjustment() );
+
+			if( !finder.candidates.empty() ) reason.code = NoMatch;
 
 			CandidateList matches;
@@ -1093,4 +1117,8 @@
 			std::vector< ast::SymbolTable::IdData > declList = symtab.lookupId( nameExpr->name );
 			PRINT( std::cerr << "nameExpr is " << nameExpr->name << std::endl; )
+			if( declList.empty() ) return;
+
+			reason.code = NoMatch;
+
 			for ( auto & data : declList ) {
 				Cost cost = Cost::zero;
@@ -1208,4 +1236,6 @@
 			if ( finder2.candidates.empty() ) return;
 
+			reason.code = NoMatch;
+
 			for ( const CandidateRef & r1 : finder1.candidates ) {
 				for ( const CandidateRef & r2 : finder2.candidates ) {
@@ -1241,4 +1271,6 @@
 			finder3.find( conditionalExpr->arg3, ResolvMode::withAdjustment() );
 			if ( finder3.candidates.empty() ) return;
+
+			reason.code = NoMatch;
 
 			for ( const CandidateRef & r1 : finder1.candidates ) {
@@ -1319,4 +1351,6 @@
 			if ( finder2.candidates.empty() ) return;
 
+			reason.code = NoMatch;
+
 			for ( const CandidateRef & r1 : finder1.candidates ) {
 				for ( const CandidateRef & r2 : finder2.candidates ) {
@@ -1419,4 +1453,6 @@
 				finder.find( initExpr->expr, ResolvMode::withAdjustment() );
 				for ( CandidateRef & cand : finder.candidates ) {
+					if(reason.code == NotFound) reason.code = NoMatch;
+
 					ast::TypeEnvironment env{ cand->env };
 					ast::AssertionSet need( cand->need.begin(), cand->need.end() ), have;
@@ -1552,5 +1588,17 @@
 
 	if ( mode.failFast && candidates.empty() ) {
-		SemanticError( expr, "No reasonable alternatives for expression " );
+		switch(finder.pass.reason.code) {
+		case Finder::NotFound:
+			{ SemanticError( expr, "No alternatives for expression " ); break; }
+		case Finder::NoMatch:
+			{ SemanticError( expr, "Invalid application of existing declaration(s) in expression " ); break; }
+		case Finder::ArgsToFew:
+		case Finder::ArgsToMany:
+		case Finder::RetsToFew:
+		case Finder::RetsToMany:
+		case Finder::NoReason:
+		default:
+			{ SemanticError( expr->location, "No reasonable alternatives for expression : reasons unkown" ); }
+		}
 	}
 
