diff --git a/Makefile.am b/Makefile.am
index b20be0ecfd967d0bacc7923b4bbee6c76f3b7691..43a7b56dc87cc9e699adc94329cbbacfe49adda4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,6 +43,7 @@ test_cases = \
 	tests/control-structures.svtest \
 	tests/compile/compile.svtest \
 	tests/compile/errors.svtest \
+	tests/compile/warnings.svtest \
 	tests/execute/errors.svtest \
 	tests/execute/actions.svtest \
 	tests/execute/smtp.svtest \
diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index 1c51cba811769176fce27e0d43ae804fa64007ef..260ec9f0807614ed11c3f40265e9f6f8e7e5681e 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -318,9 +318,9 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer)
 		while ( sieve_lexer_curchar(lexer) != '\n' ) {
 			switch( sieve_lexer_curchar(lexer) ) {
 			case -1:
-				sieve_lexer_error(lexer, "end of file before end of hash comment");
-				lexer->token_type = STT_ERROR;
-				return FALSE;
+				sieve_lexer_warning(lexer, "no newline (CRLF) at end of hash comment at end of file");
+				lexer->token_type = STT_WHITESPACE;
+				return TRUE;
 			case '\0':
 				sieve_lexer_error(lexer, "encountered NUL character in hash comment");
 				lexer->token_type = STT_ERROR;
diff --git a/tests/compile/warnings.svtest b/tests/compile/warnings.svtest
new file mode 100644
index 0000000000000000000000000000000000000000..66f26f686e5683665ab517477d404a110f79b868
--- /dev/null
+++ b/tests/compile/warnings.svtest
@@ -0,0 +1,8 @@
+require "vnd.dovecot.testsuite";
+
+test "EOF Warnings" {
+    if not test_script_compile "warnings/eof.sieve" {
+        test_fail "compile should have succeeded.";
+    }
+}
+
diff --git a/tests/compile/warnings/eof.sieve b/tests/compile/warnings/eof.sieve
new file mode 100644
index 0000000000000000000000000000000000000000..e7121495d7de8a2100fa02b71b5ea1fc925ee02b
--- /dev/null
+++ b/tests/compile/warnings/eof.sieve
@@ -0,0 +1,2 @@
+keep;
+# Kept
\ No newline at end of file