123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===--- Designator.h - Initialization Designator ---------------*- C++ -*-===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines interfaces used to represent designators (a la
- // C99 designated initializers) during parsing.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_SEMA_DESIGNATOR_H
- #define LLVM_CLANG_SEMA_DESIGNATOR_H
- #include "clang/Basic/SourceLocation.h"
- #include "llvm/ADT/SmallVector.h"
- namespace clang {
- class Expr;
- class IdentifierInfo;
- class Sema;
- /// Designator - A designator in a C99 designated initializer.
- ///
- /// This class is a discriminated union which holds the various
- /// different sorts of designators possible. A Designation is an array of
- /// these. An example of a designator are things like this:
- /// [8] .field [47] // C99 designation: 3 designators
- /// [8 ... 47] field: // GNU extensions: 2 designators
- /// These occur in initializers, e.g.:
- /// int a[10] = {2, 4, [8]=9, 10};
- ///
- class Designator {
- public:
- enum DesignatorKind {
- FieldDesignator, ArrayDesignator, ArrayRangeDesignator
- };
- private:
- Designator() {};
- DesignatorKind Kind;
- struct FieldDesignatorInfo {
- const IdentifierInfo *II;
- SourceLocation DotLoc;
- SourceLocation NameLoc;
- };
- struct ArrayDesignatorInfo {
- Expr *Index;
- SourceLocation LBracketLoc;
- mutable SourceLocation RBracketLoc;
- };
- struct ArrayRangeDesignatorInfo {
- Expr *Start, *End;
- SourceLocation LBracketLoc, EllipsisLoc;
- mutable SourceLocation RBracketLoc;
- };
- union {
- FieldDesignatorInfo FieldInfo;
- ArrayDesignatorInfo ArrayInfo;
- ArrayRangeDesignatorInfo ArrayRangeInfo;
- };
- public:
- DesignatorKind getKind() const { return Kind; }
- bool isFieldDesignator() const { return Kind == FieldDesignator; }
- bool isArrayDesignator() const { return Kind == ArrayDesignator; }
- bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
- const IdentifierInfo *getField() const {
- assert(isFieldDesignator() && "Invalid accessor");
- return FieldInfo.II;
- }
- SourceLocation getDotLoc() const {
- assert(isFieldDesignator() && "Invalid accessor");
- return FieldInfo.DotLoc;
- }
- SourceLocation getFieldLoc() const {
- assert(isFieldDesignator() && "Invalid accessor");
- return FieldInfo.NameLoc;
- }
- Expr *getArrayIndex() const {
- assert(isArrayDesignator() && "Invalid accessor");
- return ArrayInfo.Index;
- }
- Expr *getArrayRangeStart() const {
- assert(isArrayRangeDesignator() && "Invalid accessor");
- return ArrayRangeInfo.Start;
- }
- Expr *getArrayRangeEnd() const {
- assert(isArrayRangeDesignator() && "Invalid accessor");
- return ArrayRangeInfo.End;
- }
- SourceLocation getLBracketLoc() const {
- assert((isArrayDesignator() || isArrayRangeDesignator()) &&
- "Invalid accessor");
- if (isArrayDesignator())
- return ArrayInfo.LBracketLoc;
- else
- return ArrayRangeInfo.LBracketLoc;
- }
- SourceLocation getRBracketLoc() const {
- assert((isArrayDesignator() || isArrayRangeDesignator()) &&
- "Invalid accessor");
- if (isArrayDesignator())
- return ArrayInfo.RBracketLoc;
- else
- return ArrayRangeInfo.RBracketLoc;
- }
- SourceLocation getEllipsisLoc() const {
- assert(isArrayRangeDesignator() && "Invalid accessor");
- return ArrayRangeInfo.EllipsisLoc;
- }
- static Designator getField(const IdentifierInfo *II, SourceLocation DotLoc,
- SourceLocation NameLoc) {
- Designator D;
- D.Kind = FieldDesignator;
- new (&D.FieldInfo) FieldDesignatorInfo;
- D.FieldInfo.II = II;
- D.FieldInfo.DotLoc = DotLoc;
- D.FieldInfo.NameLoc = NameLoc;
- return D;
- }
- static Designator getArray(Expr *Index,
- SourceLocation LBracketLoc) {
- Designator D;
- D.Kind = ArrayDesignator;
- new (&D.ArrayInfo) ArrayDesignatorInfo;
- D.ArrayInfo.Index = Index;
- D.ArrayInfo.LBracketLoc = LBracketLoc;
- D.ArrayInfo.RBracketLoc = SourceLocation();
- return D;
- }
- static Designator getArrayRange(Expr *Start,
- Expr *End,
- SourceLocation LBracketLoc,
- SourceLocation EllipsisLoc) {
- Designator D;
- D.Kind = ArrayRangeDesignator;
- new (&D.ArrayRangeInfo) ArrayRangeDesignatorInfo;
- D.ArrayRangeInfo.Start = Start;
- D.ArrayRangeInfo.End = End;
- D.ArrayRangeInfo.LBracketLoc = LBracketLoc;
- D.ArrayRangeInfo.EllipsisLoc = EllipsisLoc;
- D.ArrayRangeInfo.RBracketLoc = SourceLocation();
- return D;
- }
- void setRBracketLoc(SourceLocation RBracketLoc) const {
- assert((isArrayDesignator() || isArrayRangeDesignator()) &&
- "Invalid accessor");
- if (isArrayDesignator())
- ArrayInfo.RBracketLoc = RBracketLoc;
- else
- ArrayRangeInfo.RBracketLoc = RBracketLoc;
- }
- /// ClearExprs - Null out any expression references, which prevents
- /// them from being 'delete'd later.
- void ClearExprs(Sema &Actions) {}
- /// FreeExprs - Release any unclaimed memory for the expressions in
- /// this designator.
- void FreeExprs(Sema &Actions) {}
- };
- /// Designation - Represent a full designation, which is a sequence of
- /// designators. This class is mostly a helper for InitListDesignations.
- class Designation {
- /// Designators - The actual designators for this initializer.
- SmallVector<Designator, 2> Designators;
- public:
- /// AddDesignator - Add a designator to the end of this list.
- void AddDesignator(Designator D) {
- Designators.push_back(D);
- }
- bool empty() const { return Designators.empty(); }
- unsigned getNumDesignators() const { return Designators.size(); }
- const Designator &getDesignator(unsigned Idx) const {
- assert(Idx < Designators.size());
- return Designators[Idx];
- }
- /// ClearExprs - Null out any expression references, which prevents them from
- /// being 'delete'd later.
- void ClearExprs(Sema &Actions) {}
- /// FreeExprs - Release any unclaimed memory for the expressions in this
- /// designation.
- void FreeExprs(Sema &Actions) {}
- };
- } // end namespace clang
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|