anchor.diff:      // We don't allow empty literals because that conflicts with sets/maps and is currently useless since we don't allow empty user types
       : '{' k1=ident ':' v1=term { m.put(k1, v1); } ( ',' kn=ident ':' vn=term { m.put(kn, vn); } )* '}'
       ;
  -
  -tupleLiteral returns [Tuples.Literal tt]
  -    @init{ List<Term.Raw> l = new ArrayList<Term.Raw>(); }
  -    @after{ $tt = new Tuples.Literal(l); }
  -    : '(' t1=term { l.add(t1); } ( ',' tn=term { l.add(tn); } )* ')'
  -    ;
  -#endif
  +#endif
  +
  +tupleLiteral returns [shared_ptr<cql3::tuples::literal> tt]
  +    @init{ std::vector<shared_ptr<cql3::term::raw>> l; }
  +    @after{ $tt = ::make_shared<cql3::tuples::literal>(std::move(l)); }
  +    : '(' t1=term { l.push_back(t1); } ( ',' tn=term { l.push_back(tn); } )* ')'
  +    ;
   
   value returns [::shared_ptr<cql3::term::raw> value]
       : c=constant           { $value = c; }
       | l=collectionLiteral  { $value = l; }
   #if 0
       | u=usertypeLiteral    { $value = u; }
  +#endif
       | t=tupleLiteral       { $value = t; }
  -#endif
       | K_NULL               { $value = cql3::constants::NULL_LITERAL; }
       | ':' id=ident         { $value = new_bind_variables(id); }
       | QMARK                { $value = new_bind_variables(shared_ptr<cql3::column_identifier>{}); }
  
positive.code: #include "cql3/sets.hh"
  #include "cql3/lists.hh"
  #include "cql3/type_cast.hh"
  #include "cql3/functions/function_name.hh"
  #include "cql3/functions/function_call.hh"
  #include "core/sstring.hh"
  
negative.code: comparatorType returns [shared_ptr<cql3_type::raw> t]
      : n=native_type     { $t = cql3_type::raw::from(n); }
      | c=collection_type { $t = c; }
      | tt=tuple_type     { $t = tt; }
  #if 0
      | id=userTypeName   { $t = CQL3Type.Raw.userType(id); }
      | K_FROZEN '<' f=comparatorType '>'
        {
  