/* Interface between GCC C++ FE and GDB  -*- c -*-

   Copyright (C) 2014-2021 Free Software Foundation, Inc.

   This file is part of GCC.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */



/* Push namespace NAME as the current binding level, to which
   newly-introduced decls will be bound.  An empty string identifies
   the global namespace, whereas NULL identifies an anonymous
   namespace.  A namespace named NAME is created in the current scope,
   if needed.

   If the newly-created namespace is to be an inline namespace, see
   make_namespace_inline.  */

GCC_METHOD1 (int /* bool */, push_namespace,
	     const char *)	      /* Argument NAME.  */

/* Push TYPE as the current binding level, making its members visible
   for name lookup.  The current scope before the call must be the
   scope in which the class was declared.  This should be used if the
   definition of a class is already finished, but one wishes to define
   a nested class, or to enter the scope of one of its member
   functions.  */

GCC_METHOD1 (int /* bool */, push_class,
	     gcc_type)		/* Argument TYPE.  */

/* Push FUNCTION_DECL as the current (empty) binding level (see
   reactivate_decl).  The current enclosing scope before the call must
   be the scope in which the function was declared.  */

GCC_METHOD1 (int /* bool */, push_function,
	     gcc_decl)	     /* Argument FUNCTION_DECL.  */

/* Make DECL visible (again?) within SCOPE.  When SCOPE is NULL, it
   means the current scope; if it is not NULL, it must name a function
   that is currently active, even if not at the top of the binding
   chain.

   This function can be used to make e.g. a global function or
   variable visible in a namespace or local scope (overriding another
   enclosing definition of the same name), but its most common
   expected use of this primitive, that gives it its name, is to make
   declarations visible again after reentering a function scope,
   because when a function is entered with push_function, that does
   NOT make any of the declarations nested in it visible for name
   lookup.

   There is a reason/excuse for that: unlike namespaces and classes,
   G++ doesn't ever have to reenter function scopes, so its name
   resolution infrastructure is not prepared to do that.  But wait,
   there is also a good use for this apparent limitation: a function
   may contain multiple scopes (blocks), and the name may be bound to
   different symbols in each of these scopes.  With this interface, as
   we reenter a function scope, we may choose which symbols to make
   visible for the code snippet, or, if there could be template
   functions in local scopes, for unresolved names in nested template
   class default arguments, or in nested template function signatures.

   As for making a local declaration visible for the code snippet,
   there are two possibilities: a) introduce it upfront, while
   entering the scope for the user expression (see the enter_scope
   callback, called by g++ when encountering the push_user_expression
   pragma), which might save some scope switching and reactivate_decl
   (though this can't be helped if some declarations have to be
   introduced and discarded, because of multiple definitions of the
   same name in different scopes within a function: they have to be
   defined in discriminator order); or b) introduce it when its name
   is looked up, entering the scope, introducing the declaration,
   leaving the scope, and then reactivating the declaration in its
   local scope.

   Here's some more detail on how reactivate_decl works.  Say there's
   a function foo whose body looks like this:

   {
     {
// point 1
       class c {} o __attribute__ ((__used__)); // c  , o
     }
     struct c {
       void f() {
// point 2
       }
     } o __attribute__ ((__used__));            // c_0, o_0
     {
       class c {} p __attribute__ ((__used__)); // c_1, p
// point 3
       o.f();
     }
   }

   When we are about to define class c at point 1, we enter the
   function foo scope, and since no symbols are visible at point 1, we
   proceed to declare class c.  We may then define the class right
   away, or, if we leave the function scope, and we later wish to
   define it, or to define object o, we can reenter the scope and just
   use the previously-obtained gcc_decl to define the class, without
   having to reactivate the declaration.

   Now, if we are to set up the binding context for point 2, we have
   to define c_0::f, and in order to do so, we have to declare and
   define c_0.  Before we can declare c_0, we MUST at least declare c.

     As a general rule, before we can declare or define any local name
     with a discriminator, we have to at least declare any other
     occurrences of the same name in the same enclosing entity with
     lower or absent discriminator.

   So, we declare c, then we leave the function scope and reenter it
   so as to declare c_0 (also with name "c", which is why we have to
   leave and reenter the function scope, otherwise we would get an
   error because of the duplicate definition; g++ will assign a
   discriminator because it still remembers there was an earlier
   declaration of c_0 within the function, it's just no longer in
   scope), then we can define c_0, including its member function f.

   Likewise, if we wish to define o_0, we have to define o first.  If
   we wish to declare (and maybe then define) c_1, we have to at least
   declare (c and then) c_0 first.

   Then, as we set up the binding context to compile a code snippet at
   point 3, we may choose to activate c_1, o_0 and p upfront,
   declaring and discarding c, c_0 and o, and then reentering the
   funciton scope to declare c_1, o_0 and p; or we can wait for oracle
   lookups of c, o or p.  If c is looked up, and the debugger resolves
   c in the scope to c_1, it is expected to enter the function scope
   from the top level, declare c, leave it, reenter it, declare c_0,
   leave it, reenter it, declare c_1, leave it, and then reactivate
   c_1 in the function scope.  If c_1 is needed as a complete type,
   the definition may be given right after the declaration, or the
   scope will have to be reentered in order to define the class.

.  If the code snippet is at point 2, we don't need to (re)activate
   any declaration: nothing from any local scope is visible.  Just
   entering the scope of the class containing member function f
   reactivates the names of its members, including the class name
   itself.  */

