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