diff --git a/lib/elixir/lib/code/normalizer.ex b/lib/elixir/lib/code/normalizer.ex index cf81c378797..96ec5a826db 100644 --- a/lib/elixir/lib/code/normalizer.ex +++ b/lib/elixir/lib/code/normalizer.ex @@ -174,16 +174,17 @@ defmodule Code.Normalizer do # Sigils defp do_normalize({sigil, meta, [{:<<>>, _, args} = string, modifiers]} = quoted, state) - when is_list(args) and is_atom(sigil) do - case Atom.to_string(sigil) do - "sigil_" <> _ -> - meta = - meta - |> patch_meta_line(state.parent_meta) - |> Keyword.put_new(:delimiter, "\"") - - {sigil, meta, [do_normalize(string, %{state | parent_meta: meta}), modifiers]} + when is_atom(sigil) and is_list(args) and is_list(modifiers) do + with "sigil_" <> _ <- Atom.to_string(sigil), + true <- binary_interpolated?(args), + true <- List.ascii_printable?(modifiers) do + meta = + meta + |> patch_meta_line(state.parent_meta) + |> Keyword.put_new(:delimiter, "\"") + {sigil, meta, [do_normalize(string, %{state | parent_meta: meta}), modifiers]} + else _ -> normalize_call(quoted, state) end diff --git a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs index 0f5db7f27bb..cc41cf20eba 100644 --- a/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs +++ b/lib/elixir/test/elixir/code_normalizer/quoted_ast_test.exs @@ -172,6 +172,20 @@ defmodule Code.Normalizer.QuotedASTTest do ) == ~s[~S"""\n"123"\n"""] end + test "regression: invalid sigil calls" do + assert quoted_to_string(quote do: sigil_r(<<"foo", 123>>, [])) == + "sigil_r(<<\"foo\", 123>>, [])" + + assert quoted_to_string(quote do: sigil_r(<<"foo">>, :invalid_modifiers)) == + "sigil_r(\"foo\", :invalid_modifiers)" + + assert quoted_to_string(quote do: sigil_r(<<"foo">>, [:invalid_modifier])) == + "sigil_r(\"foo\", [:invalid_modifier])" + + assert quoted_to_string(quote do: sigil_r(<<"foo">>, [])) == "~r\"foo\"" + assert quoted_to_string(quote do: sigil_r(<<"foo">>, [?a, ?b, ?c])) == "~r\"foo\"abc" + end + test "tuple" do assert quoted_to_string(quote do: {1, 2}) == "{1, 2}" assert quoted_to_string(quote do: {1}) == "{1}"