Commit a7c9aa7ddb

Andrew Kelley <andrew@ziglang.org>
2019-10-02 22:13:33
finish conversion of translate_c.cpp to use zig_clang.h
See #1964 translate_c.cpp now exclusively uses the clang API via zig_clang.h shaves off 5 seconds from building zig when translate_c.cpp (or any h files it uses) change.
1 parent f840861
src/translate_c.cpp
@@ -14,19 +14,6 @@
 #include "parser.hpp"
 #include "zig_clang.h"
 
-#if __GNUC__ >= 8
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wclass-memaccess"
-#endif
-
-#include <clang/Frontend/ASTUnit.h>
-#include <clang/Frontend/CompilerInstance.h>
-#include <clang/AST/Expr.h>
-
-#if __GNUC__ >= 8
-#pragma GCC diagnostic pop
-#endif
-
 #include <string.h>
 
 struct Alias {
@@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
         ZigClangSourceLocation source_loc);
 static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt);
 
-static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) {
-    return reinterpret_cast<const ZigClangAPSInt *>(src);
-}
-
-static const ZigClangAPValue *bitcast(const clang::APValue *src) {
-    return reinterpret_cast<const ZigClangAPValue *>(src);
-}
-
-//static const ZigClangStmt *bitcast(const clang::Stmt *src) {
-//    return reinterpret_cast<const ZigClangStmt *>(src);
-//}
-
-static const ZigClangExpr *bitcast(const clang::Expr *src) {
-    return reinterpret_cast<const ZigClangExpr *>(src);
-}
-
-static ZigClangSourceLocation bitcast(clang::SourceLocation src) {
-    ZigClangSourceLocation dest;
-    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangSourceLocation));
-    return dest;
-}
-static ZigClangQualType bitcast(clang::QualType src) {
-    ZigClangQualType dest;
-    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType));
-    return dest;
-}
-//static clang::QualType bitcast(ZigClangQualType src) {
-//    clang::QualType dest;
-//    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType));
-//    return dest;
-//}
 
 ATTRIBUTE_PRINTF(3, 4)
 static void emit_warning(Context *c, ZigClangSourceLocation sl, const char *format, ...) {
@@ -521,10 +477,10 @@ static AstNode *trans_create_node_apint(Context *c, const ZigClangAPSInt *aps_in
     return node;
 }
 
-static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) {
+static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) {
     uint8_t buf[128];
-    size_t written = ap_float.convertToHexString((char *)buf, 0, false,
-                                                 llvm::APFloat::rmNearestTiesToEven);
+    size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false,
+            ZigClangAPFloat_roundingMode_NearestTiesToEven);
     AstNode *node = trans_create_node(c, NodeTypeFloatLiteral);
     node->data.float_literal.bigfloat = allocate<BigFloat>(1);
     if (bigfloat_init_buf(node->data.float_literal.bigfloat, buf, written)) {
@@ -868,13 +824,14 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc
             if (record_def == nullptr) {
                 return true;
             }
-            for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
-                    it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
-                    it != it_end; ++it)
+            for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
+                    it_end = ZigClangRecordDecl_field_end(record_def);
+                    ZigClangRecordDecl_field_iterator_neq(it, it_end);
+                    it = ZigClangRecordDecl_field_iterator_next(it))
             {
-                const clang::FieldDecl *field_decl = *it;
+                const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
 
-                if (field_decl->isBitField()) {
+                if (ZigClangFieldDecl_isBitField(field_decl)) {
                     return true;
                 }
             }
@@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const
 }
 
 static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) {
-    llvm::APFloat result{0.0f};
-    if (!reinterpret_cast<const clang::FloatingLiteral *>(stmt)->EvaluateAsFloat(result, *reinterpret_cast<clang::ASTContext *>(c->ctx))) {
+    ZigClangAPFloat *result;
+    if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) {
         emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal");
         return nullptr;
     }
@@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons
 
 static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) {
     const ZigClangExpr *as_expr = reinterpret_cast<const ZigClangExpr *>(expr);
-    clang::Expr::EvalResult result;
-    if (!reinterpret_cast<const clang::ConstantExpr *>(expr)->EvaluateAsConstantExpr(result,
-                clang::Expr::EvaluateForCodeGen,
-                *reinterpret_cast<clang::ASTContext *>(c->ctx)))
+    ZigClangExprEvalResult result;
+    if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result,
+                ZigClangExpr_EvaluateForCodeGen, c->ctx))
     {
         emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression");
         return nullptr;
     }
