let loc = Ppxlib.Location.none
[%%expect{|
val loc : Warnings.loc =
  {Ppxlib.Location.loc_start =
    {Lexing.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1};
   loc_end =
    {Lexing.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0; pos_cnum = -1};
   loc_ghost = true}
|}]

(* unannotated quotations *)

let _ = [%expr ()]
[%%expect{|
- : Ppxlib.expression =
{Ppxlib_ast.Ast.pexp_desc =
  Ppxlib_ast.Ast.Pexp_construct
   ({Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "()";
     loc =
      {Ppxlib_ast.Ast.loc_start =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_end =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_ghost = true}},
   None);
 pexp_loc =
  {Ppxlib_ast.Ast.loc_start =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_end =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_ghost = true};
 pexp_loc_stack = []; pexp_attributes = []}
|}]

let _ = [%pat? ()]
[%%expect{|
- : Ppxlib.pattern =
{Ppxlib_ast.Ast.ppat_desc =
  Ppxlib_ast.Ast.Ppat_construct
   ({Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "()";
     loc =
      {Ppxlib_ast.Ast.loc_start =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_end =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_ghost = true}},
   None);
 ppat_loc =
  {Ppxlib_ast.Ast.loc_start =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_end =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_ghost = true};
 ppat_loc_stack = []; ppat_attributes = []}
|}]

let _ = [%type: unit]
[%%expect{|
- : Ppxlib.core_type =
{Ppxlib_ast.Ast.ptyp_desc =
  Ppxlib_ast.Ast.Ptyp_constr
   ({Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "unit";
     loc =
      {Ppxlib_ast.Ast.loc_start =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_end =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_ghost = true}},
   []);
 ptyp_loc =
  {Ppxlib_ast.Ast.loc_start =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_end =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_ghost = true};
 ptyp_loc_stack = []; ptyp_attributes = []}
|}]

let _ = [%stri let _ = ()]
[%%expect{|
- : Ppxlib.structure_item =
{Ppxlib_ast.Ast.pstr_desc =
  Ppxlib_ast.Ast.Pstr_value (Ppxlib_ast.Ast.Nonrecursive,
   [{Ppxlib_ast.Ast.pvb_pat =
      {Ppxlib_ast.Ast.ppat_desc = Ppxlib_ast.Ast.Ppat_any;
       ppat_loc =
        {Ppxlib_ast.Ast.loc_start =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_end =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_ghost = true};
       ppat_loc_stack = []; ppat_attributes = []};
     pvb_expr =
      {Ppxlib_ast.Ast.pexp_desc =
        Ppxlib_ast.Ast.Pexp_construct
         ({Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "()";
           loc =
            {Ppxlib_ast.Ast.loc_start =
              {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0;
               pos_bol = 0; pos_cnum = -1};
             loc_end =
              {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0;
               pos_bol = 0; pos_cnum = -1};
             loc_ghost = true}},
         None);
       pexp_loc =
        {Ppxlib_ast.Ast.loc_start =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_end =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_ghost = true};
       pexp_loc_stack = []; pexp_attributes = []};
     pvb_constraint = None; pvb_attributes = [];
     pvb_loc =
      {Ppxlib_ast.Ast.loc_start =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_end =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_ghost = true}}]);
 pstr_loc =
  {Ppxlib_ast.Ast.loc_start =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_end =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_ghost = true}}
|}]

let _ = [%sigi: include S]
[%%expect{|
- : Ppxlib.signature_item =
{Ppxlib_ast.Ast.psig_desc =
  Ppxlib_ast.Ast.Psig_include
   {Ppxlib_ast.Ast.pincl_mod =
     {Ppxlib_ast.Ast.pmty_desc =
       Ppxlib_ast.Ast.Pmty_ident
        {Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "S";
         loc =
          {Ppxlib_ast.Ast.loc_start =
            {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
             pos_cnum = -1};
           loc_end =
            {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
             pos_cnum = -1};
           loc_ghost = true}};
      pmty_loc =
       {Ppxlib_ast.Ast.loc_start =
         {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
          pos_cnum = -1};
        loc_end =
         {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
          pos_cnum = -1};
        loc_ghost = true};
      pmty_attributes = []};
    pincl_loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true};
    pincl_attributes = []};
 psig_loc =
  {Ppxlib_ast.Ast.loc_start =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_end =
    {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
     pos_cnum = -1};
   loc_ghost = true}}
|}]

