- fixed implementation of various __builtin functions
[cparser] / ast_t.h
diff --git a/ast_t.h b/ast_t.h
index 182c85a..0a98d02 100644 (file)
--- a/ast_t.h
+++ b/ast_t.h
@@ -83,7 +83,7 @@ typedef enum expression_kind_t {
        EXPR_FUNCNAME,
        EXPR_BUILTIN_SYMBOL,
        EXPR_BUILTIN_CONSTANT_P,
-       EXPR_BUILTIN_PREFETCH,
+       EXPR_BUILTIN_TYPES_COMPATIBLE_P,
        EXPR_OFFSETOF,
        EXPR_VA_START,
        EXPR_VA_ARG,
@@ -217,7 +217,7 @@ typedef enum funcname_kind_t {
        case EXPR_UNARY_DELETE_ARRAY:
 
 /**
- * unary expression with optinal operand
+ * unary expression with optional operand
  */
 #define EXPR_UNARY_CASES_OPTIONAL \
        case EXPR_UNARY_THROW:        \
@@ -226,13 +226,16 @@ typedef enum funcname_kind_t {
        EXPR_UNARY_CASES_MANDATORY \
        EXPR_UNARY_CASES_OPTIONAL
 
+/**
+ * The base class of every expression.
+ */
 struct expression_base_t {
-       expression_kind_t   kind;
-       type_t             *type;
-       source_position_t   source_position;
+       expression_kind_t   kind;            /**< The expression kind. */
+       type_t             *type;            /**< The type of the expression. */
+       source_position_t   source_position; /**< The source position of this expression. */
        bool                parenthesized;
 #ifndef NDEBUG
-       bool                transformed;
+       bool                transformed;     /**< Set if this expression was transformed. */
 #endif
 };
 
@@ -280,11 +283,10 @@ struct builtin_constant_expression_t {
        expression_t      *value;
 };
 
-struct builtin_prefetch_expression_t {
+struct builtin_types_compatible_expression_t {
        expression_base_t  base;
-       expression_t      *adr;
-       expression_t      *rw;
-       expression_t      *locality;
+       type_t            *left;
+       type_t            *right;
 };
 
 struct reference_expression_t {
@@ -380,30 +382,30 @@ struct label_address_expression_t {
 };
 
 union expression_t {
-       expression_kind_t                kind;
-       expression_base_t                base;
-       const_expression_t               conste;
-       funcname_expression_t            funcname;
-       string_literal_expression_t      string;
-       wide_string_literal_expression_t wide_string;
-       compound_literal_expression_t    compound_literal;
-       builtin_symbol_expression_t      builtin_symbol;
-       builtin_constant_expression_t    builtin_constant;
-       builtin_prefetch_expression_t    builtin_prefetch;
-       reference_expression_t           reference;
-       call_expression_t                call;
-       unary_expression_t               unary;
-       binary_expression_t              binary;
-       select_expression_t              select;
-       array_access_expression_t        array_access;
-       typeprop_expression_t            typeprop;
-       offsetof_expression_t            offsetofe;
-       va_start_expression_t            va_starte;
-       va_arg_expression_t              va_arge;
-       conditional_expression_t         conditional;
-       statement_expression_t           statement;
-       classify_type_expression_t       classify_type;
-       label_address_expression_t       label_address;
+       expression_kind_t                     kind;
+       expression_base_t                     base;
+       const_expression_t                    conste;
+       funcname_expression_t                 funcname;
+       string_literal_expression_t           string;
+       wide_string_literal_expression_t      wide_string;
+       compound_literal_expression_t         compound_literal;
+       builtin_symbol_expression_t           builtin_symbol;
+       builtin_constant_expression_t         builtin_constant;
+       builtin_types_compatible_expression_t builtin_types_compatible;
+       reference_expression_t                reference;
+       call_expression_t                     call;
+       unary_expression_t                    unary;
+       binary_expression_t                   binary;
+       select_expression_t                   select;
+       array_access_expression_t             array_access;
+       typeprop_expression_t                 typeprop;
+       offsetof_expression_t                 offsetofe;
+       va_start_expression_t                 va_starte;
+       va_arg_expression_t                   va_arge;
+       conditional_expression_t              conditional;
+       statement_expression_t                statement;
+       classify_type_expression_t            classify_type;
+       label_address_expression_t            label_address;
 };
 
 typedef enum initializer_kind_t {
@@ -527,13 +529,15 @@ typedef enum gnu_attribute_kind_t {
        GNU_AK_LAST
 } gnu_attribute_kind_t;
 
+/**
+ * The statement kinds.
+ */
 typedef enum statement_kind_t {
        STATEMENT_INVALID,
        STATEMENT_EMPTY,
        STATEMENT_COMPOUND,
        STATEMENT_RETURN,
        STATEMENT_DECLARATION,
-       STATEMENT_LOCAL_LABEL,
        STATEMENT_IF,
        STATEMENT_SWITCH,
        STATEMENT_EXPRESSION,
@@ -550,6 +554,9 @@ typedef enum statement_kind_t {
        STATEMENT_LEAVE            /**< MS __leave */
 } statement_kind_t;
 
+/**
+ * The base class of every statement.
+ */
 struct statement_base_t {
        statement_kind_t   kind;
        statement_t       *next;
@@ -578,6 +585,7 @@ struct compound_statement_t {
        statement_base_t  base;
        statement_t      *statements;
        scope_t           scope;
+       bool              stmt_expr; /* The compound statement is a statement expression */
 };
 
 struct declaration_statement_t {
@@ -586,12 +594,6 @@ struct declaration_statement_t {
        entity_t         *declarations_end;
 };
 
-struct local_label_statement_t {
-       statement_base_t  base;
-       entity_t         *labels_begin;
-       entity_t         *labels_end;
-};
-
 struct if_statement_t {
        statement_base_t  base;
        expression_t     *condition;
@@ -700,7 +702,6 @@ union statement_t {
        return_statement_t       returns;
        compound_statement_t     compound;
        declaration_statement_t  declaration;
-       local_label_statement_t  local_label;
        if_statement_t           ifs;
        switch_statement_t       switchs;
        goto_statement_t         gotos;