-    AstNode *node = trans_ap_value(c, bitcast(&result.Val), ZigClangExpr_getType(as_expr),
+    AstNode *node = trans_ap_value(c, &result.Val, ZigClangExpr_getType(as_expr),
             ZigClangExpr_getBeginLoc(as_expr));
     return maybe_suppress_result(c, result_used, node);
 }
@@ -2452,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang
     TransScopeBlock *scope_block = trans_scope_block_find(scope);
     assert(scope_block != nullptr);
 
-    for (auto iter = reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_begin();
-            iter != reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_end(); iter++) {
-        ZigClangDecl *decl = reinterpret_cast<ZigClangDecl *>(*iter);
+    for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt),
+            iter_end = ZigClangDeclStmt_decl_end(stmt);
+        iter != iter_end; ++iter)
+    {
+        ZigClangDecl *decl = *iter;
         switch (ZigClangDecl_getKind(decl)) {
             case ZigClangDeclVar: {
-                clang::VarDecl *var_decl = (clang::VarDecl *)decl;
-                ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType());
+                ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl;
+                ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
                 AstNode *init_node = nullptr;
-                if (var_decl->hasInit()) {
-                    init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue);
+                if (ZigClangVarDecl_hasInit(var_decl)) {
+                    init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue);
                     if (init_node == nullptr)
                         return ErrorUnexpected;
 
@@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
 
     bool pure_enum = true;
     uint32_t field_count = 0;
-    for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
-              it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
-              it != it_end; ++it, field_count += 1)
+    for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
+            it_end = ZigClangEnumDecl_enumerator_end(enum_def);
+        ZigClangEnumDecl_enumerator_iterator_neq(it, it_end);
+        it = ZigClangEnumDecl_enumerator_iterator_next(it), field_count += 1)
     {
-        const clang::EnumConstantDecl *enum_const = *it;
-        if (enum_const->getInitExpr()) {
+        const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it);
+        if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) {
             pure_enum = false;
         }
     }
@@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
     }
     enum_node->data.container_decl.fields.resize(field_count);
     uint32_t i = 0;
-    for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
-            it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
-            it != it_end; ++it, i += 1)
+    for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
+            it_end = ZigClangEnumDecl_enumerator_end(enum_def);
+        ZigClangEnumDecl_enumerator_iterator_neq(it, it_end);
+        it = ZigClangEnumDecl_enumerator_iterator_next(it), i += 1)
     {
-        const clang::EnumConstantDecl *enum_const = *it;
+        const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it);
 
         Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const));
         Buf *field_name;
@@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
         }
 
         AstNode *int_node = pure_enum && !is_anonymous ?
-            nullptr : trans_create_node_apint(c, bitcast(&enum_const->getInitVal()));
+            nullptr : trans_create_node_apint(c, ZigClangEnumConstantDecl_getInitVal(enum_const));
         AstNode *field_node = trans_create_node(c, NodeTypeStructField);
         field_node->data.struct_field.name = field_name;
         field_node->data.struct_field.type = nullptr;
@@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
 
     // count fields and validate
     uint32_t field_count = 0;
-    for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
-              it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
-              it != it_end; ++it, field_count += 1)
+    for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
+        it_end = ZigClangRecordDecl_field_end(record_def);
+        ZigClangRecordDecl_field_iterator_neq(it, it_end);
+        it = ZigClangRecordDecl_field_iterator_next(it), field_count += 1)
     {
-        const clang::FieldDecl *field_decl = *it;
+        const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
 
-        if (field_decl->isBitField()) {
-            emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield",
-                    container_kind_name,
+        if (ZigClangFieldDecl_isBitField(field_decl)) {
+            emit_warning(c, ZigClangFieldDecl_getLocation(field_decl),
+                    "%s %s demoted to opaque type - has bitfield", container_kind_name,
                     is_anonymous ? "(anon)" : buf_ptr(bare_name));
             return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name);
         }
@@ -4468,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
     }
 
     uint32_t i = 0;