GCC_METHOD2 (int /* bool */, reactivate_decl,
	     gcc_decl,		/* Argument DECL.  */
	     gcc_decl)		/* Argument SCOPE.  */

/* Pop the namespace last entered with push_namespace, or class last
   entered with push_class, or function last entered with
   push_function, restoring the binding level in effect before the
   matching push_* call.  */

GCC_METHOD0 (int /* bool */, pop_binding_level)

/* Return the NAMESPACE_DECL, TYPE_DECL or FUNCTION_DECL of the
   binding level that would be popped by pop_scope.  */

GCC_METHOD0 (gcc_decl, get_current_binding_level_decl)

/* Make the current binding level an inline namespace.  It must be a
   namespace to begin with.  It is safe to call this more than once
   for the same namespace, but after the first call, subsequent ones
   will not return a success status.  */

GCC_METHOD0 (int /* bool */, make_namespace_inline)

/* Add USED_NS to the namespaces used by the current binding level.
   Use get_current_binding_level_decl to obtain USED_NS's
   gcc_decl.  */

GCC_METHOD1 (int /* bool */, add_using_namespace,
	     gcc_decl)			/* Argument USED_NS.  */

/* Introduce a namespace alias declaration, as in:

   namespace foo = [... ::] bar;

   After this call, namespace TARGET will be visible as ALIAS within
   the current namespace.  Get the declaration for TARGET by calling
   get_current_binding_level_decl after pushing into it.  */

GCC_METHOD2 (int /* bool */, add_namespace_alias,
	     const char *,		/* Argument ALIAS.  */
	     gcc_decl)			/* Argument TARGET.  */

/* Introduce a using declaration, as in:

   using foo::bar;

   The TARGET decl names the qualifying scope (foo:: above) and the
   identifier (bar), but that does not mean that only TARGET will be
   brought into the current scope: all bindings of TARGET's identifier
   in the qualifying scope will be brought in.

   FLAGS should specify GCC_CP_SYMBOL_USING.  If the current scope is
   a class scope, visibility flags must be supplied.

   Even when TARGET is template dependent, we don't need to specify
   whether or not it is a typename: the supplied declaration (that
   could be a template-dependent type converted to declaration by
   get_type_decl) indicates so.  */

GCC_METHOD2 (int /* bool */, add_using_decl,
	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
	     gcc_decl)		      /* Argument TARGET.  */

/* Create a new "decl" in GCC, and bind it in the current binding
   level.  A decl is a declaration, basically a kind of symbol.

   NAME is the name of the new symbol.  SYM_KIND is the kind of
   symbol being requested.  SYM_TYPE is the new symbol's C++ type;
   except for labels, where this is not meaningful and should be
   zero.  If SUBSTITUTION_NAME is not NULL, then a reference to this
   decl in the source will later be substituted with a dereference
   of a variable of the given name.  Otherwise, for symbols having
   an address (e.g., functions), ADDRESS is the address.  FILENAME
   and LINE_NUMBER refer to the symbol's source location.  If this
   is not known, FILENAME can be NULL and LINE_NUMBER can be 0.
   This function returns the new decl.

   Use this function to register typedefs, functions and variables to
   namespace and local binding levels, and typedefs, member functions
   (static or not), and static data members to class binding levels.
   Class members must have their access controls specified with
   GCC_CP_ACCESS_* flags in SYM_KIND.

   Note that, since access controls are disabled, we have no means to
   express private, protected and public.

   There are various flags that can be set in SYM_KIND to specify
   additional semantics.  Look for GCC_CP_FLAGs in the definition of
   enum gcc_cp_symbol_kind in gcc-cp-interface.h.

   In order to define member functions, pass GCC_CP_SYMBOL_FUNCTION in
   SYM_KIND, and a function_type for static member functions or a
   method type for non-static member functions, including constructors
   and destructors.  Use build_function_type to create a function
   type; for a method type, start by creating a function type without
   any compiler-introduced artificial arguments (the implicit this
   pointer, and the __in_chrg added to constructors and destructors,
   and __vtt_parm added to the former), and then use build_method_type
   to create the method type out of the class type and the function
   type.

   For operator functions, set GCC_CP_FLAG_SPECIAL_FUNCTION in
   SYM_KIND, in addition to any other applicable flags, and pass as
   NAME a string starting with the two-character mangling for operator
   name: "ps" for unary plus, "mL" for multiply and assign, *=; etc.
   Use "cv" for type converstion operators (the target type portion
   may be omitted, as it is taken from the return type in SYM_TYPE).
   For operator"", use "li" followed by the identifier (the mangled
   name mandates digits specifying the length of the identifier; if
   present, they determine the end of the identifier, otherwise, the
   identifier extents to the end of the string, so that "li3_Kme" and
   "li_Km" are equivalent).

   Constructors and destructors need special care, because for each
   constructor and destructor there may be multiple clones defined
   internally by the compiler.  With build_decl, you can introduce the
   base declaration of a constructor or a destructor, setting
   GCC_CP_FLAG_SPECIAL_FUNCTION the flag and using names starting with
   capital "C" or "D", respectively, followed by a digit (see below),
   a blank, or NUL ('\0').  DO NOT supply an ADDRESS or a
   SUBSTITUTION_NAME to build_decl, it would be meaningless (and
   rejected) for the base declaration; use define_cdtor_clone to
   introduce the address of each clone.  For constructor templates,
   declare the template with build_decl, and then, for each
   specialization, introduce it with
   build_function_template_specialization, and then define the
   addresses of each of its clones with define_cdtor_clone.

   NAMEs for GCC_CP_FLAG_SPECIAL_FUNCTION:

     NAME    meaning
     C?      constructor base declaration (? may be 1, 2, 4, blank or NUL)
     D?      destructor base declaration (? may be 0, 1, 2, 4, blank or NUL)
     nw      operator new
     na      operator new[]
     dl      operator delete
     da      operator delete[]
     ps      operator + (unary)
     ng      operator - (unary)
     ad      operator & (unary)
     de      operator * (unary)
     co      operator ~
     pl      operator +
     mi      operator -
     ml      operator *
     dv      operator /
     rm      operator %
     an      operator &
     or      operator |
     eo      operator ^
     aS      operator =
     pL      operator +=
     mI      operator -=
     mL      operator *=
     dV      operator /=
     rM      operator %=
     aN      operator &=
     oR      operator |=
     eO      operator ^=
     ls      operator <<
     rs      operator >>
     lS      operator <<=
     rS      operator >>=
     eq      operator ==
     ne      operator !=
     lt      operator <
     gt      operator >
     le      operator <=
     ge      operator >=
     nt      operator !
     aa      operator &&
     oo      operator ||
     pp      operator ++
     mm      operator --
     cm      operator ,
     pm      operator ->*
     pt      operator ->
     cl      operator ()
     ix      operator []
     qu      operator ?
     cv      operator <T> (conversion operator)
     li<id>  operator "" <id>

   FIXME: How about attributes?  */

