diff --git a/lib/elixir/src/elixir_quote.erl b/lib/elixir/src/elixir_quote.erl index c68c485bd3..ebe33edf33 100644 --- a/lib/elixir/src/elixir_quote.erl +++ b/lib/elixir/src/elixir_quote.erl @@ -199,7 +199,11 @@ do_escape([], _) -> []; do_escape([H | T], #elixir_quote{unquote=false} = Q) -> - do_quote_simple_list(T, do_escape(H, Q), Q); + case is_list(T) of + true -> [do_escape(H, Q) | do_escape(T, Q)]; + % improper list + false -> [{'|', [], [do_escape(H, Q), do_escape(T, Q)]}] + end; do_escape([H | T], Q) -> %% The improper case is inefficient, but improper lists are rare. diff --git a/lib/elixir/test/elixir/macro_test.exs b/lib/elixir/test/elixir/macro_test.exs index 0c09b31887..ba9889d6b2 100644 --- a/lib/elixir/test/elixir/macro_test.exs +++ b/lib/elixir/test/elixir/macro_test.exs @@ -149,6 +149,9 @@ defmodule MacroTest do test "escapes the content of :quote tuples" do assert Macro.escape({:quote, [%{}], [{}]}) == {:{}, [], [:quote, [{:%{}, [], []}], [{:{}, [], []}]]} + + assert Macro.escape([:foo, {:quote, [%{}], [{}]}]) == + [:foo, {:{}, [], [:quote, [{:%{}, [], []}], [{:{}, [], []}]]}] end test "escape container when a reference cannot be escaped" do