-    for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
-              it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
-              it != it_end; ++it, i += 1)
+    for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
+        it_end = ZigClangRecordDecl_field_end(record_def);
+        ZigClangRecordDecl_field_iterator_neq(it, it_end);
+        it = ZigClangRecordDecl_field_iterator_next(it), i += 1)
     {
-        const clang::FieldDecl *field_decl = *it;
+        const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
 
         AstNode *field_node = trans_create_node(c, NodeTypeStructField);
         field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl));
-        field_node->data.struct_field.type = trans_qual_type(c, bitcast(field_decl->getType()),
-                bitcast(field_decl->getLocation()));
+        field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl),
+                ZigClangFieldDecl_getLocation(field_decl));
 
         if (field_node->data.struct_field.type == nullptr) {
-            emit_warning(c, bitcast(field_decl->getLocation()),
+            emit_warning(c, ZigClangFieldDecl_getLocation(field_decl),
                     "%s %s demoted to opaque type - unresolved type",
                     container_kind_name,
                     is_anonymous ? "(anon)" : buf_ptr(bare_name));
@@ -4522,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
             init_node->data.container_init_expr.type = arr_type_node;
             init_node->data.container_init_expr.kind = ContainerInitKindArray;
 
-            const clang::Type *qt_type = reinterpret_cast<const clang::Type *>(ZigClangQualType_getTypePtr(qt));
-            ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType());
+            const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt);
+            ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type));
 
             for (size_t i = 0; i < init_count; i += 1) {
                 const ZigClangAPValue *elem_ap_val = ZigClangAPValue_getArrayInitializedElt(ap_value, i);
@@ -4569,8 +4531,7 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
             if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) {
                 return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue);
             }
-            //const clang::ValueDecl *value_decl = lval_base.get<const clang::ValueDecl *>();
-            emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl");
+            emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl");
             return nullptr;
         }
         case ZigClangAPValueFloat:
@@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
     zig_unreachable();
 }
 
-static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {
+static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) {
     Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl));
 
-    switch (var_decl->getTLSKind()) {
-        case clang::VarDecl::TLS_None:
+    switch (ZigClangVarDecl_getTLSKind(var_decl)) {
+        case ZigClangVarDecl_TLSKind_None:
             break;
-        case clang::VarDecl::TLS_Static:
-            emit_warning(c, bitcast(var_decl->getLocation()),
+        case ZigClangVarDecl_TLSKind_Static:
+            emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
                     "ignoring variable '%s' - static thread local storage", buf_ptr(name));
             return;
-        case clang::VarDecl::TLS_Dynamic:
-            emit_warning(c, bitcast(var_decl->getLocation()),
+        case ZigClangVarDecl_TLSKind_Dynamic:
+            emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
                     "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name));
             return;
     }
 
-    ZigClangQualType qt = bitcast(var_decl->getType());
-    AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation()));
+    ZigClangQualType qt = ZigClangVarDecl_getType(var_decl);
+    AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl));
     if (var_type == nullptr) {
-        emit_warning(c, bitcast(var_decl->getLocation()), "ignoring variable '%s' - unresolved type", buf_ptr(name));
+        emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unresolved type", buf_ptr(name));
         return;
     }
 
