⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semantics.c

📁 gcc-2.95.3 Linux下最常用的C编译器
💻 C
📖 第 1 页 / 共 3 页
字号:
	expand_computed_goto (destination);    }}/* Begin a try-block.  Returns a newly-created TRY_BLOCK if   appropriate.  */treebegin_try_block (){  if (processing_template_decl)    {      tree r = build_min_nt (TRY_BLOCK, NULL_TREE,			     NULL_TREE);      add_tree (r);      return r;    }  else    {      emit_line_note (input_filename, lineno);      expand_start_try_stmts ();      return NULL_TREE;    }}/* Finish a try-block, which may be given by TRY_BLOCK.  */voidfinish_try_block (try_block)     tree try_block;{  if (processing_template_decl)    RECHAIN_STMTS_FROM_LAST (try_block, TRY_STMTS (try_block));  else    {      expand_start_all_catch ();      }}/* Finish a handler-sequence for a try-block, which may be given by   TRY_BLOCK.  */voidfinish_handler_sequence (try_block)     tree try_block;{  if (processing_template_decl)    RECHAIN_STMTS_FROM_CHAIN (try_block, TRY_HANDLERS (try_block));  else    {      expand_end_all_catch ();    }}/* Begin a handler.  Returns a HANDLER if appropriate.  */treebegin_handler (){  tree r;  if (processing_template_decl)    {      r = build_min_nt (HANDLER, NULL_TREE, NULL_TREE);      add_tree (r);    }  else    r = NULL_TREE;  do_pushlevel ();  return r;}/* Finish the handler-parameters for a handler, which may be given by   HANDLER.  */voidfinish_handler_parms (handler)     tree handler;{  if (processing_template_decl)    RECHAIN_STMTS_FROM_CHAIN (handler, HANDLER_PARMS (handler));}/* Finish a handler, which may be given by HANDLER.  */voidfinish_handler (handler)     tree handler;{  if (processing_template_decl)    RECHAIN_STMTS_FROM_CHAIN (handler, HANDLER_BODY (handler));  else    expand_end_catch_block ();  do_poplevel ();}/* Begin a compound-statement.  If HAS_NO_SCOPE is non-zero, the   compound-statement does not define a scope.  Returns a new   COMPOUND_STMT if appropriate.  */treebegin_compound_stmt (has_no_scope)     int has_no_scope;{  tree r;   if (processing_template_decl)    {      r = build_min_nt (COMPOUND_STMT, NULL_TREE);      add_tree (r);      if (has_no_scope)	COMPOUND_STMT_NO_SCOPE (r) = 1;    }  else    r = NULL_TREE;  if (!has_no_scope)    do_pushlevel ();  return r;}/* Finish a compound-statement, which may be given by COMPOUND_STMT.   If HAS_NO_SCOPE is non-zero, the compound statement does not define   a scope.  */treefinish_compound_stmt (has_no_scope, compound_stmt)     int has_no_scope;     tree compound_stmt;{  tree r;  if (!has_no_scope)    r = do_poplevel ();  else    r = NULL_TREE;  if (processing_template_decl)    RECHAIN_STMTS_FROM_CHAIN (compound_stmt, 			      COMPOUND_BODY (compound_stmt));  finish_stmt ();  return r;}/* Finish an asm-statement, whose components are a CV_QUALIFIER, a   STRING, some OUTPUT_OPERANDS, some INPUT_OPERANDS, and some   CLOBBERS.  */voidfinish_asm_stmt (cv_qualifier, string, output_operands,		      input_operands, clobbers)     tree cv_qualifier;     tree string;     tree output_operands;     tree input_operands;     tree clobbers;{  if (TREE_CHAIN (string))    string = combine_strings (string);  if (processing_template_decl)    {      tree r = build_min_nt (ASM_STMT, cv_qualifier, string,			     output_operands, input_operands,			     clobbers);      add_tree (r);    }  else    {      emit_line_note (input_filename, lineno);      if (output_operands != NULL_TREE || input_operands != NULL_TREE	    || clobbers != NULL_TREE)	{	  tree t;	  if (cv_qualifier != NULL_TREE	      && cv_qualifier != ridpointers[(int) RID_VOLATILE])	    cp_warning ("%s qualifier ignored on asm",			IDENTIFIER_POINTER (cv_qualifier));	  for (t = input_operands; t; t = TREE_CHAIN (t))	    TREE_VALUE (t) = decay_conversion (TREE_VALUE (t));	  c_expand_asm_operands (string, output_operands,				 input_operands, 				 clobbers,				 cv_qualifier 				 == ridpointers[(int) RID_VOLATILE],				 input_filename, lineno);	}      else	{	  /* Don't warn about redundant specification of 'volatile' here.  */	  if (cv_qualifier != NULL_TREE	      && cv_qualifier != ridpointers[(int) RID_VOLATILE])	    cp_warning ("%s qualifier ignored on asm",			IDENTIFIER_POINTER (cv_qualifier));	  expand_asm (string);	}            finish_stmt ();    }}/* Finish a parenthesized expression EXPR.  */treefinish_parenthesized_expr (expr)     tree expr;{  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))    /* This inhibits warnings in truthvalue_conversion.  */    C_SET_EXP_ORIGINAL_CODE (expr, ERROR_MARK);   return expr;}/* Begin a statement-expression.  The value returned must be passed to   finish_stmt_expr.  */tree begin_stmt_expr (){  keep_next_level ();  /* If we're processing_template_decl, then the upcoming compound     statement will be chained onto the tree structure, starting at     last_tree.  We return last_tree so that we can later unhook the     compound statement.  */  return processing_template_decl ? last_tree : expand_start_stmt_expr(); }/* Finish a statement-expression.  RTL_EXPR should be the value   returned by the previous begin_stmt_expr; EXPR is the   statement-expression.  Returns an expression representing the   statement-expression.  */tree finish_stmt_expr (rtl_expr, expr)     tree rtl_expr;     tree expr;{  tree result;  if (!processing_template_decl)    {      rtl_expr = expand_end_stmt_expr (rtl_expr);      /* The statements have side effects, so the group does.  */      TREE_SIDE_EFFECTS (rtl_expr) = 1;    }  if (TREE_CODE (expr) == BLOCK)    {      /* Make a BIND_EXPR for the BLOCK already made.  */      if (processing_template_decl)	result = build_min_nt (BIND_EXPR, NULL_TREE, last_tree,			       NULL_TREE);      else	result = build (BIND_EXPR, TREE_TYPE (rtl_expr),			NULL_TREE, rtl_expr, expr);            /* Remove the block from the tree at this point.	 It gets put back at the proper place	 when the BIND_EXPR is expanded.  */      delete_block (expr);    }  else    result = expr;  if (processing_template_decl)    {      /* Remove the compound statement from the tree structure; it is	 now saved in the BIND_EXPR.  */      last_tree = rtl_expr;      TREE_CHAIN (last_tree) = NULL_TREE;    }    return result;}/* Finish a call to FN with ARGS.  Returns a representation of the   call.  */tree finish_call_expr (fn, args, koenig)     tree fn;     tree args;     int koenig;{  tree result;  if (koenig)    {      if (TREE_CODE (fn) == BIT_NOT_EXPR)	fn = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (fn, 0));      else if (TREE_CODE (fn) != TEMPLATE_ID_EXPR)	fn = do_identifier (fn, 2, args);    }  result = build_x_function_call (fn, args, current_class_ref);  if (TREE_CODE (result) == CALL_EXPR      && (! TREE_TYPE (result)          || TREE_CODE (TREE_TYPE (result)) != VOID_TYPE))    result = require_complete_type (result);  return result;}/* Finish a call to a postfix increment or decrement or EXPR.  (Which   is indicated by CODE, which should be POSTINCREMENT_EXPR or   POSTDECREMENT_EXPR.)  */tree finish_increment_expr (expr, code)     tree expr;     enum tree_code code;{  /* If we get an OFFSET_REF, turn it into what it really means (e.g.,     a COMPONENT_REF).  This way if we've got, say, a reference to a     static member that's being operated on, we don't end up trying to     find a member operator for the class it's in.  */  if (TREE_CODE (expr) == OFFSET_REF)    expr = resolve_offset_ref (expr);  return build_x_unary_op (code, expr);  }/* Finish a use of `this'.  Returns an expression for `this'.  */tree finish_this_expr (){  tree result;  if (current_class_ptr)    {#ifdef WARNING_ABOUT_CCD      TREE_USED (current_class_ptr) = 1;#endif      result = current_class_ptr;    }  else if (current_function_decl	   && DECL_STATIC_FUNCTION_P (current_function_decl))    {      error ("`this' is unavailable for static member functions");      result = error_mark_node;    }  else    {      if (current_function_decl)	error ("invalid use of `this' in non-member function");      else	error ("invalid use of `this' at top level");      result = error_mark_node;    }  return result;}/* Finish a member function call using OBJECT and ARGS as arguments to   FN.  Returns an expression for the call.  */tree finish_object_call_expr (fn, object, args)     tree fn;     tree object;     tree args;{#if 0  /* This is a future direction of this code, but because     build_x_function_call cannot always undo what is done in     build_component_ref entirely yet, we cannot do this.  */  tree real_fn = build_component_ref (object, fn, NULL_TREE, 1);  return finish_call_expr (real_fn, args);#else  if (TREE_CODE (fn) == TYPE_DECL)    {      if (processing_template_decl)	/* This can happen on code like:	   class X;	   template <class T> void f(T t) {	     t.X();	   }  	   We just grab the underlying IDENTIFIER.  */	fn = DECL_NAME (fn);      else	{	  cp_error ("calling type `%T' like a method", fn);	  return error_mark_node;	}    }  return build_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL);#endif}/* Finish a qualified member function call using OBJECT and ARGS as   arguments to FN.  Returns an expressino for the call.  */tree finish_qualified_object_call_expr (fn, object, args)     tree fn;     tree object;     tree args;{  if (IS_SIGNATURE (TREE_OPERAND (fn, 0)))    {      warning ("signature name in scope resolution ignored");      return finish_object_call_expr (TREE_OPERAND (fn, 1), object, args);    }  else    return build_scoped_method_call (object, TREE_OPERAND (fn, 0),				     TREE_OPERAND (fn, 1), args);}/* Finish a pseudo-destructor call expression of OBJECT, with SCOPE   being the scope, if any, of DESTRUCTOR.  Returns an expression for   the call.  */tree finish_pseudo_destructor_call_expr (object, scope, destructor)     tree object;     tree scope;     tree destructor;{  if (scope && scope != destructor)    cp_error ("destructor specifier `%T::~%T()' must have matching names", 	      scope, destructor);  if ((scope == NULL_TREE || IDENTIFIER_GLOBAL_VALUE (destructor))      && (TREE_CODE (TREE_TYPE (object)) !=	  TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (destructor)))))    cp_error ("`%E' is not of type `%T'", object, destructor);  return cp_convert (void_type_node, object);}/* Finish a call to a globally qualified member function FN using   ARGS.  Returns an expression for the call.  */tree finish_qualified_call_expr (fn, args)     tree fn;     tree args;{  if (processing_template_decl)    return build_min_nt (CALL_EXPR, copy_to_permanent (fn), args,			 NULL_TREE);  else    return build_member_call (TREE_OPERAND (fn, 0),			      TREE_OPERAND (fn, 1),			      args);}/* Finish an expression taking the address of LABEL.  Returns an   expression for the address.  */tree finish_label_address_expr (label)     tree label;{  tree result;  label = lookup_label (label);  if (label == NULL_TREE)    result = null_pointer_node;  else    {      TREE_USED (label) = 1;      result = build1 (ADDR_EXPR, ptr_type_node, label);      TREE_CONSTANT (result) = 1;    }  return result;}/* Finish an expression of the form CODE EXPR.  */treefinish_unary_op_expr (code, expr)     enum tree_code code;     tree expr;{  tree result = build_x_unary_op (code, expr);  if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST)    TREE_NEGATED_INT (result) = 1;  overflow_warning (result);  return result;}/* Finish an id-expression.  */treefinish_id_expr (expr)     tree expr;{  if (TREE_CODE (expr) == IDENTIFIER_NODE)    expr = do_identifier (expr, 1, NULL_TREE);  return expr;}/* Begin a new-placement.  */intbegin_new_placement (){  /* The arguments to a placement new might be passed to a     deallocation function, in the event that the allocation throws an     exception.  Since we don't expand exception handlers until the     end of a function, we must make sure the arguments stay around     that long.  */  return suspend_momentary ();}/* Finish a new-placement.  The ARGS are the placement arguments.  The   COOKIE is the value returned by the previous call to   begin_new_placement.  */treefinish_new_placement (args, cookie)     tree args;     int cookie;{  resume_momentary (cookie);  return args;}/* Begin a function defniition declared with DECL_SPECS and   DECLARATOR.  Returns non-zero if the function-declaration is   legal.  */intbegin_function_definition (decl_specs, declarator)     tree decl_specs;     tree declarator;{  tree specs;  tree attrs;  split_specs_attrs (decl_specs, &specs, &attrs);  if (!start_function (specs, declarator, attrs, 0))    return 0;    reinit_parse_for_function ();  /* The things we're about to see are not directly qualified by any     template headers we've seen thus far.  */  reset_specialization ();  return 1;}/* Begin a constructor declarator of the form `SCOPE::NAME'.  Returns   a SCOPE_REF.  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -