diff options
author | Per Gustafsson <pergu@fb.com> | 2021-08-23 09:33:51 +0100 |
---|---|---|
committer | Per Gustafsson <pergu@fb.com> | 2021-08-23 09:33:51 +0100 |
commit | 1aa9de4f4164708b2ce5f1cafe0b217099648705 (patch) | |
tree | bfaf0d0f69f59f1a4f923016953a4417b66cee9f /lib/stdlib | |
parent | 2d496b309061cdbb63cc05be959f92c1ecb17fb8 (diff) | |
download | erlang-1aa9de4f4164708b2ce5f1cafe0b217099648705.tar.gz |
Fix inconsistency in defining ?FILE macro
This happens when the source_name is explicitly defined as an option to epp:parse_file/2. Before an include it got expanded to the actual file name, after an include it was defined as the source_name. With this change it will always be the source_name.
This come up when using --deterministic mode to compile causing the output to be less deterministic if you use the ?FILE macro before any includes.
Diffstat (limited to 'lib/stdlib')
-rw-r--r-- | lib/stdlib/src/epp.erl | 3 | ||||
-rw-r--r-- | lib/stdlib/test/epp_SUITE.erl | 21 | ||||
-rw-r--r-- | lib/stdlib/test/epp_SUITE_data/file_macro.erl | 9 | ||||
-rw-r--r-- | lib/stdlib/test/epp_SUITE_data/file_macro.hrl | 0 |
4 files changed, 26 insertions, 7 deletions
diff --git a/lib/stdlib/src/epp.erl b/lib/stdlib/src/epp.erl index 9db34afdad..bf944156fa 100644 --- a/lib/stdlib/src/epp.erl +++ b/lib/stdlib/src/epp.erl @@ -593,7 +593,7 @@ server(Pid, Name, Options) -> init_server(Pid, FileName, Options, St0) -> SourceName = proplists:get_value(source_name, Options, FileName), Pdm = proplists:get_value(macros, Options, []), - Ms0 = predef_macros(FileName), + Ms0 = predef_macros(SourceName), case user_predef(Pdm, Ms0) of {ok,Ms1} -> DefEncoding = proplists:get_value(default_encoding, Options, @@ -1915,4 +1915,3 @@ interpret_file_attr([Form0 | Forms], Delta, Fs) -> [Form | interpret_file_attr(Forms, Delta, Fs)]; interpret_file_attr([], _Delta, _Fs) -> []. - diff --git a/lib/stdlib/test/epp_SUITE.erl b/lib/stdlib/test/epp_SUITE.erl index 8ec9b7acb8..ae4ca3cd2c 100644 --- a/lib/stdlib/test/epp_SUITE.erl +++ b/lib/stdlib/test/epp_SUITE.erl @@ -18,7 +18,7 @@ %% %CopyrightEnd% -module(epp_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2]). -export([rec_1/1, include_local/1, predef_mac/1, @@ -29,7 +29,7 @@ otp_8562/1, otp_8665/1, otp_8911/1, otp_10302/1, otp_10820/1, otp_11728/1, encoding/1, extends/1, function_macro/1, test_error/1, test_warning/1, otp_14285/1, - test_if/1,source_name/1,otp_16978/1,otp_16824/1,scan_file/1]). + test_if/1,source_name/1,otp_16978/1,otp_16824/1,scan_file/1,file_macro/1]). -export([epp_parse_erl_form/2]). @@ -63,16 +63,16 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,1}}]. -all() -> +all() -> [rec_1, {group, upcase_mac}, include_local, predef_mac, {group, variable}, otp_4870, otp_4871, otp_5362, pmod, not_circular, skip_header, otp_6277, gh_4995, otp_7702, otp_8130, overload_mac, otp_8388, otp_8470, otp_8562, otp_8665, otp_8911, otp_10302, otp_10820, otp_11728, encoding, extends, function_macro, test_error, test_warning, - otp_14285, test_if, source_name, otp_16978, otp_16824, scan_file]. + otp_14285, test_if, source_name, otp_16978, otp_16824, scan_file, file_macro]. -groups() -> +groups() -> [{upcase_mac, [], [upcase_mac_1, upcase_mac_2]}, {variable, [], [variable_1]}]. @@ -113,6 +113,17 @@ include_local(Config) when is_list(Config) -> [ FileLine || {attribute,_,file,FileLine} <- List ], ok. +file_macro(Config) when is_list(Config) -> + DataDir = proplists:get_value(data_dir, Config), + File = filename:join(DataDir, "file_macro.erl"), + {ok, List} = epp:parse_file(File, [{includes, [DataDir]}, + {source_name, "Other source"}]), + %% Both attribute a and b are defined as ?FILE, they should be the same + {attribute,_,a,FileA} = lists:keyfind(a, 3, List), + {attribute,_,b,FileB} = lists:keyfind(b, 3, List), + "Other source" = FileA = FileB, + ok. + %%% Here is a little reimplementation of epp:parse_file, which times out %%% after 4 seconds if the epp server doesn't respond. If we use the %%% regular epp:parse_file, the test case will time out, and then epp diff --git a/lib/stdlib/test/epp_SUITE_data/file_macro.erl b/lib/stdlib/test/epp_SUITE_data/file_macro.erl new file mode 100644 index 0000000000..b30d237363 --- /dev/null +++ b/lib/stdlib/test/epp_SUITE_data/file_macro.erl @@ -0,0 +1,9 @@ +-module(file_macro). + +-export([]). + +-a(?FILE). + +-include("file_macro.hrl"). + +-b(?FILE). diff --git a/lib/stdlib/test/epp_SUITE_data/file_macro.hrl b/lib/stdlib/test/epp_SUITE_data/file_macro.hrl new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/lib/stdlib/test/epp_SUITE_data/file_macro.hrl |