-    bool is_extern = var_decl->hasExternalStorage();
-    bool is_static = var_decl->isFileVarDecl();
+    bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl);
+    bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl);
     bool is_const = ZigClangQualType_isConstQualified(qt);
 
     if (is_static && !is_extern) {
         AstNode *init_node;
-        if (var_decl->hasInit()) {
-            const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue());
+        if (ZigClangVarDecl_hasInit(var_decl)) {
+            const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl);
             if (ap_value == nullptr) {
-                emit_warning(c, bitcast(var_decl->getLocation()),
+                emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
                         "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name));
                 return;
             }
-            init_node = trans_ap_value(c, ap_value, qt, bitcast(var_decl->getLocation()));
+            init_node = trans_ap_value(c, ap_value, qt, ZigClangVarDecl_getLocation(var_decl));
             if (init_node == nullptr)
                 return;
         } else {
@@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {
         return;
     }
 
-    emit_warning(c, bitcast(var_decl->getLocation()),
+    emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
         "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name));
     return;
 }
@@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) {
             resolve_record_decl(c, reinterpret_cast<const ZigClangRecordDecl *>(decl));
             break;
         case ZigClangDeclVar:
-            visit_var_decl(c, reinterpret_cast<const clang::VarDecl *>(decl));
+            visit_var_decl(c, reinterpret_cast<const ZigClangVarDecl *>(decl));
             break;
         default:
             emit_warning(c, ZigClangDecl_getLocation(decl), "ignoring %s decl", ZigClangDecl_getDeclKindName(decl));
@@ -5114,25 +5075,26 @@ static void process_macro(Context *c, CTokenize *ctok, Buf *name, const char *ch
     c->macro_table.put(name, result_node);
 }
 
-static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) {
-    clang::ASTUnit *unit = reinterpret_cast<clang::ASTUnit *>(zunit);
+static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) {
     CTokenize ctok = {{0}};
 
     // TODO if we see #undef, delete it from the table
+    for (ZigClangPreprocessingRecord_iterator it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit),
+        it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit); it.I != it_end.I; it.I += 1)
+    {
+        ZigClangPreprocessedEntity *entity = ZigClangPreprocessingRecord_iterator_deref(it);
 
-    for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) {
-        switch (entity->getKind()) {
-            case clang::PreprocessedEntity::InvalidKind:
-            case clang::PreprocessedEntity::InclusionDirectiveKind:
-            case clang::PreprocessedEntity::MacroExpansionKind:
+        switch (ZigClangPreprocessedEntity_getKind(entity)) {
+            case ZigClangPreprocessedEntity_InvalidKind:
+            case ZigClangPreprocessedEntity_InclusionDirectiveKind:
+            case ZigClangPreprocessedEntity_MacroExpansionKind:
                 continue;
-            case clang::PreprocessedEntity::MacroDefinitionKind:
+            case ZigClangPreprocessedEntity_MacroDefinitionKind:
                 {
-                    clang::MacroDefinitionRecord *macro = static_cast<clang::MacroDefinitionRecord *>(entity);
-                    const char *raw_name = macro->getName()->getNameStart();
-                    clang::SourceRange range = macro->getSourceRange();
-                    ZigClangSourceLocation begin_loc = bitcast(range.getBegin());
-                    ZigClangSourceLocation end_loc = bitcast(range.getEnd());
+                    ZigClangMacroDefinitionRecord *macro = reinterpret_cast<ZigClangMacroDefinitionRecord *>(entity);
+                    const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro);
+                    ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);
+                    ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro);
 
                     if (ZigClangSourceLocation_eq(begin_loc, end_loc)) {
                         // this means it is a macro without a value
src/zig_clang.cpp
@@ -1346,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum,
 static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, "");
 static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, "");
 
+void ZigClang_detect_enum_EntityKind(clang::PreprocessedEntity::EntityKind x) {
+    switch (x) {
+        case clang::PreprocessedEntity::InvalidKind:
+        case clang::PreprocessedEntity::MacroExpansionKind:
+        case clang::PreprocessedEntity::MacroDefinitionKind:
+        case clang::PreprocessedEntity::InclusionDirectiveKind:
+            break;
+    }
+}
+static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, "");
+static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, "");
+static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, "");
+static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, "");
+
+
+void ZigClang_detect_enum_ConstExprUsage(clang::Expr::ConstExprUsage x) {
+    switch (x) {
+        case clang::Expr::EvaluateForCodeGen:
+        case clang::Expr::EvaluateForMangling:
+            break;
+    }
+}
+static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, "");
+static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, "");
+
 
 static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
 
@@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_
     return dest;
 }
 
