diff options
author | Björn Gustavsson <[email protected]> | 2014-06-16 14:25:12 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-06-16 14:32:42 +0200 |
commit | 9a9b77c72f95123ac0e6d1dab7f907a4f0f2e6a6 (patch) | |
tree | 92bc192b2a54030bcfddb0f9d8baf904f670a83b | |
parent | 26e63b26e605a74ba0a0a58c1fb1cb0ba358efed (diff) | |
download | otp-9a9b77c72f95123ac0e6d1dab7f907a4f0f2e6a6.tar.gz otp-9a9b77c72f95123ac0e6d1dab7f907a4f0f2e6a6.tar.bz2 otp-9a9b77c72f95123ac0e6d1dab7f907a4f0f2e6a6.zip |
Fix handling of latin1 characters in false ifdef branches
The fallback to latin-1 encoding would not work if the invalid
UTF-8 characters occurred in a skipped branch in an -ifdef/-ifndef.
-rw-r--r-- | lib/compiler/test/warnings_SUITE.erl | 14 | ||||
-rw-r--r-- | lib/stdlib/src/epp.erl | 16 |
2 files changed, 28 insertions, 2 deletions
diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl index ad4ad91f74..0637041873 100644 --- a/lib/compiler/test/warnings_SUITE.erl +++ b/lib/compiler/test/warnings_SUITE.erl @@ -662,6 +662,20 @@ latin1_fallback(Conf) when is_list(Conf) -> {warnings,[{1,compile,reparsing_invalid_unicode}]} }], [] = run(Conf, Ts2), + + Ts3 = [{latin1_fallback3, + %% Test that the compiler fall backs to latin-1 with + %% a warning if a file has no encoding and does not + %% contain correct UTF-8 sequences. + <<"-ifdef(NOTDEFINED). + t(_) -> \"",246,"\"; + t(x) -> ok. + -endif. + ">>, + [], + {warnings,[{2,compile,reparsing_invalid_unicode}]}}], + [] = run(Conf, Ts3), + ok. %%% diff --git a/lib/stdlib/src/epp.erl b/lib/stdlib/src/epp.erl index 9b506b0a44..5f8637c118 100644 --- a/lib/stdlib/src/epp.erl +++ b/lib/stdlib/src/epp.erl @@ -1121,8 +1121,20 @@ skip_toks(From, St, [I|Sis]) -> skip_toks(From, St#epp{location=Cl}, Sis); {ok,_Toks,Cl} -> skip_toks(From, St#epp{location=Cl}, [I|Sis]); - {error,_E,Cl} -> - skip_toks(From, St#epp{location=Cl}, [I|Sis]); + {error,E,Cl} -> + case E of + {_,file_io_server,invalid_unicode} -> + %% The compiler needs to know that there was + %% invalid unicode characters in the file + %% (and there is no point in continuing anyway + %% since io server process has terminated). + epp_reply(From, {error,E}), + leave_file(wait_request(St), St); + _ -> + %% Some other invalid token, such as a bad floating + %% point number. Just ignore it. + skip_toks(From, St#epp{location=Cl}, [I|Sis]) + end; {eof,Cl} -> leave_file(From, St#epp{location=Cl,istk=[I|Sis]}); {error,_E} -> |