authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-02 16:13:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-02 19:21:40-04:00
loga7c9aa7ddb06fe14c4c67e317586177141c9e37a
tree3521692fb20e1f996bff1a473ba1f2e162b04f70
parentf84086132f1a60ce4c46af1720eccb244cc13688
signaturelock-open Commit is signed but in an unrecognized format.

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.

3 files changed, 419 insertions(+), 125 deletions(-)

src/translate_c.cpp+87-125
......@@ -14,19 +14,6 @@
1414#include "parser.hpp"
1515#include "zig_clang.h"
1616
17#if __GNUC__ >= 8
18#pragma GCC diagnostic push
19#pragma GCC diagnostic ignored "-Wclass-memaccess"
20#endif
21
22#include <clang/Frontend/ASTUnit.h>
23#include <clang/Frontend/CompilerInstance.h>
24#include <clang/AST/Expr.h>
25
26#if __GNUC__ >= 8
27#pragma GCC diagnostic pop
28#endif
29
3017#include <string.h>
3118
3219struct Alias {
......@@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
129116 ZigClangSourceLocation source_loc);
130117static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt);
131118
132static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) {
133 return reinterpret_cast<const ZigClangAPSInt *>(src);
134}
135
136static const ZigClangAPValue *bitcast(const clang::APValue *src) {
137 return reinterpret_cast<const ZigClangAPValue *>(src);
138}
139
140//static const ZigClangStmt *bitcast(const clang::Stmt *src) {
141// return reinterpret_cast<const ZigClangStmt *>(src);
142//}
143
144static const ZigClangExpr *bitcast(const clang::Expr *src) {
145 return reinterpret_cast<const ZigClangExpr *>(src);
146}
147
148static ZigClangSourceLocation bitcast(clang::SourceLocation src) {
149 ZigClangSourceLocation dest;
150 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangSourceLocation));
151 return dest;
152}
153static ZigClangQualType bitcast(clang::QualType src) {
154 ZigClangQualType dest;
155 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType));
156 return dest;
157}
158//static clang::QualType bitcast(ZigClangQualType src) {
159// clang::QualType dest;
160// memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangQualType));
161// return dest;
162//}
163119
164120ATTRIBUTE_PRINTF(3, 4)
165121static 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
521477 return node;
522478}
523479
524static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) {
480static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) {
525481 uint8_t buf[128];
526 size_t written = ap_float.convertToHexString((char *)buf, 0, false,
527 llvm::APFloat::rmNearestTiesToEven);
482 size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false,
483 ZigClangAPFloat_roundingMode_NearestTiesToEven);
528484 AstNode *node = trans_create_node(c, NodeTypeFloatLiteral);
529485 node->data.float_literal.bigfloat = allocate<BigFloat>(1);
530486 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
868824 if (record_def == nullptr) {
869825 return true;
870826 }
871 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
872 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
873 it != it_end; ++it)
827 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
828 it_end = ZigClangRecordDecl_field_end(record_def);
829 ZigClangRecordDecl_field_iterator_neq(it, it_end);
830 it = ZigClangRecordDecl_field_iterator_next(it))
874831 {
875 const clang::FieldDecl *field_decl = *it;
832 const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
876833
877 if (field_decl->isBitField()) {
834 if (ZigClangFieldDecl_isBitField(field_decl)) {
878835 return true;
879836 }
880837 }
......@@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const
13931350}
13941351
13951352static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) {
1396 llvm::APFloat result{0.0f};
1397 if (!reinterpret_cast<const clang::FloatingLiteral *>(stmt)->EvaluateAsFloat(result, *reinterpret_cast<clang::ASTContext *>(c->ctx))) {
1353 ZigClangAPFloat *result;
1354 if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) {
13981355 emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal");
13991356 return nullptr;
14001357 }
......@@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons
14341391
14351392static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) {
14361393 const ZigClangExpr *as_expr = reinterpret_cast<const ZigClangExpr *>(expr);
1437 clang::Expr::EvalResult result;
1438 if (!reinterpret_cast<const clang::ConstantExpr *>(expr)->EvaluateAsConstantExpr(result,
1439 clang::Expr::EvaluateForCodeGen,
1440 *reinterpret_cast<clang::ASTContext *>(c->ctx)))
1394 ZigClangExprEvalResult result;
1395 if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result,
1396 ZigClangExpr_EvaluateForCodeGen, c->ctx))
14411397 {
14421398 emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression");
14431399 return nullptr;
14441400 }
1445 AstNode *node = trans_ap_value(c, bitcast(&result.Val), ZigClangExpr_getType(as_expr),
1401 AstNode *node = trans_ap_value(c, &result.Val, ZigClangExpr_getType(as_expr),
14461402 ZigClangExpr_getBeginLoc(as_expr));
14471403 return maybe_suppress_result(c, result_used, node);
14481404}
......@@ -2452,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang
24522408 TransScopeBlock *scope_block = trans_scope_block_find(scope);
24532409 assert(scope_block != nullptr);
24542410
2455 for (auto iter = reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_begin();
2456 iter != reinterpret_cast<const clang::DeclStmt *>(stmt)->decl_end(); iter++) {
2457 ZigClangDecl *decl = reinterpret_cast<ZigClangDecl *>(*iter);
2411 for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt),
2412 iter_end = ZigClangDeclStmt_decl_end(stmt);
2413 iter != iter_end; ++iter)
2414 {
2415 ZigClangDecl *decl = *iter;
24582416 switch (ZigClangDecl_getKind(decl)) {
24592417 case ZigClangDeclVar: {
2460 clang::VarDecl *var_decl = (clang::VarDecl *)decl;
2461 ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType());
2418 ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl;
2419 ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
24622420 AstNode *init_node = nullptr;
2463 if (var_decl->hasInit()) {
2464 init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue);
2421 if (ZigClangVarDecl_hasInit(var_decl)) {
2422 init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue);
24652423 if (init_node == nullptr)
24662424 return ErrorUnexpected;
24672425
......@@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
43174275
43184276 bool pure_enum = true;
43194277 uint32_t field_count = 0;
4320 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4321 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
4322 it != it_end; ++it, field_count += 1)
4278 for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
4279 it_end = ZigClangEnumDecl_enumerator_end(enum_def);
4280 ZigClangEnumDecl_enumerator_iterator_neq(it, it_end);
4281 it = ZigClangEnumDecl_enumerator_iterator_next(it), field_count += 1)
43234282 {
4324 const clang::EnumConstantDecl *enum_const = *it;
4325 if (enum_const->getInitExpr()) {
4283 const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it);
4284 if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) {
43264285 pure_enum = false;
43274286 }
43284287 }
......@@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
43434302 }
43444303 enum_node->data.container_decl.fields.resize(field_count);
43454304 uint32_t i = 0;
4346 for (auto it = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_begin(),
4347 it_end = reinterpret_cast<const clang::EnumDecl *>(enum_def)->enumerator_end();
4348 it != it_end; ++it, i += 1)
4305 for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def),
4306 it_end = ZigClangEnumDecl_enumerator_end(enum_def);
4307 ZigClangEnumDecl_enumerator_iterator_neq(it, it_end);
4308 it = ZigClangEnumDecl_enumerator_iterator_next(it), i += 1)
43494309 {
4350 const clang::EnumConstantDecl *enum_const = *it;
4310 const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it);
43514311
43524312 Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const));
43534313 Buf *field_name;
......@@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl)
43584318 }
43594319
43604320 AstNode *int_node = pure_enum && !is_anonymous ?
4361 nullptr : trans_create_node_apint(c, bitcast(&enum_const->getInitVal()));
4321 nullptr : trans_create_node_apint(c, ZigClangEnumConstantDecl_getInitVal(enum_const));
43624322 AstNode *field_node = trans_create_node(c, NodeTypeStructField);
43634323 field_node->data.struct_field.name = field_name;
43644324 field_node->data.struct_field.type = nullptr;
......@@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
44384398
44394399 // count fields and validate
44404400 uint32_t field_count = 0;
4441 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
4442 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
4443 it != it_end; ++it, field_count += 1)
4401 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
4402 it_end = ZigClangRecordDecl_field_end(record_def);
4403 ZigClangRecordDecl_field_iterator_neq(it, it_end);
4404 it = ZigClangRecordDecl_field_iterator_next(it), field_count += 1)
44444405 {
4445 const clang::FieldDecl *field_decl = *it;
4406 const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
44464407
4447 if (field_decl->isBitField()) {
4448 emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield",
4449 container_kind_name,
4408 if (ZigClangFieldDecl_isBitField(field_decl)) {
4409 emit_warning(c, ZigClangFieldDecl_getLocation(field_decl),
4410 "%s %s demoted to opaque type - has bitfield", container_kind_name,
44504411 is_anonymous ? "(anon)" : buf_ptr(bare_name));
44514412 return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name);
44524413 }
......@@ -4468,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record
44684429 }
44694430
44704431 uint32_t i = 0;
4471 for (auto it = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_begin(),
4472 it_end = reinterpret_cast<const clang::RecordDecl *>(record_def)->field_end();
4473 it != it_end; ++it, i += 1)
4432 for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def),
4433 it_end = ZigClangRecordDecl_field_end(record_def);
4434 ZigClangRecordDecl_field_iterator_neq(it, it_end);
4435 it = ZigClangRecordDecl_field_iterator_next(it), i += 1)
44744436 {
4475 const clang::FieldDecl *field_decl = *it;
4437 const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it);
44764438
44774439 AstNode *field_node = trans_create_node(c, NodeTypeStructField);
44784440 field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl));
4479 field_node->data.struct_field.type = trans_qual_type(c, bitcast(field_decl->getType()),
4480 bitcast(field_decl->getLocation()));
4441 field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl),
4442 ZigClangFieldDecl_getLocation(field_decl));
44814443
44824444 if (field_node->data.struct_field.type == nullptr) {
4483 emit_warning(c, bitcast(field_decl->getLocation()),
4445 emit_warning(c, ZigClangFieldDecl_getLocation(field_decl),
44844446 "%s %s demoted to opaque type - unresolved type",
44854447 container_kind_name,
44864448 is_anonymous ? "(anon)" : buf_ptr(bare_name));
......@@ -4522,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
45224484 init_node->data.container_init_expr.type = arr_type_node;
45234485 init_node->data.container_init_expr.kind = ContainerInitKindArray;
45244486
4525 const clang::Type *qt_type = reinterpret_cast<const clang::Type *>(ZigClangQualType_getTypePtr(qt));
4526 ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType());
4487 const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt);
4488 ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type));
45274489
45284490 for (size_t i = 0; i < init_count; i += 1) {
45294491 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
45694531 if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) {
45704532 return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue);
45714533 }
4572 //const clang::ValueDecl *value_decl = lval_base.get<const clang::ValueDecl *>();
4573 emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl");
4534 emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl");
45744535 return nullptr;
45754536 }
45764537 case ZigClangAPValueFloat:
......@@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC
46074568 zig_unreachable();
46084569}
46094570
4610static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {
4571static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) {
46114572 Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl));
46124573
4613 switch (var_decl->getTLSKind()) {
4614 case clang::VarDecl::TLS_None:
4574 switch (ZigClangVarDecl_getTLSKind(var_decl)) {
4575 case ZigClangVarDecl_TLSKind_None:
46154576 break;
4616 case clang::VarDecl::TLS_Static:
4617 emit_warning(c, bitcast(var_decl->getLocation()),
4577 case ZigClangVarDecl_TLSKind_Static:
4578 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
46184579 "ignoring variable '%s' - static thread local storage", buf_ptr(name));
46194580 return;
4620 case clang::VarDecl::TLS_Dynamic:
4621 emit_warning(c, bitcast(var_decl->getLocation()),
4581 case ZigClangVarDecl_TLSKind_Dynamic:
4582 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
46224583 "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name));
46234584 return;
46244585 }
46254586
4626 ZigClangQualType qt = bitcast(var_decl->getType());
4627 AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation()));
4587 ZigClangQualType qt = ZigClangVarDecl_getType(var_decl);
4588 AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl));
46284589 if (var_type == nullptr) {
4629 emit_warning(c, bitcast(var_decl->getLocation()), "ignoring variable '%s' - unresolved type", buf_ptr(name));
4590 emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unresolved type", buf_ptr(name));
46304591 return;
46314592 }
46324593
4633 bool is_extern = var_decl->hasExternalStorage();
4634 bool is_static = var_decl->isFileVarDecl();
4594 bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl);
4595 bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl);
46354596 bool is_const = ZigClangQualType_isConstQualified(qt);
46364597
46374598 if (is_static && !is_extern) {
46384599 AstNode *init_node;
4639 if (var_decl->hasInit()) {
4640 const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue());
4600 if (ZigClangVarDecl_hasInit(var_decl)) {
4601 const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl);
46414602 if (ap_value == nullptr) {
4642 emit_warning(c, bitcast(var_decl->getLocation()),
4603 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
46434604 "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name));
46444605 return;
46454606 }
4646 init_node = trans_ap_value(c, ap_value, qt, bitcast(var_decl->getLocation()));
4607 init_node = trans_ap_value(c, ap_value, qt, ZigClangVarDecl_getLocation(var_decl));
46474608 if (init_node == nullptr)
46484609 return;
46494610 } else {
......@@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) {
46624623 return;
46634624 }
46644625
4665 emit_warning(c, bitcast(var_decl->getLocation()),
4626 emit_warning(c, ZigClangVarDecl_getLocation(var_decl),
46664627 "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name));
46674628 return;
46684629}
......@@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) {
46844645 resolve_record_decl(c, reinterpret_cast<const ZigClangRecordDecl *>(decl));
46854646 break;
46864647 case ZigClangDeclVar:
4687 visit_var_decl(c, reinterpret_cast<const clang::VarDecl *>(decl));
4648 visit_var_decl(c, reinterpret_cast<const ZigClangVarDecl *>(decl));
46884649 break;
46894650 default:
46904651 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
51145075 c->macro_table.put(name, result_node);
51155076}
51165077
5117static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) {
5118 clang::ASTUnit *unit = reinterpret_cast<clang::ASTUnit *>(zunit);
5078static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) {
51195079 CTokenize ctok = {{0}};
51205080
51215081 // TODO if we see #undef, delete it from the table
5082 for (ZigClangPreprocessingRecord_iterator it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit),
5083 it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit); it.I != it_end.I; it.I += 1)
5084 {
5085 ZigClangPreprocessedEntity *entity = ZigClangPreprocessingRecord_iterator_deref(it);
51225086
5123 for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) {
5124 switch (entity->getKind()) {
5125 case clang::PreprocessedEntity::InvalidKind:
5126 case clang::PreprocessedEntity::InclusionDirectiveKind:
5127 case clang::PreprocessedEntity::MacroExpansionKind:
5087 switch (ZigClangPreprocessedEntity_getKind(entity)) {
5088 case ZigClangPreprocessedEntity_InvalidKind:
5089 case ZigClangPreprocessedEntity_InclusionDirectiveKind:
5090 case ZigClangPreprocessedEntity_MacroExpansionKind:
51285091 continue;
5129 case clang::PreprocessedEntity::MacroDefinitionKind:
5092 case ZigClangPreprocessedEntity_MacroDefinitionKind:
51305093 {
5131 clang::MacroDefinitionRecord *macro = static_cast<clang::MacroDefinitionRecord *>(entity);
5132 const char *raw_name = macro->getName()->getNameStart();
5133 clang::SourceRange range = macro->getSourceRange();
5134 ZigClangSourceLocation begin_loc = bitcast(range.getBegin());
5135 ZigClangSourceLocation end_loc = bitcast(range.getEnd());
5094 ZigClangMacroDefinitionRecord *macro = reinterpret_cast<ZigClangMacroDefinitionRecord *>(entity);
5095 const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro);
5096 ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);
5097 ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro);
51365098
51375099 if (ZigClangSourceLocation_eq(begin_loc, end_loc)) {
51385100 // this means it is a macro without a value
src/zig_clang.cpp+263
......@@ -1346,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum,
13461346static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, "");
13471347static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, "");
13481348
1349void ZigClang_detect_enum_EntityKind(clang::PreprocessedEntity::EntityKind x) {
1350 switch (x) {
1351 case clang::PreprocessedEntity::InvalidKind:
1352 case clang::PreprocessedEntity::MacroExpansionKind:
1353 case clang::PreprocessedEntity::MacroDefinitionKind:
1354 case clang::PreprocessedEntity::InclusionDirectiveKind:
1355 break;
1356 }
1357}
1358static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, "");
1359static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, "");
1360static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, "");
1361static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, "");
1362
1363
1364void ZigClang_detect_enum_ConstExprUsage(clang::Expr::ConstExprUsage x) {
1365 switch (x) {
1366 case clang::Expr::EvaluateForCodeGen:
1367 case clang::Expr::EvaluateForMangling:
1368 break;
1369 }
1370}
1371static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, "");
1372static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, "");
1373
13491374
13501375static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
13511376
......@@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_
14061431 return dest;
14071432}
14081433
1434static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), "");
1435static ZigClangPreprocessingRecord_iterator bitcast(clang::PreprocessingRecord::iterator src) {
1436 ZigClangPreprocessingRecord_iterator dest;
1437 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator));
1438 return dest;
1439}
1440static clang::PreprocessingRecord::iterator bitcast(ZigClangPreprocessingRecord_iterator src) {
1441 clang::PreprocessingRecord::iterator dest;
1442 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangPreprocessingRecord_iterator));
1443 return dest;
1444}
1445
1446static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), "");
1447static ZigClangRecordDecl_field_iterator bitcast(clang::RecordDecl::field_iterator src) {
1448 ZigClangRecordDecl_field_iterator dest;
1449 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator));
1450 return dest;
1451}
1452static clang::RecordDecl::field_iterator bitcast(ZigClangRecordDecl_field_iterator src) {
1453 clang::RecordDecl::field_iterator dest;
1454 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangRecordDecl_field_iterator));
1455 return dest;
1456}
1457
1458static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), "");
1459static ZigClangEnumDecl_enumerator_iterator bitcast(clang::EnumDecl::enumerator_iterator src) {
1460 ZigClangEnumDecl_enumerator_iterator dest;
1461 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator));
1462 return dest;
1463}
1464static clang::EnumDecl::enumerator_iterator bitcast(ZigClangEnumDecl_enumerator_iterator src) {
1465 clang::EnumDecl::enumerator_iterator dest;
1466 memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangEnumDecl_enumerator_iterator));
1467 return dest;
1468}
1469
1470
14091471ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self,
14101472 ZigClangSourceLocation Loc)
14111473{
......@@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex
14621524 reinterpret_cast<bool (*)(void *, const clang::Decl *)>(Fn));
14631525}
14641526
1527struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(
1528 struct ZigClangASTUnit *self)
1529{
1530 auto casted = reinterpret_cast<const clang::ASTUnit *>(self);
1531 return bitcast(casted->getLocalPreprocessingEntities().begin());
1532}
1533
1534struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(
1535 struct ZigClangASTUnit *self)
1536{
1537 auto casted = reinterpret_cast<const clang::ASTUnit *>(self);
1538 return bitcast(casted->getLocalPreprocessingEntities().end());
1539}
1540
1541struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref(
1542 struct ZigClangPreprocessingRecord_iterator self)
1543{
1544 clang::PreprocessingRecord::iterator casted = bitcast(self);
1545 clang::PreprocessedEntity *result = *casted;
1546 return reinterpret_cast<ZigClangPreprocessedEntity *>(result);
1547}
1548
14651549const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) {
14661550 const clang::RecordDecl *record_decl = reinterpret_cast<const clang::RecordType *>(record_ty)->getDecl();
14671551 return reinterpret_cast<const ZigClangRecordDecl *>(record_decl);
......@@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) {
16741758 return casted->getTypeClassName();
16751759}
16761760
1761const ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const ZigClangType *self) {
1762 auto casted = reinterpret_cast<const clang::Type *>(self);
1763 const clang::ArrayType *result = casted->getAsArrayTypeUnsafe();
1764 return reinterpret_cast<const ZigClangArrayType *>(result);
1765}
1766
16771767ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) {
16781768 auto casted = reinterpret_cast<const clang::Stmt *>(self);
16791769 return bitcast(casted->getBeginLoc());
......@@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res
17121802 return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context);
17131803}
17141804
1805bool ZigClangExpr_EvaluateAsFloat(const ZigClangExpr *self, ZigClangAPFloat **result,
1806 const struct ZigClangASTContext *ctx)
1807{
1808 llvm::APFloat *ap_float = new llvm::APFloat(0.0f);
1809 *result = reinterpret_cast<ZigClangAPFloat *>(ap_float);
1810 auto casted = reinterpret_cast<const clang::Expr *>(self);
1811 auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx);
1812 return casted->EvaluateAsFloat(*ap_float, *casted_ctx);
1813}
1814
1815bool ZigClangExpr_EvaluateAsConstantExpr(const ZigClangExpr *self, ZigClangExprEvalResult *result,
1816 ZigClangExpr_ConstExprUsage usage, const struct ZigClangASTContext *ctx)
1817{
1818 auto casted_self = reinterpret_cast<const clang::Expr *>(self);
1819 auto casted_ctx = reinterpret_cast<const clang::ASTContext *>(ctx);
1820 clang::Expr::EvalResult eval_result;
1821 if (!casted_self->EvaluateAsConstantExpr(eval_result, (clang::Expr::ConstExprUsage)usage, *casted_ctx)) {
1822 return false;
1823 }
1824 *result = bitcast(eval_result);
1825 return true;
1826}
1827
17151828ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) {
17161829 auto casted = reinterpret_cast<const clang::APValue *>(self);
17171830 return (ZigClangAPValueKind)casted->getKind();
......@@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se
19112024 return bitcast(casted->getType());
19122025}
19132026
2027struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *self) {
2028 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2029 return bitcast(casted->getTypeSourceInfo()->getType());
2030}
2031
19142032const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) {
19152033 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
19162034 return reinterpret_cast<const ZigClangExpr *>(casted->getInit());
......@@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s
19212039 return (ZigClangVarDecl_TLSKind)casted->getTLSKind();
19222040}
19232041
2042struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) {
2043 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2044 return bitcast(casted->getLocation());
2045}
2046
2047bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) {
2048 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2049 return casted->hasExternalStorage();
2050}
2051
2052bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) {
2053 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2054 return casted->isFileVarDecl();
2055}
2056
2057bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) {
2058 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2059 return casted->hasInit();
2060}
2061
2062const ZigClangAPValue * ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *self) {
2063 auto casted = reinterpret_cast<const clang::VarDecl *>(self);
2064 const clang::APValue *result = casted->evaluateValue();
2065 return reinterpret_cast<const ZigClangAPValue *>(result);
2066}
2067
19242068enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) {
19252069 auto casted = reinterpret_cast<const clang::BuiltinType *>(self);
19262070 return (ZigClangBuiltinTypeKind)casted->getKind();
......@@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar
23962540 auto casted = reinterpret_cast<const clang::ParenExpr *>(self);
23972541 return reinterpret_cast<const struct ZigClangExpr *>(casted->getSubExpr());
23982542}
2543
2544enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(
2545 const struct ZigClangPreprocessedEntity *self)
2546{
2547 auto casted = reinterpret_cast<const clang::PreprocessedEntity *>(self);
2548 return (ZigClangPreprocessedEntity_EntityKind)casted->getKind();
2549}
2550
2551const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) {
2552 auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
2553 return casted->getName()->getNameStart();
2554}
2555
2556struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *self) {
2557 auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
2558 return bitcast(casted->getSourceRange().getBegin());
2559}
2560
2561struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *self) {
2562 auto casted = reinterpret_cast<const clang::MacroDefinitionRecord *>(self);
2563 return bitcast(casted->getSourceRange().getEnd());
2564}
2565
2566ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *self) {
2567 auto casted = reinterpret_cast<const clang::RecordDecl *>(self);
2568 return bitcast(casted->field_begin());
2569}
2570
2571ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *self) {
2572 auto casted = reinterpret_cast<const clang::RecordDecl *>(self);
2573 return bitcast(casted->field_end());
2574}
2575
2576bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) {
2577 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2578 return casted->isBitField();
2579}
2580
2581ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) {
2582 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2583 return bitcast(casted->getLocation());
2584}
2585
2586ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) {
2587 auto casted = reinterpret_cast<const clang::FieldDecl *>(self);
2588 return bitcast(casted->getType());
2589}
2590
2591ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(
2592 struct ZigClangRecordDecl_field_iterator self)
2593{
2594 clang::RecordDecl::field_iterator casted = bitcast(self);
2595 ++casted;
2596 return bitcast(casted);
2597}
2598
2599const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(
2600 struct ZigClangRecordDecl_field_iterator self)
2601{
2602 clang::RecordDecl::field_iterator casted = bitcast(self);
2603 const clang::FieldDecl *result = *casted;
2604 return reinterpret_cast<const ZigClangFieldDecl *>(result);
2605}
2606
2607bool ZigClangRecordDecl_field_iterator_neq(
2608 struct ZigClangRecordDecl_field_iterator a,
2609 struct ZigClangRecordDecl_field_iterator b)
2610{
2611 clang::RecordDecl::field_iterator casted_a = bitcast(a);
2612 clang::RecordDecl::field_iterator casted_b = bitcast(b);
2613 return casted_a != casted_b;
2614}
2615
2616ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *self) {
2617 auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
2618 return bitcast(casted->enumerator_begin());
2619}
2620
2621ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *self) {
2622 auto casted = reinterpret_cast<const clang::EnumDecl *>(self);
2623 return bitcast(casted->enumerator_end());
2624}
2625
2626ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(
2627 struct ZigClangEnumDecl_enumerator_iterator self)
2628{
2629 clang::EnumDecl::enumerator_iterator casted = bitcast(self);
2630 ++casted;
2631 return bitcast(casted);
2632}
2633
2634const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(
2635 struct ZigClangEnumDecl_enumerator_iterator self)
2636{
2637 clang::EnumDecl::enumerator_iterator casted = bitcast(self);
2638 const clang::EnumConstantDecl *result = *casted;
2639 return reinterpret_cast<const ZigClangEnumConstantDecl *>(result);
2640}
2641
2642bool ZigClangEnumDecl_enumerator_iterator_neq(
2643 struct ZigClangEnumDecl_enumerator_iterator a,
2644 struct ZigClangEnumDecl_enumerator_iterator b)
2645{
2646 clang::EnumDecl::enumerator_iterator casted_a = bitcast(a);
2647 clang::EnumDecl::enumerator_iterator casted_b = bitcast(b);
2648 return casted_a != casted_b;
2649}
2650
2651const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *self) {
2652 auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self);
2653 const clang::Expr *result = casted->getInitExpr();
2654 return reinterpret_cast<const ZigClangExpr *>(result);
2655}
2656
2657const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *self) {
2658 auto casted = reinterpret_cast<const clang::EnumConstantDecl *>(self);
2659 const llvm::APSInt *result = &casted->getInitVal();
2660 return reinterpret_cast<const ZigClangAPSInt *>(result);
2661}
src/zig_clang.h+69
......@@ -122,6 +122,7 @@ struct ZigClangParmVarDecl;
122122struct ZigClangPointerType;
123123struct ZigClangPredefinedExpr;
124124struct ZigClangPreprocessedEntity;
125struct ZigClangPreprocessingRecord;
125126struct ZigClangRecordDecl;
126127struct ZigClangRecordType;
127128struct ZigClangReturnStmt;
......@@ -146,6 +147,19 @@ struct ZigClangWhileStmt;
146147typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator;
147148typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator;
148149
150struct ZigClangRecordDecl_field_iterator {
151 void *opaque;
152};
153
154struct ZigClangEnumDecl_enumerator_iterator {
155 void *opaque;
156};
157
158struct ZigClangPreprocessingRecord_iterator {
159 int I;
160 struct ZigClangPreprocessingRecord *Self;
161};
162
149163enum ZigClangBO {
150164 ZigClangBO_PtrMemD,
151165 ZigClangBO_PtrMemI,
......@@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword {
790804 ZigClangETK_None,
791805};
792806
807enum ZigClangPreprocessedEntity_EntityKind {
808 ZigClangPreprocessedEntity_InvalidKind,
809 ZigClangPreprocessedEntity_MacroExpansionKind,
810 ZigClangPreprocessedEntity_MacroDefinitionKind,
811 ZigClangPreprocessedEntity_InclusionDirectiveKind,
812};
813
814enum ZigClangExpr_ConstExprUsage {
815 ZigClangExpr_EvaluateForCodeGen,
816 ZigClangExpr_EvaluateForMangling,
817};
818
793819ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *,
794820 struct ZigClangSourceLocation Loc);
795821ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *,
......@@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig
814840ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *);
815841ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,
816842 bool (*Fn)(void *context, const struct ZigClangDecl *decl));
843ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *);
844ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *);
845
846ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref(
847 struct ZigClangPreprocessingRecord_iterator);
848
849ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *);
817850
818851ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty);
819852ZIG_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
840873ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl);
841874ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl);
842875ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl);
876ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *);
877ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *);
878ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator);
879ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator);
880ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq(
881 struct ZigClangRecordDecl_field_iterator a,
882 struct ZigClangRecordDecl_field_iterator b);
843883
844884ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *);
885ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *);
886ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *);
887ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator);
888ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator);
889ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq(
890 struct ZigClangEnumDecl_enumerator_iterator a,
891 struct ZigClangEnumDecl_enumerator_iterator b);
845892
846893ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl);
847894ZIG_EXTERN_C enum ZigClangDeclKind ZigClangDecl_getKind(const struct ZigClangDecl *decl);
......@@ -850,6 +897,12 @@ ZIG_EXTERN_C const char *ZigClangDecl_getDeclKindName(const struct ZigClangDecl
850897ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *);
851898ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl);
852899ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl);
900ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *);
901ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *);
902ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *);
903ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *);
904ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *);
905ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *);
853906
854907ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b);
855908
......@@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl
869922ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self);
870923ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self);
871924ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self);
925ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self);
872926
873927ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self);
874928ZIG_EXTERN_C enum ZigClangStmtClass ZigClangStmt_getStmtClass(const struct ZigClangStmt *self);
......@@ -879,6 +933,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangExpr_getType(const struct ZigClangE
879933ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self);
880934ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self,
881935 bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context);
936ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self,
937 ZigClangAPFloat **result, const struct ZigClangASTContext *ctx);
938ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *,
939 struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *);
882940
883941ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self);
884942ZIG_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
10311089ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *);
10321090
10331091ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *);
1092
1093ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *);
1094ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *);
1095ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *);
1096
1097ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *);
1098ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *);
1099ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *);
1100
1101ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *);
1102ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *);
10341103#endif