aboutsummaryrefslogtreecommitdiff
path: root/src/parseh.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-28 14:04:22 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-28 14:04:22 -0700
commita09b5055585a869bf5af522d19836e3f2c25fc5b (patch)
treef0be1c21f41b917b190e85fa14938cd5fe157d39 /src/parseh.cpp
parent2fc4b3629a0fdcca04b5c107a70f0e159bca3e49 (diff)
downloadzig-a09b5055585a869bf5af522d19836e3f2c25fc5b.tar.gz
zig-a09b5055585a869bf5af522d19836e3f2c25fc5b.zip
null pointer optimization for ?&T
this is necessary for the parseh change where all pointers from .h files are maybe pointers.
Diffstat (limited to 'src/parseh.cpp')
-rw-r--r--src/parseh.cpp16
1 files changed, 11 insertions, 5 deletions
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<const NamedDecl *>(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) {