📄 semantics.c
字号:
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 + -