This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [libcc1] add support for C++


Here are the incremental changes that, together, address all of your
feedback (thanks!), but separated in logically-related patches.  In a
separate message, I'll post an updated, consolidated patch.


Rename ansi_*opname; export cp_literal_operator_id

diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 024519d..561b26b 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -4332,7 +4332,7 @@ build_op_call_1 (tree obj, vec<tree, va_gc> **args, tsubst_flags_t complain)
 
   if (TYPE_BINFO (type))
     {
-      fns = lookup_fnfields (TYPE_BINFO (type), ansi_opname (CALL_EXPR), 1);
+      fns = lookup_fnfields (TYPE_BINFO (type), cp_operator_id (CALL_EXPR), 1);
       if (fns == error_mark_node)
 	return error_mark_node;
     }
@@ -5039,7 +5039,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
       add_builtin_candidates (&candidates,
 			      COND_EXPR,
 			      NOP_EXPR,
-			      ansi_opname (COND_EXPR),
+			      cp_operator_id (COND_EXPR),
 			      args,
 			      LOOKUP_NORMAL, complain);
 
@@ -5455,10 +5455,10 @@ build_new_op_1 (location_t loc, enum tree_code code, int flags, tree arg1,
     {
       code2 = TREE_CODE (arg3);
       arg3 = NULL_TREE;
-      fnname = ansi_assopname (code2);
+      fnname = cp_assignment_operator_id (code2);
     }
   else
-    fnname = ansi_opname (code);
+    fnname = cp_operator_id (code);
 
   arg1 = prep_operand (arg1);
 
@@ -6009,7 +6009,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
 
   type = strip_array_types (TREE_TYPE (TREE_TYPE (addr)));
 
-  fnname = ansi_opname (code);
+  fnname = cp_operator_id (code);
 
   if (CLASS_TYPE_P (type)
       && COMPLETE_TYPE_P (complete_type (type))
@@ -8072,7 +8072,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
 	      || name == complete_dtor_identifier
 	      || name == base_dtor_identifier
 	      || name == deleting_dtor_identifier
-	      || name == ansi_assopname (NOP_EXPR));
+	      || name == cp_assignment_operator_id (NOP_EXPR));
   if (TYPE_P (binfo))
     {
       /* Resolve the name.  */
@@ -8100,7 +8100,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args,
       if (!same_type_ignoring_top_level_qualifiers_p
 	  (TREE_TYPE (instance), BINFO_TYPE (binfo)))
 	{
-	  if (name != ansi_assopname (NOP_EXPR))
+	  if (name != cp_assignment_operator_id (NOP_EXPR))
 	    /* For constructors and destructors, either the base is
 	       non-virtual, or it is virtual but we are doing the
 	       conversion from a constructor or destructor for the
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a4f3c6b..7a9e5dd 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -3217,7 +3217,7 @@ static tree
 dfs_declare_virt_assop_and_dtor (tree binfo, void *data)
 {
   tree bv, fn, t = (tree)data;
-  tree opname = ansi_assopname (NOP_EXPR);
+  tree opname = cp_assignment_operator_id (NOP_EXPR);
 
   gcc_assert (t && CLASS_TYPE_P (t));
   gcc_assert (binfo && TREE_CODE (binfo) == TREE_BINFO);
@@ -5288,7 +5288,7 @@ vbase_has_user_provided_move_assign (tree type)
 {
   /* Does the type itself have a user-provided move assignment operator?  */
   for (tree fns
-	 = lookup_fnfields_slot_nolazy (type, ansi_assopname (NOP_EXPR));
+	 = lookup_fnfields_slot_nolazy (type, cp_assignment_operator_id (NOP_EXPR));
        fns; fns = OVL_NEXT (fns))
     {
       tree fn = OVL_CURRENT (fns);
@@ -5452,7 +5452,7 @@ type_has_move_assign (tree t)
       lazily_declare_fn (sfk_move_assignment, t);
     }
 
-  for (fns = lookup_fnfields_slot_nolazy (t, ansi_assopname (NOP_EXPR));
+  for (fns = lookup_fnfields_slot_nolazy (t, cp_assignment_operator_id (NOP_EXPR));
        fns; fns = OVL_NEXT (fns))
     if (move_fn_p (OVL_CURRENT (fns)))
       return true;
@@ -5497,7 +5497,7 @@ type_has_user_declared_move_assign (tree t)
   if (CLASSTYPE_LAZY_MOVE_ASSIGN (t))
     return false;
 
-  for (fns = lookup_fnfields_slot_nolazy (t, ansi_assopname (NOP_EXPR));
+  for (fns = lookup_fnfields_slot_nolazy (t, cp_assignment_operator_id (NOP_EXPR));
        fns; fns = OVL_NEXT (fns))
     {
       tree fn = OVL_CURRENT (fns);
@@ -5618,7 +5618,7 @@ type_requires_array_cookie (tree type)
      the array to the deallocation function, so we will need to store
      a cookie.  */
   fns = lookup_fnfields (TYPE_BINFO (type),
-			 ansi_opname (VEC_DELETE_EXPR),
+			 cp_operator_id (VEC_DELETE_EXPR),
 			 /*protect=*/0);
   /* If there are no `operator []' members, or the lookup is
      ambiguous, then we don't need a cookie.  */
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index ff871b5..4f4d57f 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1531,16 +1531,17 @@ struct GTY(()) language_function {
 /* True if NAME is the IDENTIFIER_NODE for an overloaded "operator
    new" or "operator delete".  */
 #define NEW_DELETE_OPNAME_P(NAME)		\
-  ((NAME) == ansi_opname (NEW_EXPR)		\
-   || (NAME) == ansi_opname (VEC_NEW_EXPR)	\
-   || (NAME) == ansi_opname (DELETE_EXPR)	\
-   || (NAME) == ansi_opname (VEC_DELETE_EXPR))
+  ((NAME) == cp_operator_id (NEW_EXPR)		\
+   || (NAME) == cp_operator_id (VEC_NEW_EXPR)	\
+   || (NAME) == cp_operator_id (DELETE_EXPR)	\
+   || (NAME) == cp_operator_id (VEC_DELETE_EXPR))
 
-#define ansi_opname(CODE) \
+#define cp_operator_id(CODE) \
   (operator_name_info[(int) (CODE)].identifier)
-#define ansi_assopname(CODE) \
+#define cp_assignment_operator_id(CODE) \
   (assignment_operator_name_info[(int) (CODE)].identifier)
-extern tree ansi_litopname(const char *);
+/* In parser.c.  */
+extern tree cp_literal_operator_id (const char *);
 
 /* TRUE if a tree code represents a statement.  */
 extern bool statement_code_p[MAX_TREE_CODES];
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 43cf3df..9cae747 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -4476,7 +4476,7 @@ static tree
 push_cp_library_fn (enum tree_code operator_code, tree type,
 		    int ecf_flags)
 {
-  tree fn = build_cp_library_fn (ansi_opname (operator_code),
+  tree fn = build_cp_library_fn (cp_operator_id (operator_code),
 				 operator_code,
 				 type, ecf_flags);
   pushdecl (fn);
@@ -12158,12 +12158,12 @@ grok_op_properties (tree decl, bool complain)
     do
       {
 #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P)	\
-	if (ansi_opname (CODE) == name)				\
+	if (cp_operator_id (CODE) == name)			\
 	  {							\
 	    operator_code = (CODE);				\
 	    break;						\
 	  }							\
-	else if (ansi_assopname (CODE) == name)			\
+	else if (cp_assignment_operator_id (CODE) == name)	\
 	  {							\
 	    operator_code = (CODE);				\
 	    DECL_ASSIGNMENT_OPERATOR_P (decl) = 1;		\
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 2ba5ffb..63383bd 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4483,7 +4483,7 @@ maybe_warn_sized_delete (enum tree_code code)
   tree sized = NULL_TREE;
   tree unsized = NULL_TREE;
 
-  for (tree ovl = IDENTIFIER_GLOBAL_VALUE (ansi_opname (code));
+  for (tree ovl = IDENTIFIER_GLOBAL_VALUE (cp_operator_id (code));
        ovl; ovl = OVL_NEXT (ovl))
     {
       tree fn = OVL_CURRENT (ovl);
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 1a5766a4..a5f317a 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2906,7 +2906,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
       tree fnname;
       tree fns;
 
-      fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
+      fnname = cp_operator_id (array_p ? VEC_NEW_EXPR : NEW_EXPR);
 
       member_new_p = !globally_qualified_p
 	  && CLASS_TYPE_P (elt_type)
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index d511185..9058e81 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -202,7 +202,7 @@ lambda_function (tree lambda)
   if (CLASSTYPE_TEMPLATE_INSTANTIATION (type)
       && !COMPLETE_OR_OPEN_TYPE_P (type))
     return NULL_TREE;
-  lambda = lookup_member (type, ansi_opname (CALL_EXPR),
+  lambda = lookup_member (type, cp_operator_id (CALL_EXPR),
 			  /*protect=*/0, /*want_type=*/false,
 			  tf_warning_or_error);
   if (lambda)
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 43827e5..696b434 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -450,7 +450,7 @@ unqualified_name_lookup_error (tree name, location_t loc)
 
   if (IDENTIFIER_OPNAME_P (name))
     {
-      if (name != ansi_opname (ERROR_MARK))
+      if (name != cp_operator_id (ERROR_MARK))
 	error_at (loc, "%qD not defined", name);
     }
   else
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 01aa249..bc9bebe 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -697,7 +697,7 @@ do_build_copy_assign (tree fndecl)
 	  parmvec = make_tree_vector_single (converted_parm);
 	  finish_expr_stmt
 	    (build_special_member_call (current_class_ref,
-					ansi_assopname (NOP_EXPR),
+					cp_assignment_operator_id (NOP_EXPR),
 					&parmvec,
 					base_binfo,
 					flags,
@@ -990,7 +990,7 @@ get_copy_assign (tree type)
   int quals = (TYPE_HAS_CONST_COPY_ASSIGN (type)
 	       ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
   tree argtype = build_stub_type (type, quals, false);
-  tree fn = locate_fn_flags (type, ansi_assopname (NOP_EXPR), argtype,
+  tree fn = locate_fn_flags (type, cp_assignment_operator_id (NOP_EXPR), argtype,
 			     LOOKUP_NORMAL, tf_warning_or_error);
   if (fn == error_mark_node)
     return NULL_TREE;
@@ -1369,7 +1369,7 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
     case sfk_move_assignment:
     case sfk_copy_assignment:
       assign_p = true;
-      fnname = ansi_assopname (NOP_EXPR);
+      fnname = cp_assignment_operator_id (NOP_EXPR);
       break;
 
     case sfk_destructor:
@@ -1516,7 +1516,7 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
 
       if (check_vdtor && type_has_virtual_destructor (basetype))
 	{
-	  rval = locate_fn_flags (ctype, ansi_opname (DELETE_EXPR),
+	  rval = locate_fn_flags (ctype, cp_operator_id (DELETE_EXPR),
 				  ptr_type_node, flags, complain);
 	  /* Unlike for base ctor/op=/dtor, for operator delete it's fine
 	     to have a null rval (no class-specific op delete).  */
@@ -1802,7 +1802,7 @@ implicitly_declare_fn (special_function_kind kind, tree type,
 	  || kind == sfk_move_assignment)
 	{
 	  return_type = build_reference_type (type);
-	  name = ansi_assopname (NOP_EXPR);
+	  name = cp_assignment_operator_id (NOP_EXPR);
 	}
       else
 	name = constructor_name (type);
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 6b37054..b4894ef 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -248,9 +248,6 @@ static cp_token_cache *cp_token_cache_new
 static void cp_parser_initial_pragma
   (cp_token *);
 
-static tree cp_literal_operator_id
-  (const char *);
-
 static void cp_parser_cilk_simd
   (cp_parser *, cp_token *, bool *);
 static tree cp_parser_cilk_for
@@ -10171,7 +10168,7 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
 
     p = obstack_alloc (&declarator_obstack, 0);
 
-    declarator = make_id_declarator (NULL_TREE, ansi_opname (CALL_EXPR),
+    declarator = make_id_declarator (NULL_TREE, cp_operator_id (CALL_EXPR),
 				     sfk_none);
 
     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
@@ -13857,7 +13854,7 @@ cp_parser_operator_function_id (cp_parser* parser)
 /* Return an identifier node for a user-defined literal operator.
    The suffix identifier is chained to the operator name identifier.  */
 
-static tree
+tree
 cp_literal_operator_id (const char* name)
 {
   tree identifier;
@@ -13869,14 +13866,6 @@ cp_literal_operator_id (const char* name)
   return identifier;
 }
 
-/* Exported wrapper for cp_literal_operator_id.  */
-
-tree
-ansi_litopname (const char *name)
-{
-  return cp_literal_operator_id (name);
-}
-
 /* Parse an operator.
 
    operator:
@@ -13934,12 +13923,12 @@ cp_parser_operator (cp_parser* parser)
 	    if (cp_token *close_token
 		= cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
 	      end_loc = close_token->location;
-	    id = ansi_opname (op == NEW_EXPR
+	    id = cp_operator_id (op == NEW_EXPR
 			      ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
 	  }
 	/* Otherwise, we have the non-array variant.  */
 	else
-	  id = ansi_opname (op);
+	  id = cp_operator_id (op);
 
 	location_t loc = make_location (start_loc, start_loc, end_loc);
 
@@ -13947,147 +13936,147 @@ cp_parser_operator (cp_parser* parser)
       }
 
     case CPP_PLUS:
-      id = ansi_opname (PLUS_EXPR);
+      id = cp_operator_id (PLUS_EXPR);
       break;
 
     case CPP_MINUS:
-      id = ansi_opname (MINUS_EXPR);
+      id = cp_operator_id (MINUS_EXPR);
       break;
 
     case CPP_MULT:
-      id = ansi_opname (MULT_EXPR);
+      id = cp_operator_id (MULT_EXPR);
       break;
 
     case CPP_DIV:
-      id = ansi_opname (TRUNC_DIV_EXPR);
+      id = cp_operator_id (TRUNC_DIV_EXPR);
       break;
 
     case CPP_MOD:
-      id = ansi_opname (TRUNC_MOD_EXPR);
+      id = cp_operator_id (TRUNC_MOD_EXPR);
       break;
 
     case CPP_XOR:
-      id = ansi_opname (BIT_XOR_EXPR);
+      id = cp_operator_id (BIT_XOR_EXPR);
       break;
 
     case CPP_AND:
-      id = ansi_opname (BIT_AND_EXPR);
+      id = cp_operator_id (BIT_AND_EXPR);
       break;
 
     case CPP_OR:
-      id = ansi_opname (BIT_IOR_EXPR);
+      id = cp_operator_id (BIT_IOR_EXPR);
       break;
 
     case CPP_COMPL:
-      id = ansi_opname (BIT_NOT_EXPR);
+      id = cp_operator_id (BIT_NOT_EXPR);
       break;
 
     case CPP_NOT:
-      id = ansi_opname (TRUTH_NOT_EXPR);
+      id = cp_operator_id (TRUTH_NOT_EXPR);
       break;
 
     case CPP_EQ:
-      id = ansi_assopname (NOP_EXPR);
+      id = cp_assignment_operator_id (NOP_EXPR);
       break;
 
     case CPP_LESS:
-      id = ansi_opname (LT_EXPR);
+      id = cp_operator_id (LT_EXPR);
       break;
 
     case CPP_GREATER:
-      id = ansi_opname (GT_EXPR);
+      id = cp_operator_id (GT_EXPR);
       break;
 
     case CPP_PLUS_EQ:
-      id = ansi_assopname (PLUS_EXPR);
+      id = cp_assignment_operator_id (PLUS_EXPR);
       break;
 
     case CPP_MINUS_EQ:
-      id = ansi_assopname (MINUS_EXPR);
+      id = cp_assignment_operator_id (MINUS_EXPR);
       break;
 
     case CPP_MULT_EQ:
-      id = ansi_assopname (MULT_EXPR);
+      id = cp_assignment_operator_id (MULT_EXPR);
       break;
 
     case CPP_DIV_EQ:
-      id = ansi_assopname (TRUNC_DIV_EXPR);
+      id = cp_assignment_operator_id (TRUNC_DIV_EXPR);
       break;
 
     case CPP_MOD_EQ:
-      id = ansi_assopname (TRUNC_MOD_EXPR);
+      id = cp_assignment_operator_id (TRUNC_MOD_EXPR);
       break;
 
     case CPP_XOR_EQ:
-      id = ansi_assopname (BIT_XOR_EXPR);
+      id = cp_assignment_operator_id (BIT_XOR_EXPR);
       break;
 
     case CPP_AND_EQ:
-      id = ansi_assopname (BIT_AND_EXPR);
+      id = cp_assignment_operator_id (BIT_AND_EXPR);
       break;
 
     case CPP_OR_EQ:
-      id = ansi_assopname (BIT_IOR_EXPR);
+      id = cp_assignment_operator_id (BIT_IOR_EXPR);
       break;
 
     case CPP_LSHIFT:
-      id = ansi_opname (LSHIFT_EXPR);
+      id = cp_operator_id (LSHIFT_EXPR);
       break;
 
     case CPP_RSHIFT:
-      id = ansi_opname (RSHIFT_EXPR);
+      id = cp_operator_id (RSHIFT_EXPR);
       break;
 
     case CPP_LSHIFT_EQ:
-      id = ansi_assopname (LSHIFT_EXPR);
+      id = cp_assignment_operator_id (LSHIFT_EXPR);
       break;
 
     case CPP_RSHIFT_EQ:
-      id = ansi_assopname (RSHIFT_EXPR);
+      id = cp_assignment_operator_id (RSHIFT_EXPR);
       break;
 
     case CPP_EQ_EQ:
-      id = ansi_opname (EQ_EXPR);
+      id = cp_operator_id (EQ_EXPR);
       break;
 
     case CPP_NOT_EQ:
-      id = ansi_opname (NE_EXPR);
+      id = cp_operator_id (NE_EXPR);
       break;
 
     case CPP_LESS_EQ:
-      id = ansi_opname (LE_EXPR);
+      id = cp_operator_id (LE_EXPR);
       break;
 
     case CPP_GREATER_EQ:
-      id = ansi_opname (GE_EXPR);
+      id = cp_operator_id (GE_EXPR);
       break;
 
     case CPP_AND_AND:
-      id = ansi_opname (TRUTH_ANDIF_EXPR);
+      id = cp_operator_id (TRUTH_ANDIF_EXPR);
       break;
 
     case CPP_OR_OR:
-      id = ansi_opname (TRUTH_ORIF_EXPR);
+      id = cp_operator_id (TRUTH_ORIF_EXPR);
       break;
 
     case CPP_PLUS_PLUS:
-      id = ansi_opname (POSTINCREMENT_EXPR);
+      id = cp_operator_id (POSTINCREMENT_EXPR);
       break;
 
     case CPP_MINUS_MINUS:
-      id = ansi_opname (PREDECREMENT_EXPR);
+      id = cp_operator_id (PREDECREMENT_EXPR);
       break;
 
     case CPP_COMMA:
-      id = ansi_opname (COMPOUND_EXPR);
+      id = cp_operator_id (COMPOUND_EXPR);
       break;
 
     case CPP_DEREF_STAR:
-      id = ansi_opname (MEMBER_REF);
+      id = cp_operator_id (MEMBER_REF);
       break;
 
     case CPP_DEREF:
-      id = ansi_opname (COMPONENT_REF);
+      id = cp_operator_id (COMPONENT_REF);
       break;
 
     case CPP_OPEN_PAREN:
@@ -14095,14 +14084,14 @@ cp_parser_operator (cp_parser* parser)
       cp_lexer_consume_token (parser->lexer);
       /* Look for the matching `)'.  */
       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
-      return ansi_opname (CALL_EXPR);
+      return cp_operator_id (CALL_EXPR);
 
     case CPP_OPEN_SQUARE:
       /* Consume the `['.  */
       cp_lexer_consume_token (parser->lexer);
       /* Look for the matching `]'.  */
       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
-      return ansi_opname (ARRAY_REF);
+      return cp_operator_id (ARRAY_REF);
 
     case CPP_UTF8STRING:
     case CPP_UTF8STRING_USERDEF:
@@ -31327,21 +31316,21 @@ cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
 	    code = MIN_EXPR;
 	  else if (strcmp (p, "max") == 0)
 	    code = MAX_EXPR;
-	  else if (id == ansi_opname (PLUS_EXPR))
+	  else if (id == cp_operator_id (PLUS_EXPR))
 	    code = PLUS_EXPR;
-	  else if (id == ansi_opname (MULT_EXPR))
+	  else if (id == cp_operator_id (MULT_EXPR))
 	    code = MULT_EXPR;
-	  else if (id == ansi_opname (MINUS_EXPR))
+	  else if (id == cp_operator_id (MINUS_EXPR))
 	    code = MINUS_EXPR;
-	  else if (id == ansi_opname (BIT_AND_EXPR))
+	  else if (id == cp_operator_id (BIT_AND_EXPR))
 	    code = BIT_AND_EXPR;
-	  else if (id == ansi_opname (BIT_IOR_EXPR))
+	  else if (id == cp_operator_id (BIT_IOR_EXPR))
 	    code = BIT_IOR_EXPR;
-	  else if (id == ansi_opname (BIT_XOR_EXPR))
+	  else if (id == cp_operator_id (BIT_XOR_EXPR))
 	    code = BIT_XOR_EXPR;
-	  else if (id == ansi_opname (TRUTH_ANDIF_EXPR))
+	  else if (id == cp_operator_id (TRUTH_ANDIF_EXPR))
 	    code = TRUTH_ANDIF_EXPR;
-	  else if (id == ansi_opname (TRUTH_ORIF_EXPR))
+	  else if (id == cp_operator_id (TRUTH_ORIF_EXPR))
 	    code = TRUTH_ORIF_EXPR;
 	  id = omp_reduction_id (code, id, NULL_TREE);
 	  tree scope = parser->scope;
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 2b26df4..877015e 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1667,7 +1667,7 @@ lookup_fnfields_1 (tree type, tree name)
 	  if (CLASSTYPE_LAZY_MOVE_CTOR (type))
 	    lazily_declare_fn (sfk_move_constructor, type);
 	}
-      else if (name == ansi_assopname (NOP_EXPR))
+      else if (name == cp_assignment_operator_id (NOP_EXPR))
 	{
 	  if (CLASSTYPE_LAZY_COPY_ASSIGN (type))
 	    lazily_declare_fn (sfk_copy_assignment, type);
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 66c4187..3ea7a568 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -5095,7 +5095,7 @@ omp_reduction_id (enum tree_code reduction_code, tree reduction_id, tree type)
     case BIT_IOR_EXPR:
     case TRUTH_ANDIF_EXPR:
     case TRUTH_ORIF_EXPR:
-      reduction_id = ansi_opname (reduction_code);
+      reduction_id = cp_operator_id (reduction_code);
       break;
     case MIN_EXPR:
       p = "min";
@@ -8984,7 +8984,7 @@ classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
   if (assign_p)
     {
       int ix;
-      ix = lookup_fnfields_1 (type, ansi_assopname (NOP_EXPR));
+      ix = lookup_fnfields_1 (type, cp_assignment_operator_id (NOP_EXPR));
       if (ix < 0)
 	return false;
       fns = (*CLASSTYPE_METHOD_VEC (type))[ix];
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index a591d29..7524989 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -8784,7 +8784,7 @@ check_return_expr (tree retval, bool *no_warning)
 
   /* Effective C++ rule 15.  See also start_function.  */
   if (warn_ecpp
-      && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR))
+      && DECL_NAME (current_function_decl) == cp_assignment_operator_id (NOP_EXPR))
     {
       bool warn = true;
 
diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc
index 0be8190..5059e1c 100644
--- a/libcc1/libcp1plugin.cc
+++ b/libcc1/libcp1plugin.cc
@@ -1,5 +1,5 @@
 /* Library interface to C++ front end.
-   Copyright (C) 2014-2016 Free Software Foundation, Inc.
+   Copyright (C) 2014-2017 Free Software Foundation, Inc.
 
    This file is part of GCC.  As it interacts with GDB through libcc1,
    they all become a single program as regards the GNU GPL's requirements.
@@ -1355,7 +1355,7 @@ plugin_new_decl (cc1_plugin::connection *self,
 		    id = xstrndup (id, len);
 		    freeid = true;
 		  }
-		identifier = ansi_litopname (id);
+		identifier = cp_literal_operator_id (id);
 		if (freeid)
 		  free (id);
 	      }
@@ -1368,9 +1368,9 @@ plugin_new_decl (cc1_plugin::connection *self,
 	  if (opcode != ERROR_MARK)
 	    {
 	      if (assop)
-		identifier = ansi_assopname (opcode);
+		identifier = cp_assignment_operator_id (opcode);
 	      else
-		identifier = ansi_opname (opcode);
+		identifier = cp_operator_id (opcode);
 	    }
 	}
       decl = build_lang_decl_loc (loc, code, identifier, sym_type);
@@ -2645,7 +2645,7 @@ plugin_new_dependent_value_expr (cc1_plugin::connection *self,
 		id = xstrndup (id, len);
 		freeid = true;
 	      }
-	    identifier = ansi_litopname (id);
+	    identifier = cp_literal_operator_id (id);
 	    if (freeid)
 	      free (id);
 	  }
@@ -2660,9 +2660,9 @@ plugin_new_dependent_value_expr (cc1_plugin::connection *self,
       if (opcode != ERROR_MARK)
 	{
 	  if (assop)
-	    identifier = ansi_assopname (opcode);
+	    identifier = cp_assignment_operator_id (opcode);
 	  else
-	    identifier = ansi_opname (opcode);
+	    identifier = cp_operator_id (opcode);
 	}
 
       gcc_assert (identifier);



Revamp global friend implementation

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index ff871b5..0415f30 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -5953,8 +5953,8 @@ extern int is_friend				(tree, tree);
 extern void make_friend_class			(tree, tree, bool);
 extern void add_friend				(tree, tree, bool);
 extern tree do_friend				(tree, tree, tree, tree, enum overload_flags, bool);
-extern void add_to_global_friend_list		(tree);
-extern void remove_from_global_friend_list	(tree);
+
+extern void set_global_friend			(tree);
 extern bool is_global_friend			(tree);
 
 /* in init.c */
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 365b1ca..3ce6fab 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -25,63 +25,43 @@ along with GCC; see the file COPYING3.  If not see
 /* Friend data structures are described in cp-tree.h.  */
 
 
-/* Scopes (functions, classes, or templates) in the TREE_VALUE of
-   GLOBAL_FRIEND_LIST are regarded as friends of every class.  This is
-   mainly used by libcc1, to enable GDB's code snippets to access
-   private members without disabling access control in general, which
-   could cause different template overload resolution results when
-   accessibility matters (e.g. tests for an accessible member).  */
+/* The GLOBAL_FRIEND scope (functions, classes, or templates) is
+   regarded as a friend of every class.  This is only used by libcc1,
+   to enable GDB's code snippets to access private members without
+   disabling access control in general, which could cause different
+   template overload resolution results when accessibility matters
+   (e.g. tests for an accessible member).  */
 
-static tree global_friend_list;
+static tree global_friend;
 
-/* Add SCOPE to GLOBAL_FRIEND_LIST.  The same scope may be added
-   multiple times, so that matching removals cancel out.  */
+/* Set the GLOBAL_FRIEND for this compilation session.  It might be
+   set multiple times, but always to the same scope.  */
 
 void
-add_to_global_friend_list (tree scope)
+set_global_friend (tree scope)
 {
-  global_friend_list = tree_cons (NULL_TREE, scope, global_friend_list);
+  gcc_checking_assert (scope != NULL_TREE);
+  gcc_assert (!global_friend || global_friend == scope);
+  global_friend = scope;
 }
 
-/* Search for SCOPE in the global friend list, and return a pointer to
-   the first tree cons that matches.  The pointer can be used to
-   modify the list.
+/* Return TRUE if SCOPE is the global friend.  */
 
-   A match means the TREE_VALUE is SCOPE or, if an EXACT match is not
-   required, a template that has SCOPE as a specialization.  */
-
-static inline tree *
-find_in_global_friend_list (tree scope, bool exact)
-{
-  for (tree *p = &global_friend_list;
-       *p; p = &TREE_CHAIN (*p))
-    if (TREE_VALUE (*p) == scope
-	|| (!exact
-	    && is_specialization_of_friend (TREE_VALUE (*p), scope)))
-      return p;
-
-  return NULL;
-}
-
-/* Remove one occurrence of SCOPE from the global friend list.
-   There must be at least one such occurrence.  */
-
-void
-remove_from_global_friend_list (tree scope)
+bool
+is_global_friend (tree scope)
 {
-  tree *p = find_in_global_friend_list (scope, true);
+  gcc_checking_assert (scope != NULL_TREE);
 
-  gcc_assert (p);
+  if (global_friend == scope)
+    return true;
 
-  *p = TREE_CHAIN (*p);
-}
+  if (!global_friend)
+    return false;
 
-/* Return TRUE if SCOPE is in the global friend list.  */
+  if (is_specialization_of_friend (global_friend, scope))
+    return true;
 
-bool
-is_global_friend (tree scope)
-{
-  return !!find_in_global_friend_list (scope, false);
+  return false;
 }
 
 /* Returns nonzero if SUPPLICANT is a friend of TYPE.  */
diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc
index 0be8190..e7d397f 100644
--- a/libcc1/libcp1plugin.cc
+++ b/libcc1/libcp1plugin.cc
@@ -567,7 +567,7 @@ plugin_pragma_push_user_expression (cpp_reader *)
   /* Make the function containing the user expression a global
      friend, so as to bypass access controls in it.  */
   if (at_function_scope_p ())
-    add_to_global_friend_list (current_function_decl);
+    set_global_friend (current_function_decl);
 
   gcc_assert (at_function_scope_p ());
   function *save_cfun = cfun;


Revamp the API:

Rename most entry points into a self-consistent scheme.

Unify oracle lookup kinds. (bonus feature! :-)

Drop INLINE_P from using_namespace, introduce make_namespace_inline.

Drop support for function default args (#if0ed).

Drop dead code in plugin_add_using_decl.

Drop label handling in build_decl.


diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index ff871b5..35f74ef 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -6857,9 +6857,7 @@ extern tree strip_using_decl                    (tree);
 
 enum cp_oracle_request
 {
-  CP_ORACLE_SYMBOL,
-  CP_ORACLE_TAG,
-  CP_ORACLE_LABEL
+  CP_ORACLE_IDENTIFIER
 };
 
 /* If this is non-NULL, then it is a "binding oracle" which can lazily
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 600540c..1f1c9e7 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -98,15 +98,16 @@ cp_binding_oracle_function *cp_binding_oracle;
 static inline void
 query_oracle (tree name)
 {
-  // FIXME: we need a more space-efficient representation for
-  // oracle_looked_up.
-  if (cp_binding_oracle && !LANG_IDENTIFIER_CAST (name)->oracle_looked_up)
-    {
-      LANG_IDENTIFIER_CAST (name)->oracle_looked_up = true;
-      // FIXME: unify CP_ORACLE_SYMBOL and CP_ORACLE_TAG for C++.
-      cp_binding_oracle (CP_ORACLE_SYMBOL, name);
-      cp_binding_oracle (CP_ORACLE_TAG, name);
-    }
+  if (!cp_binding_oracle)
+    return;
+
+  /* LOOKED_UP holds the set of identifiers that we have already
+     looked up with the oracle.  */
+  static hash_set<tree> looked_up;
+  if (looked_up.add (name))
+    return;
+
+  cp_binding_oracle (CP_ORACLE_IDENTIFIER, name);
 }
 
 /* Create a binding_entry object for (NAME, TYPE).  */
diff --git a/include/gcc-cp-fe.def b/include/gcc-cp-fe.def
index 7fcd484..f6d0a41 100644
--- a/include/gcc-cp-fe.def
+++ b/include/gcc-cp-fe.def
@@ -1,6 +1,6 @@
 /* Interface between GCC C++ FE and GDB  -*- c -*-
 
-   Copyright (C) 2014-2016 Free Software Foundation, Inc.
+   Copyright (C) 2014-2017 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -25,11 +25,8 @@
    namespace.  A namespace named NAME is created in the current scope,
    if needed.
 
-   If the newly-created namespace is to be an inline namespace, after
-   push_namespace, get the nested namespace decl with
-   get_current_binding_level, pop back to the enclosing namespace,
-   call using_namespace with INLINE_P, and then push to the inline
-   namespace again.  */
+   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.  */
@@ -151,8 +148,8 @@ GCC_METHOD1 (int /* bool */, push_function,
    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
-   anything declaration: nothing from any local scope is visible.
-   Just entering the scope of the class containing member function f
+   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.  */
 
@@ -165,22 +162,26 @@ GCC_METHOD2 (int /* bool */, reactivate_decl,
    push_function, restoring the binding level in effect before the
    matching push_* call.  */
 
-GCC_METHOD0 (int /* bool */, pop_namespace)
+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_namespace.  */
+   binding level that would be popped by pop_scope.  */
 
-GCC_METHOD0 (gcc_decl, get_current_binding_level)
+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 to obtain USED_NS's gcc_decl.
-   INLINE_P indicates USED_NS was declared as an inline namespace, or
-   the presence of attribute strong in the using directive, which
-   is an older but equivalent GCC extension.  */
+   Use get_current_binding_level_decl to obtain USED_NS's
+   gcc_decl.  */
 
-GCC_METHOD2 (int /* bool */, using_namespace,
-	     gcc_decl,			/* Argument USED_NS.  */
-	     int /* bool */)		/* Argument INLINE_P.  */
+GCC_METHOD1 (int /* bool */, add_using_namespace,
+	     gcc_decl)			/* Argument USED_NS.  */
 
 /* Introduce a namespace alias declaration, as in:
 
@@ -188,9 +189,9 @@ GCC_METHOD2 (int /* bool */, using_namespace,
 
    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 after pushing into it.  */
+   get_current_binding_level_decl after pushing into it.  */
 
-GCC_METHOD2 (int /* bool */, new_namespace_alias,
+GCC_METHOD2 (int /* bool */, add_namespace_alias,
 	     const char *,		/* Argument ALIAS.  */
 	     gcc_decl)			/* Argument TARGET.  */
 
@@ -209,9 +210,9 @@ GCC_METHOD2 (int /* bool */, new_namespace_alias,
    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
-   type_decl) indicates so.  */
+   get_type_decl) indicates so.  */
 
-GCC_METHOD2 (int /* bool */, new_using_decl,
+GCC_METHOD2 (int /* bool */, add_using_decl,
 	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
 	     gcc_decl)		      /* Argument TARGET.  */
 
@@ -232,6 +233,9 @@ GCC_METHOD2 (int /* bool */, new_using_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.
 
@@ -264,18 +268,18 @@ GCC_METHOD2 (int /* bool */, new_using_decl,
 
    Constructors and destructors need special care, because for each
    constructor and destructor there may be multiple clones defined
-   internally by the compiler.  With new_decl, you can introduce the
+   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 new_decl, it would be meaningless (and
+   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 new_decl, and then, for each
-   specialization, introduce it with specialize_function_template, and
-   then define the addresses of each of its clones with
-   define_cdtor_clone.
+   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:
 
@@ -334,7 +338,7 @@ GCC_METHOD2 (int /* bool */, new_using_decl,
 
    FIXME: How about attributes?  */
 
-GCC_METHOD7 (gcc_decl, new_decl,
+GCC_METHOD7 (gcc_decl, build_decl,
 	     const char *,	      /* Argument NAME.  */
 	     enum gcc_cp_symbol_kind, /* Argument SYM_KIND.  */
 	     gcc_type,		      /* Argument SYM_TYPE.  */
@@ -344,8 +348,8 @@ GCC_METHOD7 (gcc_decl, new_decl,
 	     unsigned int)	      /* Argument LINE_NUMBER.  */
 
 /* Supply the ADDRESS of one of the multiple clones of constructor or
-   destructor CDTOR.  The clone is selected using the following
-   name mangling conventions:
+   destructor CDTOR.  The clone is specified by NAME, using the
+   following name mangling conventions:
 
      C1      in-charge constructor
      C2      not-in-charge constructor
@@ -372,8 +376,8 @@ GCC_METHOD7 (gcc_decl, new_decl,
    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 defined in very
-   rare cases of virtual inheritance and cdtor prototypes.  */
+   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.  */
@@ -383,18 +387,18 @@ GCC_METHOD3 (gcc_decl, define_cdtor_clone,
 /* 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 new_decl returns a
+   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, decl_type,
+GCC_METHOD1 (gcc_type, get_decl_type,
 	     gcc_decl)            /* Argument DECL.  */
 
 /* Return the declaration for a type.  */
 
-GCC_METHOD1 (gcc_decl, type_decl,
+GCC_METHOD1 (gcc_decl, get_type_decl,
 	     gcc_type)            /* Argument TYPE.  */
 
 /* Declare DECL as a friend of the current class scope, if TYPE is
@@ -437,11 +441,11 @@ GCC_METHOD1 (gcc_decl, type_decl,
 
    In order to simplify such friend declarations, and to enable
    incremental friend declarations as template specializations are
-   introduced, new_friend can be called after the befriended class is
+   introduced, new_friend can be called after the befriending class is
    fully defined, passing it a non-NULL TYPE argument naming the
-   befriended class type.  */
+   befriending class type.  */
 
-GCC_METHOD2 (int /* bool */, new_friend,
+GCC_METHOD2 (int /* bool */, add_friend,
 	     gcc_decl,		      /* Argument DECL.  */
 	     gcc_type)		      /* Argument TYPE.  */
 
@@ -467,14 +471,14 @@ GCC_METHOD2 (gcc_type, build_pointer_to_member_type,
 	     gcc_type) 			   /* Argument MEMBER_TYPE.  */
 
 /* Start a template parameter list, so that subsequent
-   build_template_typename_parm and build_template_value_parm calls
-   create template parameters in the list.  The list is closed by a
-   new_decl call with GCC_CP_SYMBOL_FUNCTION or GCC_CP_SYMBOL_CLASS,
-   that, when the scope is a template parameter list, closes the
-   parameter list and declares a template function or a template class
-   with the parameter list.  */
+   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, closes the parameter list and declares a template function or
+   a template class with the parameter list.  */
 
-GCC_METHOD0 (int /* bool */, start_new_template_decl)
+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
@@ -484,7 +488,7 @@ GCC_METHOD0 (int /* bool */, start_new_template_decl)
    parameter.  FILENAME and LINE_NUMBER may specify the source
    location in which the template parameter was declared.  */
 
-GCC_METHOD5 (gcc_type, new_template_typename_parm,
+GCC_METHOD5 (gcc_type, build_type_template_parameter,
 	     const char *,			      /* Argument ID.  */
 	     int /* bool */,			  /* Argument PACK_P.  */
 	     gcc_type,			    /* Argument DEFAULT_TYPE.  */
@@ -497,7 +501,7 @@ GCC_METHOD5 (gcc_type, new_template_typename_parm,
    template parameter.  FILENAME and LINE_NUMBER may specify the
    source location in which the template parameter was declared.  */
 
-GCC_METHOD5 (gcc_utempl, new_template_template_parm,
+GCC_METHOD5 (gcc_utempl, build_template_template_parameter,
 	     const char *,			      /* Argument ID.  */
 	     int /* bool */,			  /* Argument PACK_P.  */
 	     gcc_utempl,		   /* Argument DEFAULT_TEMPL.  */
@@ -510,7 +514,7 @@ GCC_METHOD5 (gcc_utempl, new_template_template_parm,
    X).  FILENAME and LINE_NUMBER may specify the source location in
    which the template parameter was declared.  */
 
-GCC_METHOD5 (gcc_decl, new_template_value_parm,
+GCC_METHOD5 (gcc_decl, build_value_template_parameter,
 	     gcc_type,			  	    /* Argument TYPE.  */
 	     const char *,			      /* Argument ID.  */
 	     gcc_expr,			   /* Argument DEFAULT_VALUE.  */
@@ -525,13 +529,13 @@ GCC_METHOD5 (gcc_decl, new_template_value_parm,
    (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 (new_template_typename_parm), a
-   specialization (returned by new_dependent_typespec) of a template
-   template parameter (returned by new_template_template_parm) or a
-   member type thereof (returned by new_dependent_typename
-   itself).  */
+   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, new_dependent_typename,
+GCC_METHOD3 (gcc_type, build_dependent_typename,
 	     gcc_type,			  /* Argument ENCLOSING_TYPE.  */
 	     const char *,			      /* Argument ID.  */
 	     const struct gcc_cp_template_args *)  /* Argument TARGS.  */
@@ -541,21 +545,21 @@ GCC_METHOD3 (gcc_type, new_dependent_typename,
    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, new_dependent_class_template,
+GCC_METHOD2 (gcc_utempl, build_dependent_class_template,
 	     gcc_type,			  /* Argument ENCLOSING_TYPE.  */
 	     const char *)			      /* Argument ID.  */
 
-/* Build a template-dependent template type specialization (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>).  */
+/* Build a template-dependent template type 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, new_dependent_typespec,
+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 value expression (e.g., S::val or
-   S::template mtf<X>, or unqualified f or template tf<X>).
+/* 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
@@ -578,7 +582,7 @@ GCC_METHOD2 (gcc_type, new_dependent_typespec,
    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
-   new_decl.  Otherwise, FLAGS should be GCC_CP_SYMBOL_MASK, which
+   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).
 
@@ -586,7 +590,7 @@ GCC_METHOD2 (gcc_type, new_dependent_typespec,
    target type of the conversion.  Otherwise, CONV_TYPE must be
    NULL.  */
 
-GCC_METHOD5 (gcc_expr, new_dependent_value_expr,
+GCC_METHOD5 (gcc_expr, build_dependent_expr,
 	     gcc_decl,			 /* Argument ENCLOSING_SCOPE.  */
 	     enum gcc_cp_symbol_kind,		   /* Argument FLAGS.  */
 	     const char *,			    /* Argument NAME.  */
@@ -595,7 +599,7 @@ GCC_METHOD5 (gcc_expr, new_dependent_value_expr,
 
 /* Build a gcc_expr for the value VALUE in type TYPE.  */
 
-GCC_METHOD2 (gcc_expr, literal_expr,
+GCC_METHOD2 (gcc_expr, build_literal_expr,
 	     gcc_type,		  /* Argument TYPE.  */
 	     unsigned long)	  /* Argument VALUE.  */
 
@@ -604,7 +608,7 @@ GCC_METHOD2 (gcc_expr, literal_expr,
    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, decl_expr,
+GCC_METHOD2 (gcc_expr, build_decl_expr,
 	     gcc_decl,			/* Argument DECL.  */
 	     int /* bool */)		/* Argument QUALIFIED_P.  */
 
@@ -618,7 +622,7 @@ GCC_METHOD2 (gcc_expr, decl_expr,
    delete[], "gsda" for ::delete[], "sp" for pack expansion, "sZ" for
    sizeof...(function argument pack).  */
 
-GCC_METHOD2 (gcc_expr, unary_value_expr,
+GCC_METHOD2 (gcc_expr, build_unary_expr,
 	     const char *,	  /* Argument UNARY_OP.  */
 	     gcc_expr)		  /* Argument OPERAND.  */
 
@@ -629,9 +633,9 @@ GCC_METHOD2 (gcc_expr, unary_value_expr,
    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. new_dependent_value_expr.  */
+   e.g. build_dependent_expr.  */
 
-GCC_METHOD3 (gcc_expr, binary_value_expr,
+GCC_METHOD3 (gcc_expr, build_binary_expr,
 	     const char *,	  /* Argument BINARY_OP.  */
 	     gcc_expr,		  /* Argument OPERAND1.  */
 	     gcc_expr)		  /* Argument OPERAND2.  */
@@ -640,7 +644,7 @@ GCC_METHOD3 (gcc_expr, binary_value_expr,
    applied to gcc_exprs OPERAND1, OPERAND2 and OPERAND3.  The only
    supported TERNARY_OP is "qu", for the "?:" operator.  */
 
-GCC_METHOD4 (gcc_expr, ternary_value_expr,
+GCC_METHOD4 (gcc_expr, build_ternary_expr,
 	     const char *,	  /* Argument TERNARY_OP.  */
 	     gcc_expr,		  /* Argument OPERAND1.  */
 	     gcc_expr,		  /* Argument OPERAND2.  */
@@ -651,7 +655,7 @@ GCC_METHOD4 (gcc_expr, ternary_value_expr,
    are "ti" for typeid, "st" for sizeof, "at" for alignof, and "sZ"
    for sizeof...(template argument pack).  */
 
-GCC_METHOD2 (gcc_expr, unary_type_expr,
+GCC_METHOD2 (gcc_expr, build_unary_type_expr,
 	     const char *,	  /* Argument UNARY_OP.  */
 	     gcc_type)		  /* Argument OPERAND.  */
 
@@ -661,7 +665,7 @@ GCC_METHOD2 (gcc_expr, unary_type_expr,
    for dynamic, static, const and reinterpret casts, respectively;
    "cv" for functional or C-style casts).  */
 
-GCC_METHOD3 (gcc_expr, type_value_expr,
+GCC_METHOD3 (gcc_expr, build_cast_expr,
 	     const char *,	  /* Argument BINARY_OP.  */
 	     gcc_type,		  /* Argument OPERAND1.  */
 	     gcc_expr)		  /* Argument OPERAND2.  */
@@ -672,7 +676,7 @@ GCC_METHOD3 (gcc_expr, type_value_expr,
    braced initializer list; pass "il" for CONV_OP, and NULL for
    TYPE).  */
 
-GCC_METHOD3 (gcc_expr, values_expr,
+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.  */
@@ -685,7 +689,7 @@ GCC_METHOD3 (gcc_expr, values_expr,
    specified initializer, INITIALIZER must be NULL; a zero-length arg
    list stands for a default initializer.  */
 
-GCC_METHOD4 (gcc_expr, alloc_expr,
+GCC_METHOD4 (gcc_expr, build_new_expr,
 	     const char *,			       /* Argument NEW_OP.  */
 	     const struct gcc_cp_function_args *,   /* Argument PLACEMENT.  */
 	     gcc_type,					 /* Argument TYPE.  */
@@ -693,13 +697,12 @@ GCC_METHOD4 (gcc_expr, alloc_expr,
 
 /* Return a call expression that calls CALLABLE with arguments ARGS.
    CALLABLE may be a function, a callable object, a pointer to
-   function, an unresolved value 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.  */
+   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, call_expr,
+GCC_METHOD3 (gcc_expr, build_call_expr,
 	     gcc_expr,			      /* Argument CALLABLE.  */
 	     int /* bool */,		   /* Argument QUALIFIED_P.  */
 	     const struct gcc_cp_function_args *) /* Argument ARGS.  */
@@ -712,7 +715,7 @@ GCC_METHOD3 (gcc_expr, call_expr,
    because the type is only computed when template argument
    substitution is performed.  */
 
-GCC_METHOD1 (gcc_type, expr_type,
+GCC_METHOD1 (gcc_type, get_expr_type,
 	     gcc_expr)		  /* Argument OPERAND.  */
 
 /* Introduce a specialization of a template function.
@@ -722,7 +725,7 @@ GCC_METHOD1 (gcc_type, expr_type,
    specialization.  FILENAME and LINE_NUMBER specify the source
    location associated with the template function specialization.  */
 
-GCC_METHOD5 (gcc_decl, specialize_function_template,
+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.  */
@@ -730,14 +733,14 @@ GCC_METHOD5 (gcc_decl, specialize_function_template,
 	     unsigned int)	      /* Argument LINE_NUMBER.  */
 
 /* Specialize a template class as an incomplete type.  A definition
-   can be supplied later, with start_class_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, specialize_class_template,
+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.  */
@@ -747,12 +750,12 @@ GCC_METHOD4 (gcc_decl, specialize_class_template,
    own binding level.  Initially it has no fields.
 
    TYPEDECL is the forward-declaration of the type, returned by
-   new_decl.  BASE_CLASSES indicate the base classes of class NAME.
+   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_definition,
+GCC_METHOD4 (gcc_type, start_class_type,
 	     gcc_decl,		      /* Argument TYPEDECL.  */
 	     const struct gcc_vbase_array *,/* Argument BASE_CLASSES.  */
 	     const char *,	      /* Argument FILENAME.  */
@@ -762,16 +765,15 @@ GCC_METHOD4 (gcc_type, start_class_definition,
    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
-   new_decl and start_class_definition, if they could be used to
-   introduce a closure type.  Initially it has no fields.
+   build_decl and start_class_type, if they could be used to introduce
+   a closure type.  Initially it has no fields.
 
-   NAME is the class name.  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
-   needs not be a function.  */
+   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_new_closure_type,
+GCC_METHOD5 (gcc_type, start_closure_class_type,
 	     int,		      /* Argument DISCRIMINATOR.  */
 	     gcc_decl,		      /* Argument EXTRA_SCOPE.  */
 	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
@@ -783,7 +785,7 @@ GCC_METHOD5 (gcc_type, start_new_closure_type,
    FIELD_TYPE is the type of the field.  BITSIZE and BITPOS indicate
    where in the struct the field occurs.  */
 
-GCC_METHOD5 (gcc_decl, new_field,
+GCC_METHOD5 (gcc_decl, build_field,
 	     const char *,		   /* Argument FIELD_NAME.  */
 	     gcc_type,			   /* Argument FIELD_TYPE.  */
 	     enum gcc_cp_symbol_kind,	   /* Argument FIELD_FLAGS.  */
@@ -793,9 +795,10 @@ GCC_METHOD5 (gcc_decl, new_field,
 /* 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 build_class_type or build_union_type.  */
+   before the matching start_class_type or
+   start_closure_class_type.  */
 
-GCC_METHOD1 (int /* bool */, finish_record_or_union,
+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
@@ -804,7 +807,7 @@ GCC_METHOD1 (int /* bool */, finish_record_or_union,
    NAME is the enum name.  FILENAME and LINE_NUMBER specify its source
    location.  */
 
-GCC_METHOD5 (gcc_type, start_new_enum_type,
+GCC_METHOD5 (gcc_type, start_enum_type,
 	     const char *,	      /* Argument NAME.  */
 	     gcc_type,		      /* Argument UNDERLYING_INT_TYPE. */
 	     enum gcc_cp_symbol_kind, /* Argument FLAGS.  */
@@ -814,7 +817,7 @@ GCC_METHOD5 (gcc_type, start_new_enum_type,
 /* 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_add_enum_constant,
+GCC_METHOD3 (gcc_decl, build_enum_constant,
 	     gcc_type,		       /* Argument ENUM_TYPE.  */
 	     const char *,	       /* Argument NAME.  */
 	     unsigned long)	       /* Argument VALUE.  */
@@ -835,24 +838,6 @@ GCC_METHOD3 (gcc_type, build_function_type,
 	     const struct gcc_type_array *,/* Argument ARGUMENT_TYPES.  */
 	     int /* bool */)		   /* Argument IS_VARARGS.  */
 
-/* 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.  */
-
 /* 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
@@ -879,16 +864,6 @@ GCC_METHOD4 (gcc_type, build_method_type,
 	     enum gcc_cp_qualifiers,	   /* Argument QUALS.  */
 	     enum gcc_cp_ref_qualifiers)   /* Argument RQUALS.  */
 
-/* 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.  */
-
 /* 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
@@ -904,14 +879,14 @@ GCC_METHOD2 (gcc_decl, get_function_parameter_decl,
    expressions in default parameters, the only kind that may have to
    be introduced through this interface.  */
 
-GCC_METHOD1 (gcc_expr, get_lambda_expr,
+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, int_type,
+GCC_METHOD3 (gcc_type, get_int_type,
 	     int /* bool */,		   /* Argument IS_UNSIGNED.  */
 	     unsigned long,                /* Argument SIZE_IN_BYTES.  */
 	     const char *)		   /* Argument BUILTIN_NAME.  */
@@ -919,23 +894,23 @@ GCC_METHOD3 (gcc_type, int_type,
 /* Return the 'char' type, a distinct type from both 'signed char' and
    'unsigned char' returned by int_type.  */
 
-GCC_METHOD0 (gcc_type, char_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, float_type,
+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, void_type)
+GCC_METHOD0 (gcc_type, get_void_type)
 
 /* Return the 'bool' type.  */
 
-GCC_METHOD0 (gcc_type, bool_type)
+GCC_METHOD0 (gcc_type, get_bool_type)
 
 /* Return the std::nullptr_t type.  */
 
@@ -1007,8 +982,65 @@ GCC_METHOD1 (gcc_type, error,
 /* Declare a static_assert with the given CONDITION and ERRORMSG at
    FILENAME:LINE_NUMBER.  */
 
-GCC_METHOD4 (int /* bool */, new_static_assert,
+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.  */
diff --git a/include/gcc-cp-interface.h b/include/gcc-cp-interface.h
index 9cae248..83cb2d0 100644
--- a/include/gcc-cp-interface.h
+++ b/include/gcc-cp-interface.h
@@ -1,6 +1,6 @@
 /* Interface between GCC C++ FE and GDB
 
-   Copyright (C) 2014-2016 Free Software Foundation, Inc.
+   Copyright (C) 2014-2017 Free Software Foundation, Inc.
 
    This file is part of GCC.
 
@@ -41,7 +41,7 @@ struct gcc_cp_context;
 
 enum gcc_cp_api_version
 {
-  GCC_CP_FE_VERSION_0 = 0xffffffff-16
+  GCC_CP_FE_VERSION_0 = 0xffffffff-17
 };
 
 /* Qualifiers.  */
@@ -73,8 +73,6 @@ typedef unsigned long long gcc_utempl;
 
 typedef unsigned long long gcc_expr;
 
-/* FIXME: do we need to support argument packs?  */
-
 typedef enum
   { GCC_CP_TPARG_VALUE, GCC_CP_TPARG_CLASS,
     GCC_CP_TPARG_TEMPL, GCC_CP_TPARG_PACK }
@@ -134,14 +132,14 @@ enum gcc_cp_symbol_kind
 
   GCC_CP_SYMBOL_LABEL,
 
-  /* A class, forward declared in new_decl (to be later defined in
+  /* A class, forward declared in build_decl (to be later defined in
      start_class_definition), or, in a template parameter list scope,
      a declaration of a template class, closing the parameter
      list.  */
 
   GCC_CP_SYMBOL_CLASS,
 
-  /* A union, forward declared in new_decl (to be later defined in
+  /* A union, forward declared in build_decl (to be later defined in
      start_class_definition).  */
 
   GCC_CP_SYMBOL_UNION,
@@ -197,12 +195,10 @@ enum gcc_cp_symbol_kind
      operators.  */
   GCC_CP_FLAG_SPECIAL_FUNCTION = GCC_CP_FLAG_BASE,
 
-  /* We intentionally cannot express inline, constexpr, friend or
-     virtual override for functions.  We can't inline or
-     constexpr-replace without a source-level body.  Since we disable
-     access control, friend is meaningless.  The override keyword is
-     only meaningless within the definition of the containing
-     class.  */
+  /* We intentionally cannot express inline, constexpr, or virtual
+     override for functions.  We can't inline or constexpr-replace
+     without a source-level body.  The override keyword is only
+     meaningful within the definition of the containing class.  */
 
   /* This indicates a "virtual" member function, explicitly or
      implicitly (due to a virtual function with the same name and
@@ -296,8 +292,8 @@ enum gcc_cp_symbol_kind
 			       - GCC_CP_FLAG_BASE),
 
 
-  /* Flags to be used when introducing a class with
-     start_new_class_type, or a class template with new_decl.  */
+  /* Flags to be used when introducing a class or a class template
+     with build_decl.  */
 
   /* This indicates an enum type without any flags.  */
   GCC_CP_FLAG_CLASS_NOFLAG = 0,
@@ -364,20 +360,12 @@ struct gcc_vbase_array
 
 enum gcc_cp_oracle_request
 {
-  /* An ordinary symbol -- a variable, function, typedef, or enum
-     constant.  All namespace-scoped symbols with the requested name
-     should be defined in response to this request.  */
-
-  GCC_CP_ORACLE_SYMBOL,
-
-  /* A struct, union, or enum tag.  All members of the tagged type
-     should be defined in response to this request.  */
-
-  GCC_CP_ORACLE_TAG,
-
-  /* A label.  */
+  /* An identifier in namespace scope -- type, variable, function,
+     namespace, template.  All namespace-scoped symbols with the
+     requested name, in any namespace (including the global
+     namespace), should be defined in response to this request.  */
 
-  GCC_CP_ORACLE_LABEL
+  GCC_CP_ORACLE_IDENTIFIER
 };
 
 /* The type of the function called by GCC to ask GDB for a symbol's
diff --git a/libcc1/libcp1plugin.cc b/libcc1/libcp1plugin.cc
index 0be8190..01740fd 100644
--- a/libcc1/libcp1plugin.cc
+++ b/libcc1/libcp1plugin.cc
@@ -245,14 +245,8 @@ plugin_binding_oracle (enum cp_oracle_request kind, tree identifier)
 
   switch (kind)
     {
-    case CP_ORACLE_SYMBOL:
-      request = GCC_CP_ORACLE_SYMBOL;
-      break;
-    case CP_ORACLE_TAG:
-      request = GCC_CP_ORACLE_TAG;
-      break;
-    case CP_ORACLE_LABEL:
-      request = GCC_CP_ORACLE_LABEL;
+    case CP_ORACLE_IDENTIFIER:
+      request = GCC_CP_ORACLE_IDENTIFIER;
       break;
     default:
       abort ();
@@ -866,7 +860,7 @@ plugin_push_function (cc1_plugin::connection *,
 }
 
 int
-plugin_pop_namespace (cc1_plugin::connection *)
+plugin_pop_binding_level (cc1_plugin::connection *)
 {
   pop_scope ();
   return 1;
@@ -919,7 +913,7 @@ get_current_scope ()
 }
 
 gcc_decl
-plugin_get_current_binding_level (cc1_plugin::connection *)
+plugin_get_current_binding_level_decl (cc1_plugin::connection *)
 {
   tree decl = get_current_scope ();
 
@@ -927,9 +921,36 @@ plugin_get_current_binding_level (cc1_plugin::connection *)
 }
 
 int
-plugin_using_namespace (cc1_plugin::connection *,
-			gcc_decl used_ns_in,
-			int inline_p)
+plugin_make_namespace_inline (cc1_plugin::connection *)
+{
+  tree inline_ns = current_namespace;
+
+  gcc_assert (toplevel_bindings_p ());
+  gcc_assert (inline_ns != global_namespace);
+
+  tree parent_ns = CP_DECL_CONTEXT (inline_ns);
+
+  if (purpose_member (DECL_NAMESPACE_ASSOCIATIONS (inline_ns),
+		      parent_ns))
+    return 0;
+
+  pop_namespace ();
+
+  gcc_assert (current_namespace == parent_ns);
+
+  DECL_NAMESPACE_ASSOCIATIONS (inline_ns)
+    = tree_cons (parent_ns, 0,
+		 DECL_NAMESPACE_ASSOCIATIONS (inline_ns));
+  do_using_directive (inline_ns);
+
+  push_namespace (DECL_NAME (inline_ns));
+
+  return 1;
+}
+
+int
+plugin_add_using_namespace (cc1_plugin::connection *,
+			    gcc_decl used_ns_in)
 {
   tree used_ns = convert_in (used_ns_in);
 
@@ -937,26 +958,11 @@ plugin_using_namespace (cc1_plugin::connection *,
 
   do_using_directive (used_ns);
 
-  /* ??? Should we build the attribute and call parse_using_directive
-     instead, to avoid logic duplication?  */
-  if (inline_p)
-    {
-      /* Make sure other values are not used; we might want to make it
-	 an enum bitfield in the future.  */
-      gcc_assert (inline_p == 1);
-
-      gcc_assert (toplevel_bindings_p ());
-      gcc_assert (is_ancestor (current_namespace, used_ns));
-      DECL_NAMESPACE_ASSOCIATIONS (used_ns)
-	= tree_cons (current_namespace, 0,
-		     DECL_NAMESPACE_ASSOCIATIONS (used_ns));
-    }
-
   return 1;
 }
 
 int
-plugin_new_namespace_alias (cc1_plugin::connection *,
+plugin_add_namespace_alias (cc1_plugin::connection *,
 			    const char *id,
 			    gcc_decl target_in)
 {
@@ -995,7 +1001,7 @@ set_access_flags (tree decl, enum gcc_cp_symbol_kind flags)
 }
 
 int
-plugin_new_using_decl (cc1_plugin::connection *,
+plugin_add_using_decl (cc1_plugin::connection *,
 		       enum gcc_cp_symbol_kind flags,
 		       gcc_decl target_in)
 {
@@ -1020,9 +1026,6 @@ plugin_new_using_decl (cc1_plugin::connection *,
     {
       tree decl = do_class_using_decl (tcontext, identifier);
 
-      if (DECL_DECLARES_TYPE_P (target))
-	USING_DECL_TYPENAME_P (decl);
-
       set_access_flags (decl, flags);
 
       finish_member_declaration (decl);
@@ -1059,14 +1062,14 @@ build_named_class_type (enum tree_code code,
 #define TP_PARM_LIST TREE_TYPE (current_template_parms)
 
 gcc_decl
-plugin_new_decl (cc1_plugin::connection *self,
-		 const char *name,
-		 enum gcc_cp_symbol_kind sym_kind,
-		 gcc_type sym_type_in,
-		 const char *substitution_name,
-		 gcc_address address,
-		 const char *filename,
-		 unsigned int line_number)
+plugin_build_decl (cc1_plugin::connection *self,
+		   const char *name,
+		   enum gcc_cp_symbol_kind sym_kind,
+		   gcc_type sym_type_in,
+		   const char *substitution_name,
+		   gcc_address address,
+		   const char *filename,
+		   unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   gcc_assert (!name || !strchr (name, ':')); // FIXME: this can go eventually.
@@ -1097,13 +1100,6 @@ plugin_new_decl (cc1_plugin::connection *self,
       gcc_assert (!sym_flags);
       break;
 
-    case GCC_CP_SYMBOL_LABEL:
-      // FIXME: we aren't ready to handle labels yet.
-      // It isn't clear how to translate them properly
-      // and in any case a "goto" isn't likely to work.
-      gcc_assert (!sym_flags);
-      return convert_out (error_mark_node);
-
     case GCC_CP_SYMBOL_CLASS:
       code = RECORD_TYPE;
       gcc_assert (!(sym_flags & ~GCC_CP_FLAG_MASK_CLASS));
@@ -1654,7 +1650,7 @@ plugin_define_cdtor_clone (cc1_plugin::connection *self,
 }
 
 int
-plugin_new_friend (cc1_plugin::connection * /* self */,
+plugin_add_friend (cc1_plugin::connection * /* self */,
 		   gcc_decl decl_in,
 		   gcc_type type_in)
 {
@@ -1758,11 +1754,11 @@ start_class_def (tree type,
 }
 
 gcc_type
-plugin_start_class_definition (cc1_plugin::connection *self,
-			       gcc_decl typedecl_in,
-			       const gcc_vbase_array *base_classes,
-			       const char *filename,
-			       unsigned int line_number)
+plugin_start_class_type (cc1_plugin::connection *self,
+			 gcc_decl typedecl_in,
+			 const gcc_vbase_array *base_classes,
+			 const char *filename,
+			 unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -1780,12 +1776,12 @@ plugin_start_class_definition (cc1_plugin::connection *self,
 }
 
 gcc_type
-plugin_start_new_closure_type (cc1_plugin::connection *self,
-			       int discriminator,
-			       gcc_decl extra_scope_in,
-			       enum gcc_cp_symbol_kind flags,
-			       const char *filename,
-			       unsigned int line_number)
+plugin_start_closure_class_type (cc1_plugin::connection *self,
+				 int discriminator,
+				 gcc_decl extra_scope_in,
+				 enum gcc_cp_symbol_kind flags,
+				 const char *filename,
+				 unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree extra_scope = convert_in (extra_scope_in);
@@ -1842,8 +1838,8 @@ plugin_start_new_closure_type (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_get_lambda_expr (cc1_plugin::connection *self,
-			gcc_type closure_type_in)
+plugin_build_lambda_expr (cc1_plugin::connection *self,
+			  gcc_type closure_type_in)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree closure_type = convert_in (closure_type_in);
@@ -1858,12 +1854,12 @@ plugin_get_lambda_expr (cc1_plugin::connection *self,
 }
 
 gcc_decl
-plugin_new_field (cc1_plugin::connection *,
-		  const char *field_name,
-		  gcc_type field_type_in,
-		  enum gcc_cp_symbol_kind flags,
-		  unsigned long bitsize,
-		  unsigned long bitpos)
+plugin_build_field (cc1_plugin::connection *,
+		    const char *field_name,
+		    gcc_type field_type_in,
+		    enum gcc_cp_symbol_kind flags,
+		    unsigned long bitsize,
+		    unsigned long bitpos)
 {
   tree record_or_union_type = current_class_type;
   tree field_type = convert_in (field_type_in);
@@ -1914,8 +1910,8 @@ plugin_new_field (cc1_plugin::connection *,
 }
 
 int
-plugin_finish_record_or_union (cc1_plugin::connection *,
-			       unsigned long size_in_bytes)
+plugin_finish_class_type (cc1_plugin::connection *,
+			  unsigned long size_in_bytes)
 {
   tree record_or_union_type = current_class_type;
 
@@ -1930,12 +1926,12 @@ plugin_finish_record_or_union (cc1_plugin::connection *,
 }
 
 gcc_type
-plugin_start_new_enum_type (cc1_plugin::connection *self,
-			    const char *name,
-			    gcc_type underlying_int_type_in,
-			    enum gcc_cp_symbol_kind flags,
-			    const char *filename,
-			    unsigned int line_number)
+plugin_start_enum_type (cc1_plugin::connection *self,
+			const char *name,
+			gcc_type underlying_int_type_in,
+			enum gcc_cp_symbol_kind flags,
+			const char *filename,
+			unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree underlying_int_type = convert_in (underlying_int_type_in);
@@ -1970,10 +1966,10 @@ plugin_start_new_enum_type (cc1_plugin::connection *self,
 }
 
 gcc_decl
-plugin_build_add_enum_constant (cc1_plugin::connection *,
-				gcc_type enum_type_in,
-				const char *name,
-				unsigned long value)
+plugin_build_enum_constant (cc1_plugin::connection *,
+			    gcc_type enum_type_in,
+			    const char *name,
+			    unsigned long value)
 {
   tree enum_type = convert_in (enum_type_in);
 
@@ -2026,6 +2022,8 @@ plugin_build_function_type (cc1_plugin::connection *self,
   return convert_out (ctx->preserve (result));
 }
 
+#if 0
+
 gcc_type
 plugin_add_function_default_args (cc1_plugin::connection *self,
 				  gcc_type function_type_in,
@@ -2113,6 +2111,8 @@ plugin_set_deferred_function_default_args (cc1_plugin::connection *,
   return 1;
 }
 
+#endif
+
 gcc_decl
 plugin_get_function_parameter_decl (cc1_plugin::connection *,
 				    gcc_decl function_in,
@@ -2221,7 +2221,7 @@ plugin_build_pointer_to_member_type (cc1_plugin::connection *self,
 }
 
 int
-plugin_start_new_template_decl (cc1_plugin::connection *self ATTRIBUTE_UNUSED)
+plugin_start_template_decl (cc1_plugin::connection *)
 {
   begin_template_parm_list ();
 
@@ -2231,8 +2231,8 @@ plugin_start_new_template_decl (cc1_plugin::connection *self ATTRIBUTE_UNUSED)
 }
 
 gcc_decl
-plugin_type_decl (cc1_plugin::connection *,
-		  gcc_type type_in)
+plugin_get_type_decl (cc1_plugin::connection *,
+		      gcc_type type_in)
 {
   tree type = convert_in (type_in);
 
@@ -2243,8 +2243,8 @@ plugin_type_decl (cc1_plugin::connection *,
 }
 
 gcc_type
-plugin_decl_type (cc1_plugin::connection *,
-		  gcc_decl decl_in)
+plugin_get_decl_type (cc1_plugin::connection *,
+		      gcc_decl decl_in)
 {
   tree decl = convert_in (decl_in);
 
@@ -2255,12 +2255,12 @@ plugin_decl_type (cc1_plugin::connection *,
 }
 
 gcc_type
-plugin_new_template_typename_parm (cc1_plugin::connection *self,
-				   const char *id,
-				   int /* bool */ pack_p,
-				   gcc_type default_type,
-				   const char *filename,
-				   unsigned int line_number)
+plugin_build_type_template_parameter (cc1_plugin::connection *self,
+				      const char *id,
+				      int /* bool */ pack_p,
+				      gcc_type default_type,
+				      const char *filename,
+				      unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -2285,12 +2285,12 @@ plugin_new_template_typename_parm (cc1_plugin::connection *self,
 }
 
 gcc_utempl
-plugin_new_template_template_parm (cc1_plugin::connection *self,
-				   const char *id,
-				   int /* bool */ pack_p,
-				   gcc_utempl default_templ,
-				   const char *filename,
-				   unsigned int line_number)
+plugin_build_template_template_parameter (cc1_plugin::connection *self,
+					  const char *id,
+					  int /* bool */ pack_p,
+					  gcc_utempl default_templ,
+					  const char *filename,
+					  unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -2320,12 +2320,12 @@ plugin_new_template_template_parm (cc1_plugin::connection *self,
 }
 
 gcc_decl
-plugin_new_template_value_parm (cc1_plugin::connection *self,
-				gcc_type type,
-				const char *id,
-				gcc_expr default_value,
-				const char *filename,
-				unsigned int line_number)
+plugin_build_value_template_parameter (cc1_plugin::connection *self,
+				       gcc_type type,
+				       const char *id,
+				       gcc_expr default_value,
+				       const char *filename,
+				       unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -2390,10 +2390,10 @@ targlist (const gcc_cp_template_args *targs)
 }
 
 gcc_type
-plugin_new_dependent_typename (cc1_plugin::connection *self,
-			       gcc_type enclosing_type,
-			       const char *id,
-			       const gcc_cp_template_args *targs)
+plugin_build_dependent_typename (cc1_plugin::connection *self,
+				 gcc_type enclosing_type,
+				 const char *id,
+				 const gcc_cp_template_args *targs)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (enclosing_type);
@@ -2407,9 +2407,9 @@ plugin_new_dependent_typename (cc1_plugin::connection *self,
 }
 
 gcc_utempl
-plugin_new_dependent_class_template (cc1_plugin::connection *self,
-				     gcc_type enclosing_type,
-				     const char *id)
+plugin_build_dependent_class_template (cc1_plugin::connection *self,
+				       gcc_type enclosing_type,
+				       const char *id)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (enclosing_type);
@@ -2420,9 +2420,9 @@ plugin_new_dependent_class_template (cc1_plugin::connection *self,
 }
 
 gcc_type
-plugin_new_dependent_typespec (cc1_plugin::connection *self,
-			       gcc_utempl template_decl,
-			       const gcc_cp_template_args *targs)
+plugin_build_dependent_type_template_id (cc1_plugin::connection *self,
+					 gcc_utempl template_decl,
+					 const gcc_cp_template_args *targs)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (template_decl);
@@ -2432,12 +2432,12 @@ plugin_new_dependent_typespec (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_new_dependent_value_expr (cc1_plugin::connection *self,
-				 gcc_decl enclosing_scope,
-				 enum gcc_cp_symbol_kind flags,
-				 const char *name,
-				 gcc_type conv_type_in,
-				 const gcc_cp_template_args *targs)
+plugin_build_dependent_expr (cc1_plugin::connection *self,
+			     gcc_decl enclosing_scope,
+			     enum gcc_cp_symbol_kind flags,
+			     const char *name,
+			     gcc_type conv_type_in,
+			     const gcc_cp_template_args *targs)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree scope = convert_in (enclosing_scope);
@@ -2691,8 +2691,8 @@ plugin_new_dependent_value_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_literal_expr (cc1_plugin::connection *self,
-		     gcc_type type, unsigned long value)
+plugin_build_literal_expr (cc1_plugin::connection *self,
+			   gcc_type type, unsigned long value)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree t = convert_in (type);
@@ -2701,9 +2701,9 @@ plugin_literal_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_decl_expr (cc1_plugin::connection *self,
-		  gcc_decl decl_in,
-		  int qualified_p)
+plugin_build_decl_expr (cc1_plugin::connection *self,
+			gcc_decl decl_in,
+			int qualified_p)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree decl = convert_in (decl_in);
@@ -2719,7 +2719,7 @@ plugin_decl_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_unary_value_expr (cc1_plugin::connection *self,
+plugin_build_unary_expr (cc1_plugin::connection *self,
 			 const char *unary_op,
 			 gcc_expr operand)
 {
@@ -2860,7 +2860,7 @@ plugin_unary_value_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_binary_value_expr (cc1_plugin::connection *self,
+plugin_build_binary_expr (cc1_plugin::connection *self,
 			  const char *binary_op,
 			  gcc_expr operand1,
 			  gcc_expr operand2)
@@ -2985,7 +2985,7 @@ plugin_binary_value_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_ternary_value_expr (cc1_plugin::connection *self,
+plugin_build_ternary_expr (cc1_plugin::connection *self,
 			   const char *ternary_op,
 			   gcc_expr operand1,
 			   gcc_expr operand2,
@@ -3017,9 +3017,9 @@ plugin_ternary_value_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_unary_type_expr (cc1_plugin::connection *self,
-			const char *unary_op,
-			gcc_type operand)
+plugin_build_unary_type_expr (cc1_plugin::connection *self,
+			      const char *unary_op,
+			      gcc_type operand)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (operand);
@@ -3080,7 +3080,7 @@ plugin_unary_type_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_type_value_expr (cc1_plugin::connection *self,
+plugin_build_cast_expr (cc1_plugin::connection *self,
 			const char *binary_op,
 			gcc_type operand1,
 			gcc_expr operand2)
@@ -3162,10 +3162,10 @@ args_to_ctor_elts (const struct gcc_cp_function_args *args_in)
 }
 
 gcc_expr
-plugin_values_expr (cc1_plugin::connection *self,
-		    const char *conv_op,
-		    gcc_type type_in,
-		    const struct gcc_cp_function_args *values_in)
+plugin_build_expression_list_expr (cc1_plugin::connection *self,
+				   const char *conv_op,
+				   gcc_type type_in,
+				   const struct gcc_cp_function_args *values_in)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (type_in);
@@ -3203,11 +3203,11 @@ plugin_values_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_alloc_expr (cc1_plugin::connection *self,
-		   const char *new_op,
-		   const struct gcc_cp_function_args *placement_in,
-		   gcc_type type_in,
-		   const struct gcc_cp_function_args *initializer_in)
+plugin_build_new_expr (cc1_plugin::connection *self,
+		       const char *new_op,
+		       const struct gcc_cp_function_args *placement_in,
+		       gcc_type type_in,
+		       const struct gcc_cp_function_args *initializer_in)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree type = convert_in (type_in);
@@ -3291,9 +3291,9 @@ plugin_alloc_expr (cc1_plugin::connection *self,
 }
 
 gcc_expr
-plugin_call_expr (cc1_plugin::connection *self,
-		  gcc_expr callable_in, int qualified_p,
-		  const struct gcc_cp_function_args *args_in)
+plugin_build_call_expr (cc1_plugin::connection *self,
+			gcc_expr callable_in, int qualified_p,
+			const struct gcc_cp_function_args *args_in)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree callable = convert_in (callable_in);
@@ -3352,8 +3352,8 @@ plugin_call_expr (cc1_plugin::connection *self,
 }
 
 gcc_type
-plugin_expr_type (cc1_plugin::connection *self,
-		  gcc_expr operand)
+plugin_get_expr_type (cc1_plugin::connection *self,
+		      gcc_expr operand)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   tree op0 = convert_in (operand);
@@ -3369,12 +3369,12 @@ plugin_expr_type (cc1_plugin::connection *self,
 }
 
 gcc_decl
-plugin_specialize_function_template (cc1_plugin::connection *self,
-				     gcc_decl template_decl,
-				     const gcc_cp_template_args *targs,
-				     gcc_address address,
-				     const char *filename,
-				     unsigned int line_number)
+plugin_build_function_template_specialization (cc1_plugin::connection *self,
+					       gcc_decl template_decl,
+					       const gcc_cp_template_args *targs,
+					       gcc_address address,
+					       const char *filename,
+					       unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -3390,11 +3390,11 @@ plugin_specialize_function_template (cc1_plugin::connection *self,
 }
 
 gcc_decl
-plugin_specialize_class_template (cc1_plugin::connection *self,
-				  gcc_decl template_decl,
-				  const gcc_cp_template_args *args,
-				  const char *filename,
-				  unsigned int line_number)
+plugin_build_class_template_specialization (cc1_plugin::connection *self,
+					    gcc_decl template_decl,
+					    const gcc_cp_template_args *args,
+					    const char *filename,
+					    unsigned int line_number)
 {
   plugin_context *ctx = static_cast<plugin_context *> (self);
   source_location loc = ctx->get_source_location (filename, line_number);
@@ -3427,9 +3427,9 @@ safe_lookup_builtin_type (const char *builtin_name)
 }
 
 gcc_type
-plugin_int_type (cc1_plugin::connection *self,
-		 int is_unsigned, unsigned long size_in_bytes,
-		 const char *builtin_name)
+plugin_get_int_type (cc1_plugin::connection *self,
+		     int is_unsigned, unsigned long size_in_bytes,
+		     const char *builtin_name)
 {
   tree result;
 
@@ -3457,15 +3457,15 @@ plugin_int_type (cc1_plugin::connection *self,
 }
 
 gcc_type
-plugin_char_type (cc1_plugin::connection *)
+plugin_get_char_type (cc1_plugin::connection *)
 {
   return convert_out (char_type_node);
 }
 
 gcc_type
-plugin_float_type (cc1_plugin::connection *,
-		   unsigned long size_in_bytes,
-		   const char *builtin_name)
+plugin_get_float_type (cc1_plugin::connection *,
+		       unsigned long size_in_bytes,
+		       const char *builtin_name)
 {
   if (builtin_name)
     {
@@ -3490,13 +3490,13 @@ plugin_float_type (cc1_plugin::connection *,
 }
 
 gcc_type
-plugin_void_type (cc1_plugin::connection *)
+plugin_get_void_type (cc1_plugin::connection *)
 {
   return convert_out (void_type_node);
 }
 
 gcc_type
-plugin_bool_type (cc1_plugin::connection *)
+plugin_get_bool_type (cc1_plugin::connection *)
 {
   return convert_out (boolean_type_node);
 }
@@ -3643,7 +3643,7 @@ plugin_error (cc1_plugin::connection *,
 }
 
 int
-plugin_new_static_assert (cc1_plugin::connection *self,
+plugin_add_static_assert (cc1_plugin::connection *self,
 			  gcc_expr condition_in,
 			  const char *errormsg,
 			  const char *filename,



-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]