+static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), "");
+static ZigClangPreprocessingRecord_iterator bitcast(clang::PreprocessingRecord::iterator src) {
+    ZigClangPreprocessingRecord_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator));
+    return dest;
+}
+static clang::PreprocessingRecord::iterator bitcast(ZigClangPreprocessingRecord_iterator src) {
+    clang::PreprocessingRecord::iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator));
+    return dest;
+}
+
+static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), "");
+static ZigClangRecordDecl_field_iterator bitcast(clang::RecordDecl::field_iterator src) {
+    ZigClangRecordDecl_field_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator));
+    return dest;
+}
+static clang::RecordDecl::field_iterator bitcast(ZigClangRecordDecl_field_iterator src) {
+    clang::RecordDecl::field_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator));
+    return dest;
+}
+
+static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), "");
+static ZigClangEnumDecl_enumerator_iterator bitcast(clang::EnumDecl::enumerator_iterator src) {
+    ZigClangEnumDecl_enumerator_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator));
+    return dest;
+}
+static clang::EnumDecl::enumerator_iterator bitcast(ZigClangEnumDecl_enumerator_iterator src) {
+    clang::EnumDecl::enumerator_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator));
+    return dest;
+}
+
+
 ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self,
         ZigClangSourceLocation Loc)
 {
@@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex
             reinterpret_cast<bool (*)(void *, const clang::Decl *)>(Fn));
 }
 
+struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(
+        struct ZigClangASTUnit *self)
+{
+    auto casted = reinterpret_cast<const clang::ASTUnit *>(self);
+    return bitcast(casted->getLocalPreprocessingEntities().begin());
+}
+
+struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(
+        struct ZigClangASTUnit *self)
+{
+    auto casted = reinterpret_cast<const clang::ASTUnit *>(self);
+    return bitcast(casted->getLocalPreprocessingEntities().end());
+}
+
+struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref(
+        struct ZigClangPreprocessingRecord_iterator self)
+{
+    clang::PreprocessingRecord::iterator casted = bitcast(self);
+    clang::PreprocessedEntity *result = *casted;
+    return reinterpret_cast<ZigClangPreprocessedEntity *>(result);
+}
+
 const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) {
     const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordType *>(record_ty)->getDecl();
     return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);
@@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) {
     return casted->getTypeClassName();
 }
 
+const ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const ZigClangType *self) {
+    auto casted = reinterpret_cast<const clang::Type *>(self);
+    const clang::ArrayType *result = casted->getAsArrayTypeUnsafe();
+    return reinterpret_cast<const ZigClangArrayType *>(result);
+}
+
 ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) {
     auto casted = reinterpret_cast<const clang::Stmt *>(self);
     return bitcast(casted->getBeginLoc());
@@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res
     return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context);
 }
 
+bool ZigClangExpr_EvaluateAsFloat(const ZigClangExpr *self, ZigClangAPFloat **result,
+        const struct ZigClangASTContext *ctx)
+{
+    llvm::APFloat *ap_float = new llvm::APFloat(0.0f);
+    *result = reinterpret_cast<ZigClangAPFloat *>(ap_float);
+    auto casted = reinterpret_cast<const clang::Expr *>(self);
+    auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx);
+    return casted->EvaluateAsFloat(*ap_float, *casted_ctx);
+}
+
+bool ZigClangExpr_EvaluateAsConstantExpr(const ZigClangExpr *self, ZigClangExprEvalResult *result,
+        ZigClangExpr_ConstExprUsage usage, const struct ZigClangASTContext *ctx)
+{
+    auto casted_self = reinterpret_cast<const clang::Expr *>(self);
+    auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx);
+    clang::Expr::EvalResult eval_result;
+    if (!casted_self->EvaluateAsConstantExpr(eval_result, (clang::Expr::ConstExprUsage)usage, *casted_ctx)) {
+        return false;
+    }
+    *result = bitcast(eval_result);
+    return true;
+}
+
 ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) {
     auto casted = reinterpret_cast<const clang::APValue *>(self);
     return (ZigClangAPValueKind)casted->getKind();
@@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se
     return bitcast(casted->getType());
 }
 
+struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return bitcast(casted->getTypeSourceInfo()->getType());
+}
+
 const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) {
     auto casted = reinterpret_cast<const clang::VarDecl *>(self);
     return reinterpret_cast<const ZigClangExpr *>(casted->getInit());
@@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s
     return (ZigClangVarDecl_TLSKind)casted->getTLSKind();
 }
 
+struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return bitcast(casted->getLocation());
+}
+
+bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return casted->hasExternalStorage();
+}
+
+bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return casted->isFileVarDecl();
+}
+
+bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return casted->hasInit();
+}
+
+const ZigClangAPValue * ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    const clang::APValue *result = casted->evaluateValue();
+    return reinterpret_cast<const ZigClangAPValue *>(result);
+}
+
 enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) {
     auto casted = reinterpret_cast<const clang::BuiltinType *>(self);
     return (ZigClangBuiltinTypeKind)casted->getKind();
@@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar
     auto casted = reinterpret_cast<const clang::ParenExpr *>(self);
     return reinterpret_cast<const struct ZigClangExpr *>(casted->getSubExpr());
 }
+
+enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(
+        const struct ZigClangPreprocessedEntity *self)
+{
+    auto casted = reinterpret_cast<const clang::PreprocessedEntity *>(self);
+    return (ZigClangPreprocessedEntity_EntityKind)casted->getKind();
+}
+
+const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) {
+    auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
+    return casted->getName()->getNameStart();
+}
+
+struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *self) {
+    auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
+    return bitcast(casted->getSourceRange().getBegin());
+}
+
+struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *self) {
+    auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
+    return bitcast(casted->getSourceRange().getEnd());
+}
+
+ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *self) {
+    auto casted = reinterpret_cast<const clang::RecordDecl *>(self);
+    return bitcast(casted->field_begin());
+}
+
+ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *self) {
+    auto casted = reinterpret_cast<const clang::RecordDecl *>(self);
+    return bitcast(casted->field_end());
+}
+
+bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) {
+    auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
+    return casted->isBitField();
+}
+
+ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) {
+    auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
+    return bitcast(casted->getLocation());
+}
+
+ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) {
+    auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
+    return bitcast(casted->getType());
+}
+
+ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(
+        struct ZigClangRecordDecl_field_iterator self)
+{
+    clang::RecordDecl::field_iterator casted = bitcast(self);
+    ++casted;
+    return bitcast(casted);
+}
+
+const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(
+        struct ZigClangRecordDecl_field_iterator self)
+{
+    clang::RecordDecl::field_iterator casted = bitcast(self);
+    const clang::FieldDecl *result = *casted;
+    return reinterpret_cast<const ZigClangFieldDecl *>(result);
+}
+
+bool ZigClangRecordDecl_field_iterator_neq(
+        struct ZigClangRecordDecl_field_iterator a,
+        struct ZigClangRecordDecl_field_iterator b)
+{
+    clang::RecordDecl::field_iterator casted_a = bitcast(a);
+    clang::RecordDecl::field_iterator casted_b = bitcast(b);
+    return casted_a != casted_b;
+}
+
+ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *self) {
+    auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
+    return bitcast(casted->enumerator_begin());
+}
+
+ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *self) {
+    auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
+    return bitcast(casted->enumerator_end());
+}
+
+ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(
+        struct ZigClangEnumDecl_enumerator_iterator self)
+{
+    clang::EnumDecl::enumerator_iterator casted = bitcast(self);
+    ++casted;
+    return bitcast(casted);
+}
+
+const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(
+        struct ZigClangEnumDecl_enumerator_iterator self)
+{
+    clang::EnumDecl::enumerator_iterator casted = bitcast(self);
+    const clang::EnumConstantDecl *result = *casted;
+    return reinterpret_cast<const ZigClangEnumConstantDecl *>(result);
+}
+
+bool ZigClangEnumDecl_enumerator_iterator_neq(
+        struct ZigClangEnumDecl_enumerator_iterator a,
+        struct ZigClangEnumDecl_enumerator_iterator b)
+{
+    clang::EnumDecl::enumerator_iterator casted_a = bitcast(a);
+    clang::EnumDecl::enumerator_iterator casted_b = bitcast(b);
+    return casted_a != casted_b;
+}
+
+const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *self) {
+    auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self);
+    const clang::Expr *result = casted->getInitExpr();
+    return reinterpret_cast<const ZigClangExpr *>(result);
+}
+
+const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *self) {
+    auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self);
+    const llvm::APSInt *result = &casted->getInitVal();
+    return reinterpret_cast<const ZigClangAPSInt *>(result);
+}
src/zig_clang.h
@@ -122,6 +122,7 @@ struct ZigClangParmVarDecl;
 struct ZigClangPointerType;
 struct ZigClangPredefinedExpr;
 struct ZigClangPreprocessedEntity;