GCC_METHOD7 (gcc_decl, build_decl,
	     const char *,	      /* Argument NAME.  */
	     enum gcc_cp_symbol_kind, /* Argument SYM_KIND.  */
	     gcc_type,		      /* Argument SYM_TYPE.  */
	     const char *,	      /* Argument SUBSTITUTION_NAME.  */
	     gcc_address,	      /* Argument ADDRESS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Supply the ADDRESS of one of the multiple clones of constructor or
   destructor CDTOR.  The clone is specified by NAME, using the
   following name mangling conventions:

     C1      in-charge constructor
     C2      not-in-charge constructor
     C4      unified constructor
     D0      deleting destructor
     D1      in-charge destructor
     D2      not-in-charge destructor
     D4      unified destructor

   The following information is not necessary to use the API.

   C1 initializes an instance of the class (rather than of derived
   classes), including virtual base classes, whereas C2 initializes a
   sub-object (of the given class type) of an instance of some derived
   class (or a full object that doesn't have any virtual base
   classes).

   D0 and D1 destruct an instance of the class, including virtual base
   classes, but only the former calls operator delete to release the
   object's storage at the end; D2 destructs a sub-object (of the
   given class type) of an instance of a derived class (or a full
   object that doesn't have any virtual base classes).

   The [CD]4 manglings (and symbol definitions) are non-standard, but
   GCC uses them in some cases: rather than assuming they are
   in-charge or not-in-charge, they test the implicit argument that
   the others ignore to tell how to behave.  These are used instead of
   cloning when we just can't use aliases.  */

GCC_METHOD3 (gcc_decl, define_cdtor_clone,
	     const char *,	      /* Argument NAME.  */
	     gcc_decl,		      /* Argument CDTOR.  */
	     gcc_address)	      /* Argument ADDRESS.  */

/* Return the type associated with the given declaration.  This is
   most useful to obtain the type associated with a forward-declared
   class, because it is the gcc_type, rather than the gcc_decl, that
   has to be used to build other types, but build_decl returns a
   gcc_decl rather than a gcc_type.  This call can in theory be used
   to obtain the type from any other declaration; it is supposed to
   return the same type that was supplied when the declaration was
   created.  */

GCC_METHOD1 (gcc_type, get_decl_type,
	     gcc_decl)            /* Argument DECL.  */

/* Return the declaration for a type.  */

GCC_METHOD1 (gcc_decl, get_type_decl,
	     gcc_type)            /* Argument TYPE.  */

/* Declare DECL as a friend of the current class scope, if TYPE is
   NULL, or of TYPE itself otherwise.  DECL may be a function or a
   class, be they template generics, template specializations or not
   templates.  TYPE must be a class type (not a template generic).

   The add_friend call cannot introduce a declaration; even if the
   friend is first declared as a friend in the source code, the
   declaration belongs in the enclosing namespace, so it must be
   introduced in that namespace, and the resulting declaration can
   then be made a friend.

   DECL cannot, however, be a member of a template class generic,
   because we have no means to introduce their declarations.  This
   interface has no notion of definitions for template generics.  As a
   consequence, users of this interface must introduce each friend
   template member specialization separately, i.e., instead of:

     template <typename T> friend struct X<T>::M;

   they must be declared as if they were:

     friend struct X<onetype>::M;
     friend struct X<anothertype>::M;
     ... for each specialization of X.


   Specializations of a template can have each others' members as
   friends:

     template <typename T> class foo {
       int f();
       template <typename U> friend int foo<U>::f();
     };

   It wouldn't always be possible to define all specializations of a
   template class before introducing the friend declarations in their
   expanded, per-specialization form.

   In order to simplify such friend declarations, and to enable
   incremental friend declarations as template specializations are
   introduced, add_friend can be called after the befriending class is
   fully defined, passing it a non-NULL TYPE argument naming the
   befriending class type.  */

GCC_METHOD2 (int /* bool */, add_friend,
	     gcc_decl,		      /* Argument DECL.  */
	     gcc_type)		      /* Argument TYPE.  */

/* Return the type of a pointer to a given base type.  */

GCC_METHOD1 (gcc_type, build_pointer_type,
	     gcc_type)			/* Argument BASE_TYPE.  */

/* Return the type of a reference to a given base type.  */

GCC_METHOD2 (gcc_type, build_reference_type,
	     gcc_type,			/* Argument BASE_TYPE.  */
	     enum gcc_cp_ref_qualifiers)   /* Argument RQUALS.  */

/* Create a new pointer-to-member type.  MEMBER_TYPE is the data
   member type, while CLASS_TYPE is the class type containing the data
   member.  For pointers to member functions, MEMBER_TYPE must be a
   method type, and CLASS_TYPE must be specified even though it might
   be possible to extract it from the method type.  */

GCC_METHOD2 (gcc_type, build_pointer_to_member_type,
	     gcc_type,			   /* Argument CLASS_TYPE.  */
	     gcc_type) 			   /* Argument MEMBER_TYPE.  */

/* Start a template parameter list scope and enters it, so that
   subsequent build_type_template_parameter and
   build_value_template_parameter calls create template parameters in
   the list.  The list is closed by a build_decl call with
   GCC_CP_SYMBOL_FUNCTION or GCC_CP_SYMBOL_CLASS, that, when the scope
   is a template parameter list, declares a template function or a
   template class with the then-closed parameter list.  The scope in
   which the new declaration is to be introduced by build_decl must be
   entered before calling start_template_decl, and build_decl returns
   to that scope, from the template parameter list scope, before
   introducing the declaration.  */

GCC_METHOD0 (int /* bool */, start_template_decl)

/* Build a typename template-parameter (e.g., the T in template
   <typename T = X>).  Either PACK_P should be nonzero, to indicate an
   argument pack (the last argument in a variadic template argument
   list, as in template <typename... T>), or DEFAULT_TYPE may be
   non-NULL to set the default type argument (e.g. X) for the template
   parameter.  FILENAME and LINE_NUMBER may specify the source
   location in which the template parameter was declared.  */

GCC_METHOD5 (gcc_type, build_type_template_parameter,
	     const char *,			      /* Argument ID.  */
	     int /* bool */,			  /* Argument PACK_P.  */
	     gcc_type,			    /* Argument DEFAULT_TYPE.  */
	     const char *,			/* Argument FILENAME.  */
	     unsigned int)		     /* Argument LINE_NUMBER.  */

/* Build a template template-parameter (e.g., the T in template
   <template <[...]> class T = X>).  DEFAULT_TEMPL may be non-NULL to
   set the default type-template argument (e.g. X) for the template
   template parameter.  FILENAME and LINE_NUMBER may specify the
   source location in which the template parameter was declared.  */

GCC_METHOD5 (gcc_utempl, build_template_template_parameter,
	     const char *,			      /* Argument ID.  */
	     int /* bool */,			  /* Argument PACK_P.  */
	     gcc_utempl,		   /* Argument DEFAULT_TEMPL.  */
	     const char *,			/* Argument FILENAME.  */
	     unsigned int)		     /* Argument LINE_NUMBER.  */

/* Build a value template-parameter (e.g., the V in template <typename
   T, T V> or in template <int V = X>).  DEFAULT_VALUE may be non-NULL
   to set the default value argument for the template parameter (e.g.,
   X).  FILENAME and LINE_NUMBER may specify the source location in
   which the template parameter was declared.  */

GCC_METHOD5 (gcc_decl, build_value_template_parameter,
	     gcc_type,			  	    /* Argument TYPE.  */
	     const char *,			      /* Argument ID.  */
	     gcc_expr,			   /* Argument DEFAULT_VALUE.  */
	     const char *,			/* Argument FILENAME.  */
	     unsigned int)		     /* Argument LINE_NUMBER.  */

/* Build a template-dependent typename (e.g., typename T::bar or
   typename T::template bart<X>).  ENCLOSING_TYPE should be the
   template-dependent nested name specifier (e.g., T), ID should be
   the name of the member of the ENCLOSING_TYPE (e.g., bar or bart),
   and TARGS should be non-NULL and specify the template arguments
   (e.g. <X>) iff ID is to name a class template.

   In this and other calls, a template-dependent nested name specifier
   may be a template class parameter (build_type_template_parameter),
   a specialization (returned by build_dependent_type_template_id) of
   a template template parameter (returned by
   build_template_template_parameter) or a member type thereof
   (returned by build_dependent_typename itself).  */

GCC_METHOD3 (gcc_type, build_dependent_typename,
	     gcc_type,			  /* Argument ENCLOSING_TYPE.  */
	     const char *,			      /* Argument ID.  */
	     const struct gcc_cp_template_args *)  /* Argument TARGS.  */

/* Build a template-dependent class template (e.g., T::template bart).
   ENCLOSING_TYPE should be the template-dependent nested name
   specifier (e.g., T), ID should be the name of the class template
   member of the ENCLOSING_TYPE (e.g., bart).  */

GCC_METHOD2 (gcc_utempl, build_dependent_class_template,
	     gcc_type,			  /* Argument ENCLOSING_TYPE.  */
	     const char *)			      /* Argument ID.  */

/* Build a template-dependent type template-id (e.g., T<A>).
   TEMPLATE_DECL should be a template template parameter (e.g., the T
   in template <template <[...]> class T = X>), and TARGS should
   specify the template arguments (e.g. <A>).  */

GCC_METHOD2 (gcc_type, build_dependent_type_template_id,
	     gcc_utempl,		   /* Argument TEMPLATE_DECL.  */
	     const struct gcc_cp_template_args *)  /* Argument TARGS.  */

/* Build a template-dependent expression (e.g., S::val or S::template
   mtf<X>, or unqualified f or template tf<X>).

   ENCLOSING_SCOPE should be a template-dependent nested name
   specifier (e.g., T), a resolved namespace or class decl, or NULL
   for unqualified names; ID should be the name of the member of the
   ENCLOSING_SCOPE (e.g., val or mtf) or unqualified overloaded
   function; and TARGS should list template arguments (e.g. <X>) when
   mtf or tf are to name a template function, or be NULL otherwise.

   Unqualified names and namespace- or class-qualified names can only
   resolve to overloaded functions, to be used in contexts that
   involve overload resolution that cannot be resolved because of
   template-dependent argument or return types, such as call
   expressions with template-dependent arguments, conversion
   expressions to function types with template-dependent argument
   types or the like.  Other cases of unqualified or
   non-template-dependent-qualified names should NOT use this
   function, and use decl_expr to convert the appropriate function or
   object declaration to an expression.

   If ID is the name of a special member function, FLAGS should be
   GCC_CP_SYMBOL_FUNCTION|GCC_CP_FLAG_SPECIAL_FUNCTION, and ID should
   be one of the encodings for special member functions documented in
   build_decl.  Otherwise, FLAGS should be GCC_CP_SYMBOL_MASK, which
   suggests the symbol kind is not known (though we know it is not a
   type).

   If ID denotes a conversion operator, CONV_TYPE should name the
   target type of the conversion.  Otherwise, CONV_TYPE must be
   NULL.  */

GCC_METHOD5 (gcc_expr, build_dependent_expr,
	     gcc_decl,			 /* Argument ENCLOSING_SCOPE.  */
	     enum gcc_cp_symbol_kind,		   /* Argument FLAGS.  */
	     const char *,			    /* Argument NAME.  */
	     gcc_type,			       /* Argument CONV_TYPE.  */
	     const struct gcc_cp_template_args *)  /* Argument TARGS.  */

/* Build a gcc_expr for the value VALUE in type TYPE.  */

GCC_METHOD2 (gcc_expr, build_literal_expr,
	     gcc_type,		  /* Argument TYPE.  */
	     unsigned long)	  /* Argument VALUE.  */

/* Build a gcc_expr that denotes DECL, the declaration of a variable
   or function in namespace scope, or of a static member variable or
   function.  Use QUALIFIED_P to build the operand of unary & so as to
   compute a pointer-to-member, rather than a regular pointer.  */

GCC_METHOD2 (gcc_expr, build_decl_expr,
	     gcc_decl,			/* Argument DECL.  */
	     int /* bool */)		/* Argument QUALIFIED_P.  */

/* Build a gcc_expr that denotes the unary operation UNARY_OP applied
   to the gcc_expr OPERAND.  For non-expr operands, see
   unary_type_expr.  Besides the UNARY_OP encodings used for operator
   names, we support "pp_" for preincrement, and "mm_" for
   predecrement, "nx" for noexcept, "tw" for throw, "tr" for rethrow
   (pass NULL as the operand), "te" for typeid, "sz" for sizeof, "az"
   for alignof, "dl" for delete, "gsdl" for ::delete, "da" for
   delete[], "gsda" for ::delete[], "sp" for pack expansion, "sZ" for
   sizeof...(function argument pack).  */

GCC_METHOD2 (gcc_expr, build_unary_expr,
	     const char *,	  /* Argument UNARY_OP.  */
	     gcc_expr)		  /* Argument OPERAND.  */

/* Build a gcc_expr that denotes the binary operation BINARY_OP
   applied to gcc_exprs OPERAND1 and OPERAND2.  Besides the BINARY_OP
   encodings used for operator names, we support "ds" for the operator
   token ".*" and "dt" for the operator token ".".  When using
   operators that take a name as their second operand ("." and "->")
   use decl_expr to convert the gcc_decl of the member name to a
   gcc_expr, if the member name wasn't created with
   e.g. build_dependent_expr.  */

GCC_METHOD3 (gcc_expr, build_binary_expr,
	     const char *,	  /* Argument BINARY_OP.  */
	     gcc_expr,		  /* Argument OPERAND1.  */
	     gcc_expr)		  /* Argument OPERAND2.  */

/* Build a gcc_expr that denotes the ternary operation TERNARY_OP
   applied to gcc_exprs OPERAND1, OPERAND2 and OPERAND3.  The only
   supported TERNARY_OP is "qu", for the "?:" operator.  */

GCC_METHOD4 (gcc_expr, build_ternary_expr,
	     const char *,	  /* Argument TERNARY_OP.  */
	     gcc_expr,		  /* Argument OPERAND1.  */
	     gcc_expr,		  /* Argument OPERAND2.  */
	     gcc_expr)		  /* Argument OPERAND3.  */

/* Build a gcc_expr that denotes the unary operation UNARY_OP applied
   to the gcc_type OPERAND.  Supported unary operations taking types
   are "ti" for typeid, "st" for sizeof, "at" for alignof, and "sZ"
   for sizeof...(template argument pack).  */

GCC_METHOD2 (gcc_expr, build_unary_type_expr,
	     const char *,	  /* Argument UNARY_OP.  */
	     gcc_type)		  /* Argument OPERAND.  */

/* Build a gcc_expr that denotes the binary operation BINARY_OP
   applied to gcc_type OPERAND1 and gcc_expr OPERAND2.  Use this for
   all kinds of (single-argument) type casts ("dc", "sc", "cc", "rc"
   for dynamic, static, const and reinterpret casts, respectively;
   "cv" for functional or C-style casts).  */

GCC_METHOD3 (gcc_expr, build_cast_expr,
	     const char *,	  /* Argument BINARY_OP.  */
	     gcc_type,		  /* Argument OPERAND1.  */
	     gcc_expr)		  /* Argument OPERAND2.  */

/* Build a gcc_expr that denotes the conversion of an expression list
   VALUES to TYPE, with ("tl") or without ("cv") braces, or a braced
   initializer list of unspecified type (e.g., a component of another
   braced initializer list; pass "il" for CONV_OP, and NULL for
   TYPE).  */

GCC_METHOD3 (gcc_expr, build_expression_list_expr,
	     const char *,			 /* Argument CONV_OP.  */
	     gcc_type,				    /* Argument TYPE.  */
	     const struct gcc_cp_function_args *) /* Argument VALUES.  */

/* Build a gcc_expr that denotes a new ("nw") or new[] ("na")
   expression of TYPE, with or without a GLOBAL_NS qualifier (prefix
   the NEW_OP with "gs"), with or without PLACEMENT, with or without
   INITIALIZER.  If it's not a placement new, PLACEMENT must be NULL
   (rather than a zero-length placement arg list).  If there's no
   specified initializer, INITIALIZER must be NULL; a zero-length arg
   list stands for a default initializer.  */

GCC_METHOD4 (gcc_expr, build_new_expr,
	     const char *,			       /* Argument NEW_OP.  */
	     const struct gcc_cp_function_args *,   /* Argument PLACEMENT.  */
	     gcc_type,					 /* Argument TYPE.  */
	     const struct gcc_cp_function_args *) /* Argument INITIALIZER.  */

/* Return a call expression that calls CALLABLE with arguments ARGS.
   CALLABLE may be a function, a callable object, a pointer to
   function, an unresolved expression, an unresolved overload set, an
   object expression combined with a member function overload set or a
   pointer-to-member.  If QUALIFIED_P, CALLABLE will be interpreted as
   a qualified name, preventing virtual function dispatch.  */

GCC_METHOD3 (gcc_expr, build_call_expr,
	     gcc_expr,			      /* Argument CALLABLE.  */
	     int /* bool */,		   /* Argument QUALIFIED_P.  */
	     const struct gcc_cp_function_args *) /* Argument ARGS.  */

/* Return the type of the gcc_expr OPERAND.
   Use this for decltype.
   For decltype (auto), pass a NULL OPERAND.

   Note: for template-dependent expressions, the result is NULL,
   because the type is only computed when template argument
   substitution is performed.  */

GCC_METHOD1 (gcc_type, get_expr_type,
	     gcc_expr)		  /* Argument OPERAND.  */

/* Introduce a specialization of a template function.

   TEMPLATE_DECL is the template function, and TARGS are the arguments
   for the specialization.  ADDRESS is the address of the
   specialization.  FILENAME and LINE_NUMBER specify the source
   location associated with the template function specialization.  */

GCC_METHOD5 (gcc_decl, build_function_template_specialization,
	     gcc_decl,			   /* Argument TEMPLATE_DECL.  */
	     const struct gcc_cp_template_args *,  /* Argument TARGS.  */
	     gcc_address,			 /* Argument ADDRESS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Specialize a template class as an incomplete type.  A definition
   can be supplied later, with start_class_type.

   TEMPLATE_DECL is the template class, and TARGS are the arguments
   for the specialization.  FILENAME and LINE_NUMBER specify the
   source location associated with the template class
   specialization.  */

GCC_METHOD4 (gcc_decl, build_class_template_specialization,
	     gcc_decl,			   /* Argument TEMPLATE_DECL.  */
	     const struct gcc_cp_template_args *,  /* Argument TARGS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Start defining a 'class', 'struct' or 'union' type, entering its
   own binding level.  Initially it has no fields.

   TYPEDECL is the forward-declaration of the type, returned by
   build_decl.  BASE_CLASSES indicate the base classes of class NAME.
   FILENAME and LINE_NUMBER specify the source location associated
   with the class definition, should they be different from those of
   the forward declaration.  */

GCC_METHOD4 (gcc_type, start_class_type,
	     gcc_decl,		      /* Argument TYPEDECL.  */
	     const struct gcc_vbase_array *,/* Argument BASE_CLASSES.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Create a new closure class type, record it as the
   DISCRIMINATOR-numbered closure type in the current scope (or
   associated with EXTRA_SCOPE, if non-NULL), and enter the closure
   type's own binding level.  This primitive would sort of combine
   build_decl and start_class_type, if they could be used to introduce
   a closure type.  Initially it has no fields.

   FILENAME and LINE_NUMBER specify the source location associated
   with the class.  EXTRA_SCOPE, if non-NULL, must be a PARM_DECL of
   the current function, or a FIELD_DECL of the current class.  If it
   is NULL, the current scope must be a function.  */

GCC_METHOD5 (gcc_type, start_closure_class_type,
	     int,		      /* Argument DISCRIMINATOR.  */
	     gcc_decl,		      /* Argument EXTRA_SCOPE.  */
	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Add a non-static data member to the most-recently-started
   unfinished struct or union type.  FIELD_NAME is the field's name.
   FIELD_TYPE is the type of the field.  BITSIZE and BITPOS indicate
   where in the struct the field occurs.  */

GCC_METHOD5 (gcc_decl, build_field,
	     const char *,		   /* Argument FIELD_NAME.  */
	     gcc_type,			   /* Argument FIELD_TYPE.  */
	     enum gcc_cp_symbol_kind,	   /* Argument FIELD_FLAGS.  */
	     unsigned long,		   /* Argument BITSIZE.  */
	     unsigned long)		   /* Argument BITPOS.  */

/* After all the fields have been added to a struct, class or union,
   the struct or union type must be "finished".  This does some final
   cleanups in GCC, and pops to the binding level that was in effect
   before the matching start_class_type or
   start_closure_class_type.  */

GCC_METHOD1 (int /* bool */, finish_class_type,
	     unsigned long)		   /* Argument SIZE_IN_BYTES.  */

/* Create a new 'enum' type, and record it in the current binding
   level.  The new type initially has no associated constants.

   NAME is the enum name.  FILENAME and LINE_NUMBER specify its source
   location.  */

GCC_METHOD5 (gcc_type, start_enum_type,
	     const char *,	      /* Argument NAME.  */
	     gcc_type,		      /* Argument UNDERLYING_INT_TYPE. */
	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
	     const char *,	      /* Argument FILENAME.  */
	     unsigned int)	      /* Argument LINE_NUMBER.  */

/* Add a new constant to an enum type.  NAME is the constant's name
   and VALUE is its value.  Returns a gcc_decl for the constant.  */

GCC_METHOD3 (gcc_decl, build_enum_constant,
	     gcc_type,		       /* Argument ENUM_TYPE.  */
	     const char *,	       /* Argument NAME.  */
	     unsigned long)	       /* Argument VALUE.  */

/* After all the constants have been added to an enum, the type must
   be "finished".  This does some final cleanups in GCC.  */

GCC_METHOD1 (int /* bool */, finish_enum_type,
	     gcc_type)		       /* Argument ENUM_TYPE.  */

/* Create a new function type.  RETURN_TYPE is the type returned by
   the function, and ARGUMENT_TYPES is a vector, of length NARGS, of
   the argument types.  IS_VARARGS is true if the function is
   varargs.  */

GCC_METHOD3 (gcc_type, build_function_type,
	     gcc_type,			   /* Argument RETURN_TYPE.  */
	     const struct gcc_type_array *,/* Argument ARGUMENT_TYPES.  */
	     int /* bool */)		   /* Argument IS_VARARGS.  */

/* Create a variant of a function type with an exception
   specification.  FUNCTION_TYPE is a function or method type.
   EXCEPT_TYPES is an array with the list of exception types.  Zero as
   the array length implies throw() AKA noexcept(true); NULL as the
   pointer to gcc_type_array implies noexcept(false), which is almost
   equivalent (but distinguishable by the compiler) to an unspecified
   exception list.  */

GCC_METHOD2 (gcc_type, build_exception_spec_variant,
	     gcc_type,			   /* Argument FUNCTION_TYPE.  */
	     const struct gcc_type_array *)/* Argument EXCEPT_TYPES.  */

/* Create a new non-static member function type.  FUNC_TYPE is the
   method prototype, without the implicit THIS pointer, added as a
   pointer to the QUALS-qualified CLASS_TYPE.  If CLASS_TYPE is NULL,
   this creates a cv-qualified (member) function type not associated
   with any specific class, as needed to support "typedef void f(int)
   const;", which can later be used to declare member functions and
   pointers to member functions.  */

GCC_METHOD4 (gcc_type, build_method_type,
	     gcc_type,			   /* Argument CLASS_TYPE.  */
	     gcc_type, 			   /* Argument FUNC_TYPE.  */
	     enum gcc_cp_qualifiers,	   /* Argument QUALS.  */
	     enum gcc_cp_ref_qualifiers)   /* Argument RQUALS.  */

/* Return a declaration for the (INDEX - 1)th argument of
   FUNCTION_DECL, i.e., for the first argument, use zero as the index.
   If FUNCTION_DECL is a non-static member function, use -1 to get the
   implicit THIS parameter.  */

GCC_METHOD2 (gcc_decl, get_function_parameter_decl,
	     gcc_decl,			     /* Argument FUNCTION_DECL.  */
	     int)				     /* Argument INDEX.  */

/* Return a lambda expr that constructs an instance of CLOSURE_TYPE.
   Only lambda exprs without any captures can be correctly created
   through these mechanisms; that's all we need to support lambdas
   expressions in default parameters, the only kind that may have to
   be introduced through this interface.  */

GCC_METHOD1 (gcc_expr, build_lambda_expr,
	     gcc_type)			      /* Argument CLOSURE_TYPE.  */

/* Return an integer type with the given properties.  If BUILTIN_NAME
   is non-NULL, it must name a builtin integral type with the given
   signedness and size, and that is the type that will be returned.  */

GCC_METHOD3 (gcc_type, get_int_type,
	     int /* bool */,		   /* Argument IS_UNSIGNED.  */
	     unsigned long,                /* Argument SIZE_IN_BYTES.  */
	     const char *)		   /* Argument BUILTIN_NAME.  */

/* Return the 'char' type, a distinct type from both 'signed char' and
   'unsigned char' returned by int_type.  */

GCC_METHOD0 (gcc_type, get_char_type)

/* Return a floating point type with the given properties.  If BUILTIN_NAME
   is non-NULL, it must name a builtin integral type with the given
   signedness and size, and that is the type that will be returned.  */

GCC_METHOD2 (gcc_type, get_float_type,
	     unsigned long,                /* Argument SIZE_IN_BYTES.  */
	     const char *)		   /* Argument BUILTIN_NAME.  */

/* Return the 'void' type.  */

GCC_METHOD0 (gcc_type, get_void_type)

/* Return the 'bool' type.  */

GCC_METHOD0 (gcc_type, get_bool_type)

/* Return the std::nullptr_t type.  */

GCC_METHOD0 (gcc_type, get_nullptr_type)

/* Return the nullptr constant.  */

GCC_METHOD0 (gcc_expr, get_nullptr_constant)

/* Create a new array type.  If NUM_ELEMENTS is -1, then the array
   is assumed to have an unknown length.  */

GCC_METHOD2 (gcc_type, build_array_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     int)			  /* Argument NUM_ELEMENTS.  */

/* Create a new array type.  NUM_ELEMENTS is a template-dependent
   expression.  */

GCC_METHOD2 (gcc_type, build_dependent_array_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     gcc_expr)			  /* Argument NUM_ELEMENTS.  */

/* Create a new variably-sized array type.  UPPER_BOUND_NAME is the
   name of a local variable that holds the upper bound of the array;
   it is one less than the array size.  */

GCC_METHOD2 (gcc_type, build_vla_array_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     const char *)		  /* Argument UPPER_BOUND_NAME.  */

/* Return a qualified variant of a given base type.  QUALIFIERS says
   which qualifiers to use; it is composed of or'd together
   constants from 'enum gcc_cp_qualifiers'.  */

GCC_METHOD2 (gcc_type, build_qualified_type,
	     gcc_type,			      /* Argument UNQUALIFIED_TYPE.  */
	     enum gcc_cp_qualifiers)	      /* Argument QUALIFIERS.  */

/* Build a complex type given its element type.  */

GCC_METHOD1 (gcc_type, build_complex_type,
	     gcc_type)			  /* Argument ELEMENT_TYPE.  */

/* Build a vector type given its element type and number of
   elements.  */

GCC_METHOD2 (gcc_type, build_vector_type,
	     gcc_type,			  /* Argument ELEMENT_TYPE.  */
	     int)			  /* Argument NUM_ELEMENTS.  */

/* Build a constant.  NAME is the constant's name and VALUE is its
   value.  FILENAME and LINE_NUMBER refer to the type's source
   location.  If this is not known, FILENAME can be NULL and
   LINE_NUMBER can be 0.  */

GCC_METHOD5 (int /* bool */, build_constant,
	     gcc_type,		  /* Argument TYPE.  */
	     const char *,	  /* Argument NAME.  */
	     unsigned long,	  /* Argument VALUE.  */
	     const char *,	  /* Argument FILENAME.  */
	     unsigned int)	  /* Argument LINE_NUMBER.  */

/* Emit an error and return an error type object.  */

GCC_METHOD1 (gcc_type, error,
	     const char *)		 /* Argument MESSAGE.  */

/* Declare a static_assert with the given CONDITION and ERRORMSG at
   FILENAME:LINE_NUMBER.  */

GCC_METHOD4 (int /* bool */, add_static_assert,
	     gcc_expr,     /* Argument CONDITION.  */
	     const char *, /* Argument ERRORMSG.  */
	     const char *, /* Argument FILENAME.  */
	     unsigned int) /* Argument LINE_NUMBER.  */

#if 0

/* FIXME: We don't want to expose the internal implementation detail
   that default parms are stored in function types, and it's not clear
   how this or other approaches would interact with the type sharing
   of e.g. ctor clones, so we're leaving this out, since default args
   are not even present in debug information anyway.  Besides, the set
   of default args for a function may grow within its scope, and vary
   independently in other scopes.  */

/* Create a modified version of a function type that has default
   values for some of its arguments.  The returned type should ONLY be
   used to define functions or methods, never to declare parameters,
   variables, types or the like.

   DEFAULTS must have at most as many N_ELEMENTS as there are
   arguments without default values in FUNCTION_TYPE.  Say, if
   FUNCTION_TYPE has an argument list such as (T1, T2, T3, T4 = V0)
   and DEFAULTS has 2 elements (V1, V2), the returned type will have
   the following argument list: (T1, T2 = V1, T3 = V2, T4 = V0).

   Any NULL expressions in DEFAULTS will be marked as deferred, and
   they should be filled in with set_deferred_function_default_args.  */

GCC_METHOD2 (gcc_type, add_function_default_args,
	     gcc_type,			     /* Argument FUNCTION_TYPE.  */
	     const struct gcc_cp_function_args *) /* Argument DEFAULTS.  */

/* Fill in the first deferred default args in FUNCTION_DECL with the
   expressions given in DEFAULTS.  This can be used when the
   declaration of a parameter is needed to create a default
   expression, such as taking the size of an earlier parameter, or
   building a lambda expression in the parameter's context.  */

GCC_METHOD2 (int /* bool */, set_deferred_function_default_args,
	     gcc_decl,			     /* Argument FUNCTION_DECL.  */
	     const struct gcc_cp_function_args *) /* Argument DEFAULTS.  */

#endif


/* When you add entry points, add them at the end, so that the new API
   version remains compatible with the old version.

   The following conventions have been observed as to naming entry points:

   - build_* creates (and maybe records) something and returns it;
   - add_* creates and records something, but doesn't return it;
   - get_* obtains something without creating it;
   - start_* marks the beginning of a compound (type, list, ...);
   - finish_* completes the compound when needed.

  Entry points that return an int (bool) and don't have a return value
  specification return nonzero (true) on success and zero (false) on
  failure.  This is in line with libcc1's conventions of returning a
  zero-initialized value in case of e.g. a transport error.  */
