//===--- DesignatedInitializers.cpp - clang-tidy --------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file provides utilities for designated initializers. /// //===----------------------------------------------------------------------===// #include "DesignatedInitializers.h" #include "clang/AST/DeclCXX.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/ScopeExit.h" namespace clang::tidy::utils { namespace { /// Returns true if Name is reserved, like _Foo or __Vector_base. static inline bool isReservedName(llvm::StringRef Name) { … } // Helper class to iterate over the designator names of an aggregate type. // // For an array type, yields [0], [1], [2]... // For aggregate classes, yields null for each base, then .field1, .field2, // ... class AggregateDesignatorNames { … }; // Collect designator labels describing the elements of an init list. // // This function contributes the designators of some (sub)object, which is // represented by the semantic InitListExpr Sem. // This includes any nested subobjects, but *only* if they are part of the // same original syntactic init list (due to brace elision). In other words, // it may descend into subobjects but not written init-lists. // // For example: struct Outer { Inner a,b; }; struct Inner { int x, y; } // Outer o{{1, 2}, 3}; // This function will be called with Sem = { {1, 2}, {3, ImplicitValue} } // It should generate designators '.a:' and '.b.x:'. // '.a:' is produced directly without recursing into the written sublist. // (The written sublist will have a separate collectDesignators() call later). // Recursion with Prefix='.b' and Sem = {3, ImplicitValue} produces '.b.x:'. void collectDesignators(const InitListExpr *Sem, llvm::DenseMap<SourceLocation, std::string> &Out, const llvm::DenseSet<SourceLocation> &NestedBraces, std::string &Prefix) { … } } // namespace llvm::DenseMap<SourceLocation, std::string> getUnwrittenDesignators(const InitListExpr *Syn) { … } } // namespace clang::tidy::utils