diff --git a/toolchain/lowering/lowering_context.cpp b/toolchain/lowering/lowering_context.cpp index ef13e3d19874..8dfbeb720173 100644 --- a/toolchain/lowering/lowering_context.cpp +++ b/toolchain/lowering/lowering_context.cpp @@ -5,6 +5,8 @@ #include "toolchain/lowering/lowering_context.h" #include "common/vlog.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Sequence.h" #include "toolchain/lowering/lowering_function_context.h" #include "toolchain/semantics/semantics_ir.h" #include "toolchain/semantics/semantics_node.h" @@ -31,20 +33,20 @@ auto LoweringContext::Run() -> std::unique_ptr { // Lower types. auto types = semantics_ir_->types(); types_.resize_for_overwrite(types.size()); - for (int i = 0; i < static_cast(types.size()); ++i) { - types_[i] = BuildType(types[i]); + for (auto [i, type] : llvm::enumerate(types)) { + types_[i] = BuildType(type); } // Lower function declarations. functions_.resize_for_overwrite(semantics_ir_->functions_size()); - for (int i = 0; i < semantics_ir_->functions_size(); ++i) { + for (auto i : llvm::seq(semantics_ir_->functions_size())) { functions_[i] = BuildFunctionDeclaration(SemanticsFunctionId(i)); } // TODO: Lower global variable declarations. // Lower function definitions. - for (int i = 0; i < semantics_ir_->functions_size(); ++i) { + for (auto i : llvm::seq(semantics_ir_->functions_size())) { BuildFunctionDefinition(SemanticsFunctionId(i)); } @@ -61,8 +63,8 @@ auto LoweringContext::BuildFunctionDeclaration(SemanticsFunctionId function_id) auto param_refs = semantics_ir().GetNodeBlock(function.param_refs_id); llvm::SmallVector args; args.resize_for_overwrite(param_refs.size()); - for (int i = 0; i < static_cast(param_refs.size()); ++i) { - args[i] = GetType(semantics_ir().GetNode(param_refs[i]).type_id()); + for (auto [i, param_ref] : llvm::enumerate(param_refs)) { + args[i] = GetType(semantics_ir().GetNode(param_ref).type_id()); } // If return type is not valid, the function does not have a return type. @@ -77,8 +79,8 @@ auto LoweringContext::BuildFunctionDeclaration(SemanticsFunctionId function_id) semantics_ir().GetString(function.name_id), llvm_module()); // Set parameter names. - for (int i = 0; i < static_cast(param_refs.size()); ++i) { - auto name_id = semantics_ir().GetNode(param_refs[i]).GetAsVarStorage(); + for (auto [i, param_ref] : llvm::enumerate(param_refs)) { + auto name_id = semantics_ir().GetNode(param_ref).GetAsVarStorage(); llvm_function->getArg(i)->setName(semantics_ir().GetString(name_id)); } @@ -99,8 +101,8 @@ auto LoweringContext::BuildFunctionDefinition(SemanticsFunctionId function_id) // Add parameters to locals. auto param_refs = semantics_ir().GetNodeBlock(function.param_refs_id); - for (int i = 0; i < static_cast(param_refs.size()); ++i) { - function_lowering.SetLocal(param_refs[i], llvm_function->getArg(i)); + for (auto [i, param_ref] : llvm::enumerate(param_refs)) { + function_lowering.SetLocal(param_ref, llvm_function->getArg(i)); } // Lower all blocks. diff --git a/toolchain/lowering/lowering_handle.cpp b/toolchain/lowering/lowering_handle.cpp index 691dbe5f3173..a2fadd74d4c9 100644 --- a/toolchain/lowering/lowering_handle.cpp +++ b/toolchain/lowering/lowering_handle.cpp @@ -2,6 +2,8 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Sequence.h" #include "toolchain/lowering/lowering_function_context.h" #include "toolchain/semantics/semantics_node_kind.h" @@ -63,7 +65,7 @@ auto LoweringHandleArrayValue(LoweringFunctionContext& context, auto* tuple_type = context.GetType(context.semantics_ir().GetNode(tuple_node_id).type_id()); - for (int i = 0; i < static_cast(llvm_type->getArrayNumElements()); ++i) { + for (auto i : llvm::seq(llvm_type->getArrayNumElements())) { llvm::Value* array_element_value = context.GetIndexFromStructOrArray( tuple_type, tuple_value, i, "array.element"); if (tuple_value->getType()->isPointerTy()) { @@ -306,14 +308,9 @@ auto LoweringHandleTupleValue(LoweringFunctionContext& context, context.builder().CreateAlloca(llvm_type, /*ArraySize=*/nullptr, "tuple"); context.SetLocal(node_id, alloca); auto refs = context.semantics_ir().GetNodeBlock(node.GetAsTupleValue()); - auto type_refs = context.semantics_ir().GetTypeBlock( - context.semantics_ir() - .GetNode(context.semantics_ir().GetType(node.type_id())) - .GetAsTupleType()); - - for (int i = 0; i < static_cast(type_refs.size()); ++i) { + for (auto [i, ref] : llvm::enumerate(refs)) { auto* gep = context.builder().CreateStructGEP(llvm_type, alloca, i); - context.builder().CreateStore(context.GetLocal(refs[i]), gep); + context.builder().CreateStore(context.GetLocal(ref), gep); } } @@ -337,13 +334,13 @@ auto LoweringHandleStructValue(LoweringFunctionContext& context, context.semantics_ir() .GetNode(context.semantics_ir().GetType(node.type_id())) .GetAsStructType()); - for (int i = 0; i < static_cast(refs.size()); ++i) { + for (auto [i, ref, type_ref] : llvm::enumerate(refs, type_refs)) { auto [field_name_id, field_type_id] = - context.semantics_ir().GetNode(type_refs[i]).GetAsStructTypeField(); + context.semantics_ir().GetNode(type_ref).GetAsStructTypeField(); auto member_name = context.semantics_ir().GetString(field_name_id); auto* gep = context.builder().CreateStructGEP(llvm_type, alloca, i, member_name); - context.builder().CreateStore(context.GetLocal(refs[i]), gep); + context.builder().CreateStore(context.GetLocal(ref), gep); } } diff --git a/toolchain/parser/parse_tree.cpp b/toolchain/parser/parse_tree.cpp index 86638b2f0e93..2bc3ce589dee 100644 --- a/toolchain/parser/parse_tree.cpp +++ b/toolchain/parser/parse_tree.cpp @@ -4,9 +4,6 @@ #include "toolchain/parser/parse_tree.h" -#include -#include - #include "common/check.h" #include "common/error.h" #include "llvm/ADT/Sequence.h" @@ -244,7 +241,7 @@ auto ParseTree::Verify() const -> ErrorOr { } } } else { - for (int i = 0; i < n_impl.kind.child_count(); ++i) { + for (int i : llvm::seq(n_impl.kind.child_count())) { if (nodes.empty()) { return Error(llvm::formatv( "Node #{0} is a {1} with child_count {2}, but only had {3} " diff --git a/toolchain/parser/parser_context.cpp b/toolchain/parser/parser_context.cpp index 54bc85ded1c8..899a4b22096a 100644 --- a/toolchain/parser/parser_context.cpp +++ b/toolchain/parser/parser_context.cpp @@ -4,11 +4,10 @@ #include "toolchain/parser/parser_context.h" -#include -#include #include #include "common/check.h" +#include "llvm/ADT/STLExtras.h" #include "toolchain/lexer/token_kind.h" #include "toolchain/lexer/tokenized_buffer.h" #include "toolchain/parser/parse_node_kind.h" @@ -448,8 +447,7 @@ auto ParserContext::EmitExpectedDeclarationSemiOrDefinition( auto ParserContext::PrintForStackDump(llvm::raw_ostream& output) const -> void { output << "Parser stack:\n"; - for (int i = 0; i < static_cast(state_stack_.size()); ++i) { - const auto& entry = state_stack_[i]; + for (auto [i, entry] : llvm::enumerate(state_stack_)) { output << "\t" << i << ".\t" << entry.state; PrintTokenForStackDump(output, entry.token); } diff --git a/toolchain/semantics/semantics_context.cpp b/toolchain/semantics/semantics_context.cpp index 8b5a134ae137..58553524e8c0 100644 --- a/toolchain/semantics/semantics_context.cpp +++ b/toolchain/semantics/semantics_context.cpp @@ -8,6 +8,7 @@ #include "common/check.h" #include "common/vlog.h" +#include "llvm/ADT/STLExtras.h" #include "toolchain/diagnostics/diagnostic_kind.h" #include "toolchain/lexer/tokenized_buffer.h" #include "toolchain/parser/parse_node_kind.h" @@ -298,9 +299,8 @@ auto SemanticsContext::ImplicitAsForArgs( // Check type conversions per-element. // TODO: arg_ir_id is passed so that implicit conversions can be inserted. // It's currently not supported, but will be needed. - for (size_t i = 0; i < arg_refs.size(); ++i) { - auto value_id = arg_refs[i]; - auto as_type_id = semantics_ir_->GetNode(param_refs[i]).type_id(); + for (auto [i, value_id, param_ref] : llvm::enumerate(arg_refs, param_refs)) { + auto as_type_id = semantics_ir_->GetNode(param_ref).type_id(); if (ImplicitAsImpl(value_id, as_type_id, diagnostic == nullptr ? &value_id : nullptr) == ImplicitAsKind::Incompatible) { diff --git a/toolchain/semantics/semantics_handle_name.cpp b/toolchain/semantics/semantics_handle_name.cpp index 3f0ea604003f..7c2f62792fc0 100644 --- a/toolchain/semantics/semantics_handle_name.cpp +++ b/toolchain/semantics/semantics_handle_name.cpp @@ -2,6 +2,7 @@ // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +#include "llvm/ADT/STLExtras.h" #include "toolchain/semantics/semantics_context.h" #include "toolchain/semantics/semantics_node.h" @@ -30,8 +31,8 @@ auto SemanticsHandleMemberAccessExpression(SemanticsContext& context, auto refs = context.semantics_ir().GetNodeBlock(base_type.GetAsStructType()); // TODO: Do we need to optimize this with a lookup table for O(1)? - for (int i = 0; i < static_cast(refs.size()); ++i) { - auto ref = context.semantics_ir().GetNode(refs[i]); + for (auto [i, ref_id] : llvm::enumerate(refs)) { + auto ref = context.semantics_ir().GetNode(ref_id); if (auto [field_name_id, field_type_id] = ref.GetAsStructTypeField(); name_id == field_name_id) { context.AddNodeAndPush( diff --git a/toolchain/semantics/semantics_ir.cpp b/toolchain/semantics/semantics_ir.cpp index b09afd57a644..7af85a605af9 100644 --- a/toolchain/semantics/semantics_ir.cpp +++ b/toolchain/semantics/semantics_ir.cpp @@ -5,9 +5,8 @@ #include "toolchain/semantics/semantics_ir.h" #include "common/check.h" -#include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/Sequence.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Support/SaveAndRestore.h" #include "toolchain/base/pretty_stack_trace_function.h" #include "toolchain/parser/parse_tree_node_location_translator.h" #include "toolchain/semantics/semantics_builtin_kind.h" @@ -52,7 +51,7 @@ auto SemanticsIR::MakeFromParseTree(const SemanticsIR& builtin_ir, // Copy builtins over. semantics_ir.nodes_.resize_for_overwrite(SemanticsBuiltinKind::ValidCount); static constexpr auto BuiltinIR = SemanticsCrossReferenceIRId(0); - for (int i = 0; i < SemanticsBuiltinKind::ValidCount; ++i) { + for (int i : llvm::seq(SemanticsBuiltinKind::ValidCount)) { // We can reuse the type node ID because the offsets of cross-references // will be the same in this IR. auto type = builtin_ir.nodes_[i].type_id(); diff --git a/toolchain/semantics/semantics_ir_formatter.cpp b/toolchain/semantics/semantics_ir_formatter.cpp index 89bb25038f6d..45aa59e98df6 100644 --- a/toolchain/semantics/semantics_ir_formatter.cpp +++ b/toolchain/semantics/semantics_ir_formatter.cpp @@ -4,8 +4,8 @@ #include "toolchain/semantics/semantics_ir_formatter.h" +#include "llvm/ADT/Sequence.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/ADT/StringSet.h" #include "llvm/Support/SaveAndRestore.h" #include "toolchain/lexer/tokenized_buffer.h" #include "toolchain/parser/parse_tree.h" @@ -45,7 +45,7 @@ class NodeNamer { CollectNamesInBlock(ScopeIndex::Package, semantics_ir.top_node_block_id()); // Build each function scope. - for (int i = 0; i != semantics_ir.functions_size(); ++i) { + for (int i : llvm::seq(semantics_ir.functions_size())) { auto fn_id = SemanticsFunctionId(i); auto fn_scope = GetScopeFor(fn_id); const auto& fn = semantics_ir.GetFunction(fn_id); @@ -405,7 +405,7 @@ class SemanticsIRFormatter { } out_ << "}\n"; - for (int i = 0; i != semantics_ir_.functions_size(); ++i) { + for (int i : llvm::seq(semantics_ir_.functions_size())) { FormatFunction(SemanticsFunctionId(i)); } } diff --git a/toolchain/semantics/semantics_node_block_stack.cpp b/toolchain/semantics/semantics_node_block_stack.cpp index 7a8e75dfbee6..361d491aa941 100644 --- a/toolchain/semantics/semantics_node_block_stack.cpp +++ b/toolchain/semantics/semantics_node_block_stack.cpp @@ -5,6 +5,7 @@ #include "toolchain/semantics/semantics_node_block_stack.h" #include "common/vlog.h" +#include "llvm/ADT/STLExtras.h" #include "toolchain/semantics/semantics_node.h" namespace Carbon { @@ -40,8 +41,8 @@ auto SemanticsNodeBlockStack::Pop() -> SemanticsNodeBlockId { auto SemanticsNodeBlockStack::PrintForStackDump(llvm::raw_ostream& output) const -> void { output << name_ << ":\n"; - for (int i = 0; i < static_cast(stack_.size()); ++i) { - output << "\t" << i << ".\t" << stack_[i] << "\n"; + for (auto [i, entry] : llvm::enumerate(stack_)) { + output << "\t" << i << ".\t" << entry << "\n"; } } diff --git a/toolchain/semantics/semantics_node_stack.cpp b/toolchain/semantics/semantics_node_stack.cpp index f2fbf7b1dd07..72b315df5200 100644 --- a/toolchain/semantics/semantics_node_stack.cpp +++ b/toolchain/semantics/semantics_node_stack.cpp @@ -4,6 +4,7 @@ #include "toolchain/semantics/semantics_node_stack.h" +#include "llvm/ADT/STLExtras.h" #include "toolchain/semantics/semantics_node.h" namespace Carbon { @@ -11,8 +12,7 @@ namespace Carbon { auto SemanticsNodeStack::PrintForStackDump(llvm::raw_ostream& output) const -> void { output << "SemanticsNodeStack:\n"; - for (int i = 0; i < static_cast(stack_.size()); ++i) { - const auto& entry = stack_[i]; + for (auto [i, entry] : llvm::enumerate(stack_)) { auto parse_node_kind = parse_tree_->node_kind(entry.parse_node); output << "\t" << i << ".\t" << parse_node_kind; if (parse_node_kind == ParseNodeKind::PatternBinding) {