Designator.h revision 19510856727e0e14a3696b2a72c35163bff2a71f
1eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//===--- Designator.h - Initialization Designator ---------------*- C++ -*-===//
2eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
3eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//                     The LLVM Compiler Infrastructure
4eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
5eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner// This file is distributed under the University of Illinois Open Source
6eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner// License. See LICENSE.TXT for details.
7eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
8eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//===----------------------------------------------------------------------===//
9eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
10eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner// This file defines interfaces used to represent Designators in the parser and
11eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner// is the input to Actions module.
12eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
13eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//===----------------------------------------------------------------------===//
14eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1519510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#ifndef LLVM_CLANG_SEMA_DESIGNATOR_H
1619510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#define LLVM_CLANG_SEMA_DESIGNATOR_H
17eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1819510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/Action.h"
19eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
20eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnernamespace clang {
211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// Designator - This class is a discriminated union which holds the various
23eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// different sorts of designators possible.  A Designation is an array of
24eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// these.  An example of a designator are things like this:
25eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///     [8] .field [47]        // C99 designation: 3 designators
26eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///     [8 ... 47]  field:     // GNU extensions: 2 designators
27eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// These occur in initializers, e.g.:
28eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///  int a[10] = {2, 4, [8]=9, 10};
29eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///
30eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerclass Designator {
31eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
32eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  enum DesignatorKind {
33eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    FieldDesignator, ArrayDesignator, ArrayRangeDesignator
34eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
35eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerprivate:
36eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  DesignatorKind Kind;
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct FieldDesignatorInfo {
39eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    const IdentifierInfo *II;
4005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned DotLoc;
4105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned NameLoc;
42eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
43eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct ArrayDesignatorInfo {
448f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner    ActionBase::ExprTy *Index;
4505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned LBracketLoc;
4605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    mutable unsigned  RBracketLoc;
47eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
48eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct ArrayRangeDesignatorInfo {
498f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner    ActionBase::ExprTy *Start, *End;
5005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned LBracketLoc, EllipsisLoc;
5105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    mutable unsigned RBracketLoc;
52eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  union {
55eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    FieldDesignatorInfo FieldInfo;
56eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    ArrayDesignatorInfo ArrayInfo;
57eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    ArrayRangeDesignatorInfo ArrayRangeInfo;
58eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  DesignatorKind getKind() const { return Kind; }
63eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isFieldDesignator() const { return Kind == FieldDesignator; }
64eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isArrayDesignator() const { return Kind == ArrayDesignator; }
65eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
66eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
67eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  const IdentifierInfo *getField() const {
68eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isFieldDesignator() && "Invalid accessor");
69eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return FieldInfo.II;
70eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
7105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
7205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getDotLoc() const {
7305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isFieldDesignator() && "Invalid accessor");
7405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(FieldInfo.DotLoc);
7505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
7605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
7705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getFieldLoc() const {
7805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isFieldDesignator() && "Invalid accessor");
7905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(FieldInfo.NameLoc);
8005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
828f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner  ActionBase::ExprTy *getArrayIndex() const {
83eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayDesignator() && "Invalid accessor");
84eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayInfo.Index;
85eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
86eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
878f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner  ActionBase::ExprTy *getArrayRangeStart() const {
88eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayRangeDesignator() && "Invalid accessor");
89eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayRangeInfo.Start;
90eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
918f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner  ActionBase::ExprTy *getArrayRangeEnd() const {
92eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayRangeDesignator() && "Invalid accessor");
93eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayRangeInfo.End;
94eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getLBracketLoc() const {
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
9805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
9905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
10005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayInfo.LBracketLoc);
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else
10205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayRangeInfo.LBracketLoc);
10305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
10405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
10505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getRBracketLoc() const {
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
10705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
10805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
10905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayInfo.RBracketLoc);
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else
11105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayRangeInfo.RBracketLoc);
11205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
11305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
11405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getEllipsisLoc() const {
11505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isArrayRangeDesignator() && "Invalid accessor");
11605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(ArrayRangeInfo.EllipsisLoc);
11705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
11805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
11905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  static Designator getField(const IdentifierInfo *II, SourceLocation DotLoc,
12005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                             SourceLocation NameLoc) {
121eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
122eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = FieldDesignator;
123eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.FieldInfo.II = II;
12405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.FieldInfo.DotLoc = DotLoc.getRawEncoding();
12505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.FieldInfo.NameLoc = NameLoc.getRawEncoding();
126eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
127eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
128eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1298f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner  static Designator getArray(ActionBase::ExprTy *Index,
1308f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner                             SourceLocation LBracketLoc) {
131eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
132eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = ArrayDesignator;
133eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayInfo.Index = Index;
13405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayInfo.LBracketLoc = LBracketLoc.getRawEncoding();
13505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayInfo.RBracketLoc = 0;
136eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
137eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1398f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner  static Designator getArrayRange(ActionBase::ExprTy *Start,
1408f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner                                  ActionBase::ExprTy *End,
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  SourceLocation LBracketLoc,
14205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                                  SourceLocation EllipsisLoc) {
143eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
144eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = ArrayRangeDesignator;
145eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayRangeInfo.Start = Start;
146eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayRangeInfo.End = End;
14705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.LBracketLoc = LBracketLoc.getRawEncoding();
14805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.EllipsisLoc = EllipsisLoc.getRawEncoding();
14905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.RBracketLoc = 0;
150eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
151eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
15205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
15305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  void setRBracketLoc(SourceLocation RBracketLoc) const {
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
15505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
15605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
15705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayInfo.RBracketLoc = RBracketLoc.getRawEncoding();
15805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    else
15905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayRangeInfo.RBracketLoc = RBracketLoc.getRawEncoding();
16005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
162eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// ClearExprs - Null out any expression references, which prevents them from
163eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// being 'delete'd later.
164eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void ClearExprs(Action &Actions) {
165eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    switch (Kind) {
166eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case FieldDesignator: return;
167eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case ArrayDesignator:
168eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      ArrayInfo.Index = 0;
169eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      return;
170eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case ArrayRangeDesignator:
171eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      ArrayRangeInfo.Start = 0;
172eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      ArrayRangeInfo.End = 0;
173eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      return;
174eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    }
175eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
177eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// FreeExprs - Release any unclaimed memory for the expressions in this
178eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// designator.
179eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void FreeExprs(Action &Actions) {
180eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    switch (Kind) {
181eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case FieldDesignator: return; // nothing to free.
182eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case ArrayDesignator:
183eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      Actions.DeleteExpr(getArrayIndex());
184eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      return;
185eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    case ArrayRangeDesignator:
186eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      Actions.DeleteExpr(getArrayRangeStart());
187eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      Actions.DeleteExpr(getArrayRangeEnd());
188eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      return;
189eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    }
190eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
191eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner};
192eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
194eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// Designation - Represent a full designation, which is a sequence of
195eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// designators.  This class is mostly a helper for InitListDesignations.
196eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerclass Designation {
197eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// InitIndex - The index of the initializer expression this is for.  For
198eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// example, if the initializer were "{ A, .foo=B, C }" a Designation would
199eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// exist with InitIndex=1, because element #1 has a designation.
200eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  unsigned InitIndex;
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
202eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// Designators - The actual designators for this initializer.
203eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  llvm::SmallVector<Designator, 2> Designators;
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
205eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  Designation(unsigned Idx) : InitIndex(Idx) {}
206eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
2075908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor  Designation() : InitIndex(4000) {}
2085908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor
209eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// AddDesignator - Add a designator to the end of this list.
210eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void AddDesignator(Designator D) {
211eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designators.push_back(D);
21279ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  }
2135908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor
2145908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor  bool empty() const { return Designators.empty(); }
2155908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor
21679ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  unsigned getNumDesignators() const { return Designators.size(); }
21779ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  const Designator &getDesignator(unsigned Idx) const {
21879ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner    assert(Idx < Designators.size());
21979ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner    return Designators[Idx];
22079ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  }
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
222eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// ClearExprs - Null out any expression references, which prevents them from
223eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// being 'delete'd later.
224eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void ClearExprs(Action &Actions) {
225eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    for (unsigned i = 0, e = Designators.size(); i != e; ++i)
226eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      Designators[i].ClearExprs(Actions);
227eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
229eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// FreeExprs - Release any unclaimed memory for the expressions in this
230eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// designation.
231eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void FreeExprs(Action &Actions) {
232eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    for (unsigned i = 0, e = Designators.size(); i != e; ++i)
233eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner      Designators[i].FreeExprs(Actions);
234eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
235eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner};
2361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
237eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner} // end namespace clang
238eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
239eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner#endif
240