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