Index: src/Common/CodeLocation.h
===================================================================
--- src/Common/CodeLocation.h	(revision b0b1e15bc9750713820f8fdd7b0d6249055c0946)
+++ src/Common/CodeLocation.h	(revision 33a129a073c822863cde7aa42ee208fcb6123ad2)
@@ -42,14 +42,25 @@
 	}
 
-	bool followedBy( CodeLocation const & other, int seperation ) {
+	bool startsBefore( CodeLocation const & other ) const {
+		if( filename < other.filename ) return true;
+		if( filename > other.filename ) return false;
+
+		if( first_line < other.first_line ) return true;
+		if( first_line > other.first_line ) return false;
+
+		if( last_line < other.last_line ) return true;
+		return false;
+	}
+
+	bool followedBy( CodeLocation const & other, int seperation ) const {
 		return (first_line + seperation == other.first_line &&
 		        filename == other.filename);
 	}
 
-	bool operator==( CodeLocation const & other ) {
+	bool operator==( CodeLocation const & other ) const {
 		return followedBy( other, 0 );
 	}
 
-	bool operator!=( CodeLocation const & other ) {
+	bool operator!=( CodeLocation const & other ) const {
 		return !(*this == other);
 	}
Index: src/Common/SemanticError.cc
===================================================================
--- src/Common/SemanticError.cc	(revision b0b1e15bc9750713820f8fdd7b0d6249055c0946)
+++ src/Common/SemanticError.cc	(revision 33a129a073c822863cde7aa42ee208fcb6123ad2)
@@ -90,4 +90,12 @@
 void SemanticErrorException::print() {
 	using std::to_string;
+
+	errors.sort([](const error & lhs, const error & rhs) -> bool {
+		if(lhs.location.startsBefore(rhs.location)) return true;
+		if(rhs.location.startsBefore(lhs.location)) return false;
+
+		return lhs.description < rhs.description;
+	});
+
 	for( auto err : errors ) {
 		std::cerr << ErrorHelpers::bold() << err.location << ErrorHelpers::error_str() << ErrorHelpers::reset_font() << err.description << std::endl;