let _ = [%str let _ = ()]
[%%expect{|
- : Ppxlib_ast.Ast.structure =
[{Ppxlib_ast.Ast.pstr_desc =
   Ppxlib_ast.Ast.Pstr_value (Ppxlib_ast.Ast.Nonrecursive,
    [{Ppxlib_ast.Ast.pvb_pat =
       {Ppxlib_ast.Ast.ppat_desc = Ppxlib_ast.Ast.Ppat_any;
        ppat_loc =
         {Ppxlib_ast.Ast.loc_start =
           {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
            pos_cnum = -1};
          loc_end =
           {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
            pos_cnum = -1};
          loc_ghost = true};
        ppat_loc_stack = []; ppat_attributes = []};
      pvb_expr =
       {Ppxlib_ast.Ast.pexp_desc =
         Ppxlib_ast.Ast.Pexp_construct
          ({Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "()";
            loc =
             {Ppxlib_ast.Ast.loc_start =
               {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0;
                pos_bol = 0; pos_cnum = -1};
              loc_end =
               {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0;
                pos_bol = 0; pos_cnum = -1};
              loc_ghost = true}},
          None);
        pexp_loc =
         {Ppxlib_ast.Ast.loc_start =
           {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
            pos_cnum = -1};
          loc_end =
           {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
            pos_cnum = -1};
          loc_ghost = true};
        pexp_loc_stack = []; pexp_attributes = []};
      pvb_constraint = None; pvb_attributes = [];
      pvb_loc =
       {Ppxlib_ast.Ast.loc_start =
         {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
          pos_cnum = -1};
        loc_end =
         {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
          pos_cnum = -1};
        loc_ghost = true}}]);
  pstr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

let _ = [%sig: include S]
[%%expect{|
- : Ppxlib_ast.Ast.signature =
[{Ppxlib_ast.Ast.psig_desc =
   Ppxlib_ast.Ast.Psig_include
    {Ppxlib_ast.Ast.pincl_mod =
      {Ppxlib_ast.Ast.pmty_desc =
        Ppxlib_ast.Ast.Pmty_ident
         {Ppxlib_ast.Ast.txt = Ppxlib_ast.Ast.Lident "S";
          loc =
           {Ppxlib_ast.Ast.loc_start =
             {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
              pos_cnum = -1};
            loc_end =
             {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
              pos_cnum = -1};
            loc_ghost = true}};
       pmty_loc =
        {Ppxlib_ast.Ast.loc_start =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_end =
          {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
           pos_cnum = -1};
         loc_ghost = true};
       pmty_attributes = []};
     pincl_loc =
      {Ppxlib_ast.Ast.loc_start =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_end =
        {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
         pos_cnum = -1};
       loc_ghost = true};
     pincl_attributes = []};
  psig_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

(* attributes *)

let _ =
  let e = [%expr (() [@attr1])] in
  [%expr [%e e] [@attr2]].pexp_attributes
[%%expect{|
- : Ppxlib_ast.Ast.attributes =
[{Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr1";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}};
 {Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr2";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

let _ =
  let p = [%pat? (() [@attr1])] in
  [%pat? [%p p] [@attr2]].ppat_attributes
[%%expect{|
- : Ppxlib_ast.Ast.attributes =
[{Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr1";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}};
 {Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr2";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

let _ =
  let t = [%type: (unit [@attr1])] in
  [%type: [%t t] [@attr2]].ptyp_attributes
[%%expect{|
- : Ppxlib_ast.Ast.attributes =
[{Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr1";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}};
 {Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr2";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

let _ =
  let extract_module_M m =
    match m with
    | [%stri module M = [%m? m]] -> m
    | _ -> assert false
  in
  let m = extract_module_M [%stri module M = (struct end [@attr1])] in
  (extract_module_M [%stri module M = [%m m] [@attr2]]).pmod_attributes
[%%expect{|
- : Ppxlib_ast.Ast.attributes =
[{Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr1";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}};
 {Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr2";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

let _ =
  let extract_module_ty_S s =
    match s with
    | [%stri module type S = [%m? s]] -> s
    | _ -> assert false
  in
  let s = extract_module_ty_S [%stri module type S = (sig end [@attr1])] in
  (extract_module_ty_S [%stri module type S = [%m s] [@attr2]]).pmty_attributes
[%%expect{|
- : Ppxlib_ast.Ast.attributes =
[{Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr1";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}};
 {Ppxlib_ast.Ast.attr_name =
   {Ppxlib_ast.Ast.txt = "attr2";
    loc =
     {Ppxlib_ast.Ast.loc_start =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_end =
       {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
        pos_cnum = -1};
      loc_ghost = true}};
  attr_payload = Ppxlib_ast.Ast.PStr [];
  attr_loc =
   {Ppxlib_ast.Ast.loc_start =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_end =
     {Ppxlib_ast.Ast.pos_fname = "_none_"; pos_lnum = 0; pos_bol = 0;
      pos_cnum = -1};
    loc_ghost = true}}]
|}]

(* mistyped escapes (not producing ASTs at all) *)

let _ = [%expr [%e ()]]
[%%expect_in <= 5.2 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.expression
|}]
[%%expect_in >= 5.3 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.expression
|}]

let _ = [%pat? [%p ()]]
[%%expect_in <= 5.2 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.pattern
|}]
[%%expect_in >= 5.3 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.pattern
|}]

let _ = [%type: [%t ()]]
[%%expect_in <= 5.2 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.core_type
|}]
[%%expect_in >= 5.3 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.core_type
|}]

let _ = [%stri [%%i ()]]
[%%expect_in <= 5.2 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.structure_item
|}]
[%%expect_in >= 5.3 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.structure_item
|}]

let _ = [%sigi: [%%i ()]]
[%%expect_in <= 5.2 {|
Line _, characters 21-23:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.signature_item
|}]
[%%expect_in >= 5.3 {|
Line _, characters 21-23:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.signature_item
|}]

(* mistyped escapes (not producing ASTs at all) with attributes *)

let _ = [%expr [%e ()] [@attr]]
[%%expect_in <= 5.2 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.expression
|}]
[%%expect_in >= 5.3 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.expression
|}]

let _ = [%pat? [%p ()] [@attr]]
[%%expect_in <= 5.2 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.pattern
|}]
[%%expect_in >= 5.3 {|
Line _, characters 19-21:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.pattern
|}]

let _ = [%type: [%t ()] [@attr]]
[%%expect_in <= 5.2 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.core_type
|}]
[%%expect_in >= 5.3 {|
Line _, characters 20-22:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.core_type
|}]

let _ = [%stri module M = [%m ()] [@attr]]
[%%expect_in <= 5.2 {|
Line _, characters 30-32:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.module_expr
|}]
[%%expect_in >= 5.3 {|
Line _, characters 30-32:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.module_expr
|}]

let _ = [%sigi: module type M = [%m ()] [@attr]]
[%%expect_in <= 5.2 {|
Line _, characters 36-38:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib_ast.Ast.module_type
|}]
[%%expect_in >= 5.3 {|
Line _, characters 36-38:
Error: This expression should not be a unit literal, the expected type is
       Ppxlib.module_type
|}]

(* Coalescing arguments from [fun x -> fun y -> fun z -> ...] to
   [fun x y z -> ...] *)
let _ =
  let e = [%expr fun z -> x + y + z] in
  let f = [%expr fun y -> [%e e]] in
  let func = [%expr fun x -> [%e f]] in
  Format.asprintf "%a" Astlib.Pprintast.expression func
[%%expect{|
- : string = "fun x y z -> (x + y) + z"
|}]
