From a09b5055585a869bf5af522d19836e3f2c25fc5b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 28 Jan 2016 14:04:22 -0700 Subject: null pointer optimization for ?&T this is necessary for the parseh change where all pointers from .h files are maybe pointers. --- src/parseh.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/parseh.cpp') diff --git a/src/parseh.cpp b/src/parseh.cpp index e0b3506e12..20a061d85e 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -97,6 +97,14 @@ static AstNode *create_var_decl_node(Context *c, const char *var_name, AstNode * return node; } +static AstNode *create_prefix_node(Context *c, PrefixOp op, AstNode *child_node) { + AstNode *node = create_node(c, NodeTypePrefixOpExpr); + node->data.prefix_op_expr.prefix_op = op; + node->data.prefix_op_expr.primary_expr = child_node; + normalize_parent_ptrs(node); + return node; +} + static const char *decl_name(const Decl *decl) { const NamedDecl *named_decl = static_cast(decl); return (const char *)named_decl->getName().bytes_begin(); @@ -132,11 +140,9 @@ static AstNode *pointer_to_type(Context *c, AstNode *type_node, bool is_const) { if (!type_node) { return nullptr; } - AstNode *node = create_node(c, NodeTypePrefixOpExpr); - node->data.prefix_op_expr.prefix_op = is_const ? PrefixOpConstAddressOf : PrefixOpAddressOf; - node->data.prefix_op_expr.primary_expr = convert_to_c_void(c, type_node); - normalize_parent_ptrs(node); - return node; + PrefixOp op = is_const ? PrefixOpConstAddressOf : PrefixOpAddressOf; + AstNode *child_node = create_prefix_node(c, op, convert_to_c_void(c, type_node)); + return create_prefix_node(c, PrefixOpMaybe, child_node); } static AstNode *make_type_node(Context *c, const Type *ty, const Decl *decl) { -- cgit v1.2.3