+struct ZigClangPreprocessingRecord;
 struct ZigClangRecordDecl;
 struct ZigClangRecordType;
 struct ZigClangReturnStmt;
@@ -146,6 +147,19 @@ struct ZigClangWhileStmt;
 typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator;
 typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator;
 
+struct ZigClangRecordDecl_field_iterator {
+    void *opaque;
+};
+
+struct ZigClangEnumDecl_enumerator_iterator {
+    void *opaque;
+};
+
+struct ZigClangPreprocessingRecord_iterator {
+    int I;
+    struct ZigClangPreprocessingRecord *Self;
+};
+
 enum ZigClangBO {
     ZigClangBO_PtrMemD,
     ZigClangBO_PtrMemI,
@@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword {
     ZigClangETK_None,
 };
 
+enum ZigClangPreprocessedEntity_EntityKind {
+    ZigClangPreprocessedEntity_InvalidKind,
+    ZigClangPreprocessedEntity_MacroExpansionKind,
+    ZigClangPreprocessedEntity_MacroDefinitionKind,
+    ZigClangPreprocessedEntity_InclusionDirectiveKind,
+};
+
+enum ZigClangExpr_ConstExprUsage {
+    ZigClangExpr_EvaluateForCodeGen,
+    ZigClangExpr_EvaluateForMangling,
+};
+
 ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *,
         struct ZigClangSourceLocation Loc);
 ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *,
@@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig
 ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *);
 ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,
     bool (*Fn)(void *context, const struct ZigClangDecl *decl));
+ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *);
+ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *);
+
+ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref(
+        struct ZigClangPreprocessingRecord_iterator);
+
+ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *);
 
 ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty);
 ZIG_EXTERN_C const struct ZigClangEnumDecl *ZigClangEnumType_getDecl(const struct ZigClangEnumType *record_ty);
@@ -840,8 +873,22 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangFunctionDecl_getBody(const struc
 ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl);
 ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl);
 ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl);
+ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *);
+ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *);
+ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator);
+ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator);
+ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq(
+        struct ZigClangRecordDecl_field_iterator a,
+        struct ZigClangRecordDecl_field_iterator b);
 
 ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *);
+ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *);
+ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *);
+ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator);
+ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator);
+ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq(
+        struct ZigClangEnumDecl_enumerator_iterator a,
+        struct ZigClangEnumDecl_enumerator_iterator b);
 
 ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl);
 ZIG_EXTERN_C enum ZigClangDeclKind ZigClangDecl_getKind(const struct ZigClangDecl *decl);
@@ -850,6 +897,12 @@ ZIG_EXTERN_C const char *ZigClangDecl_getDeclKindName(const struct ZigClangDecl
 ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *);
 ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl);
 ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl);
+ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *);
+ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *);
+ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *);
+ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *);
+ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *);
+ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *);
 
 ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b);
 
@@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl
 ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self);
 ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);
 ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);
+ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self);
 
 ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self);
 ZIG_EXTERN_C enum ZigClangStmtClass ZigClangStmt_getStmtClass(const struct ZigClangStmt *self);
@@ -879,6 +933,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangExpr_getType(const struct ZigClangE
 ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self);
 ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self,
         bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context);
+ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self,
+        ZigClangAPFloat **result, const struct ZigClangASTContext *ctx);
+ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *,
+        struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *);
 
 ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self);
 ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangAPValue_getInt(const struct ZigClangAPValue *self);
@@ -1031,4 +1089,15 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangCaseStmt_getSubStmt(const struct
 ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *);
 
 ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *);
+
+ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *);
+ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *);
+ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *);
+
+ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *);
+ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *);
+ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *);
+
+ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *);
+ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *);
 #endif