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//
10b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall// This file defines interfaces used to represent designators (a la
11b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall// C99 designated initializers) during parsing.
12eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//
13eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner//===----------------------------------------------------------------------===//
14eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1519510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#ifndef LLVM_CLANG_SEMA_DESIGNATOR_H
1619510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#define LLVM_CLANG_SEMA_DESIGNATOR_H
17eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
18f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Basic/SourceLocation.h"
19f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "llvm/ADT/SmallVector.h"
20eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
21eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnernamespace clang {
221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallclass Expr;
24f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallclass IdentifierInfo;
25f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallclass Sema;
26f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall
27b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall/// Designator - A designator in a C99 designated initializer.
28b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall///
29b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall/// This class is a discriminated union which holds the various
30eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// different sorts of designators possible.  A Designation is an array of
31eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// these.  An example of a designator are things like this:
32eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///     [8] .field [47]        // C99 designation: 3 designators
33eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///     [8 ... 47]  field:     // GNU extensions: 2 designators
34eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// These occur in initializers, e.g.:
35eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///  int a[10] = {2, 4, [8]=9, 10};
36eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner///
37eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerclass Designator {
38eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
39eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  enum DesignatorKind {
40eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    FieldDesignator, ArrayDesignator, ArrayRangeDesignator
41eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
42eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerprivate:
43eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  DesignatorKind Kind;
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct FieldDesignatorInfo {
46eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    const IdentifierInfo *II;
4705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned DotLoc;
4805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned NameLoc;
49eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
50eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct ArrayDesignatorInfo {
51b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Expr *Index;
5205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned LBracketLoc;
5305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    mutable unsigned  RBracketLoc;
54eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
55eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  struct ArrayRangeDesignatorInfo {
56b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    Expr *Start, *End;
5705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    unsigned LBracketLoc, EllipsisLoc;
5805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    mutable unsigned RBracketLoc;
59eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
61eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  union {
62eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    FieldDesignatorInfo FieldInfo;
63eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    ArrayDesignatorInfo ArrayInfo;
64eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    ArrayRangeDesignatorInfo ArrayRangeInfo;
65eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  };
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  DesignatorKind getKind() const { return Kind; }
70eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isFieldDesignator() const { return Kind == FieldDesignator; }
71eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isArrayDesignator() const { return Kind == ArrayDesignator; }
72eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  bool isArrayRangeDesignator() const { return Kind == ArrayRangeDesignator; }
73eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
74eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  const IdentifierInfo *getField() const {
75eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isFieldDesignator() && "Invalid accessor");
76eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return FieldInfo.II;
77eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
7805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
7905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getDotLoc() const {
8005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isFieldDesignator() && "Invalid accessor");
8105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(FieldInfo.DotLoc);
8205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
8305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
8405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getFieldLoc() const {
8505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isFieldDesignator() && "Invalid accessor");
8605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(FieldInfo.NameLoc);
8705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
89b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  Expr *getArrayIndex() const {
90eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayDesignator() && "Invalid accessor");
91eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayInfo.Index;
92eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
93eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
94b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  Expr *getArrayRangeStart() const {
95eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayRangeDesignator() && "Invalid accessor");
96eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayRangeInfo.Start;
97eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
98b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  Expr *getArrayRangeEnd() const {
99eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    assert(isArrayRangeDesignator() && "Invalid accessor");
100eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return ArrayRangeInfo.End;
101eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getLBracketLoc() const {
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
10505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
10605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
10705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayInfo.LBracketLoc);
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else
10905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayRangeInfo.LBracketLoc);
11005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
11105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
11205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getRBracketLoc() const {
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
11405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
11505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
11605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayInfo.RBracketLoc);
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    else
11805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      return SourceLocation::getFromRawEncoding(ArrayRangeInfo.RBracketLoc);
11905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
12005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
12105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation getEllipsisLoc() const {
12205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    assert(isArrayRangeDesignator() && "Invalid accessor");
12305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return SourceLocation::getFromRawEncoding(ArrayRangeInfo.EllipsisLoc);
12405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
12505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
12605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  static Designator getField(const IdentifierInfo *II, SourceLocation DotLoc,
12705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                             SourceLocation NameLoc) {
128eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
129eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = FieldDesignator;
130eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.FieldInfo.II = II;
13105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.FieldInfo.DotLoc = DotLoc.getRawEncoding();
13205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.FieldInfo.NameLoc = NameLoc.getRawEncoding();
133eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
134eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
135eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
136b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  static Designator getArray(Expr *Index,
1378f823d2d3c557326d22699d66e5d367d0f0e44efChris Lattner                             SourceLocation LBracketLoc) {
138eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
139eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = ArrayDesignator;
140eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayInfo.Index = Index;
14105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayInfo.LBracketLoc = LBracketLoc.getRawEncoding();
14205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayInfo.RBracketLoc = 0;
143eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
144eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
1451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
146b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  static Designator getArrayRange(Expr *Start,
147b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                  Expr *End,
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                  SourceLocation LBracketLoc,
14905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                                  SourceLocation EllipsisLoc) {
150eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designator D;
151eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.Kind = ArrayRangeDesignator;
152eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayRangeInfo.Start = Start;
153eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    D.ArrayRangeInfo.End = End;
15405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.LBracketLoc = LBracketLoc.getRawEncoding();
15505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.EllipsisLoc = EllipsisLoc.getRawEncoding();
15605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    D.ArrayRangeInfo.RBracketLoc = 0;
157eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    return D;
158eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  }
15905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
16005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  void setRBracketLoc(SourceLocation RBracketLoc) const {
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert((isArrayDesignator() || isArrayRangeDesignator()) &&
16205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor           "Invalid accessor");
16305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    if (isArrayDesignator())
16405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayInfo.RBracketLoc = RBracketLoc.getRawEncoding();
16505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    else
16605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      ArrayRangeInfo.RBracketLoc = RBracketLoc.getRawEncoding();
16705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  }
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
169b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  /// ClearExprs - Null out any expression references, which prevents
170b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  /// them from being 'delete'd later.
171f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  void ClearExprs(Sema &Actions) {}
1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
173b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  /// FreeExprs - Release any unclaimed memory for the expressions in
174b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  /// this designator.
175f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  void FreeExprs(Sema &Actions) {}
176eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner};
177eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
179eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// Designation - Represent a full designation, which is a sequence of
180eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner/// designators.  This class is mostly a helper for InitListDesignations.
181eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerclass Designation {
182eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// Designators - The actual designators for this initializer.
183686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  SmallVector<Designator, 2> Designators;
1841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
185eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattnerpublic:
186eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// AddDesignator - Add a designator to the end of this list.
187eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  void AddDesignator(Designator D) {
188eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner    Designators.push_back(D);
18979ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  }
1905908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor
1915908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor  bool empty() const { return Designators.empty(); }
1925908a9293b88a3da57ae59b522275d05e1ab11e0Douglas Gregor
19379ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  unsigned getNumDesignators() const { return Designators.size(); }
19479ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  const Designator &getDesignator(unsigned Idx) const {
19579ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner    assert(Idx < Designators.size());
19679ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner    return Designators[Idx];
19779ed6b5902ed92175b70ed3c4d7b3f239af847ceChris Lattner  }
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// ClearExprs - Null out any expression references, which prevents them from
200eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// being 'delete'd later.
201f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  void ClearExprs(Sema &Actions) {}
2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
203eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// FreeExprs - Release any unclaimed memory for the expressions in this
204eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner  /// designation.
205f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  void FreeExprs(Sema &Actions) {}
206eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner};
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
208eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner} // end namespace clang
209eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner
210eccc53a0a0ed1abc7bb4c04ed9566ce0c5c63140Chris Lattner#endif
211