Expr.cpp revision a779d9ca2fdf1247f65de0e6acf2870d8be53ccd
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the Expr class and subclasses.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/AST/Expr.h"
150979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor#include "clang/AST/ExprCXX.h"
16a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner#include "clang/AST/APValue.h"
172eadfb638eb1bb6ccfd6fd0453e764d47e27eed9Chris Lattner#include "clang/AST/ASTContext.h"
18a4d55d89c8076b402bb168e3edeef0c2cd2a78c3Chris Lattner#include "clang/AST/DeclObjC.h"
1998cd599ee8a9b259ed7388ee2921a20d97658864Douglas Gregor#include "clang/AST/DeclCXX.h"
20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
2119cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h"
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtVisitor.h"
2308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Lex/LiteralSupport.h"
2408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Lex/Lexer.h"
251b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
2608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Basic/SourceManager.h"
27da5a6b6d9fd52899499d5b7b46273ec844dcaa6eChris Lattner#include "clang/Basic/TargetInfo.h"
28cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor#include "llvm/Support/ErrorHandling.h"
293a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson#include "llvm/Support/raw_ostream.h"
30ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor#include <algorithm>
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
33bef0efd11bc4430a3ee437a3213cec5c18af855aChris Lattnervoid Expr::ANCHOR() {} // key function for Expr class.
34bef0efd11bc4430a3ee437a3213cec5c18af855aChris Lattner
352b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// isKnownToHaveBooleanValue - Return true if this is an integer expression
362b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// that is known to return 0 or 1.  This happens for _Bool/bool expressions
372b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// but also int expressions which are produced by things like comparisons in
382b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// C.
392b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattnerbool Expr::isKnownToHaveBooleanValue() const {
402b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  // If this value has _Bool type, it is obvious 0/1.
412b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  if (getType()->isBooleanType()) return true;
42c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // If this is a non-scalar-integer type, we don't care enough to try.
432ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor  if (!getType()->isIntegralOrEnumerationType()) return false;
44c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
452b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  if (const ParenExpr *PE = dyn_cast<ParenExpr>(this))
462b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    return PE->getSubExpr()->isKnownToHaveBooleanValue();
47c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
482b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(this)) {
492b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    switch (UO->getOpcode()) {
502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
522b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return UO->getSubExpr()->isKnownToHaveBooleanValue();
532b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    default:
542b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return false;
552b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    }
562b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  }
57c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
586907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  // Only look through implicit casts.  If the user writes
596907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  // '(int) (a && b)' treat it as an arbitrary int.
606907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(this))
612b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    return CE->getSubExpr()->isKnownToHaveBooleanValue();
62c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
632b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(this)) {
642b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    switch (BO->getOpcode()) {
652b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    default: return false;
662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:   // Relational operators.
672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:   // Equality operators.
712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LAnd: // AND operator.
732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LOr:  // Logical OR operator.
742b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return true;
75c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_And:  // Bitwise AND operator.
772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Xor:  // Bitwise XOR operator.
782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Or:   // Bitwise OR operator.
792b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      // Handle things like (x==2)|(y==12).
802b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return BO->getLHS()->isKnownToHaveBooleanValue() &&
812b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner             BO->getRHS()->isKnownToHaveBooleanValue();
82c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Comma:
842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Assign:
852b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return BO->getRHS()->isKnownToHaveBooleanValue();
862b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    }
872b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  }
88c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
892b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(this))
902b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
912b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner           CO->getFalseExpr()->isKnownToHaveBooleanValue();
92c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
932b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  return false;
942b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner}
952b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner
965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions.
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
100d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::initializeFrom(
101d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      const TemplateArgumentListInfo &Info) {
102d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  LAngleLoc = Info.getLAngleLoc();
103d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  RAngleLoc = Info.getRAngleLoc();
104d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NumTemplateArgs = Info.size();
105d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
106d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
107d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0; i != NumTemplateArgs; ++i)
108d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
109d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
110d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
111bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorvoid ExplicitTemplateArgumentList::initializeFrom(
112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   const TemplateArgumentListInfo &Info,
113bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   bool &Dependent,
114bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   bool &ContainsUnexpandedParameterPack) {
115bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  LAngleLoc = Info.getLAngleLoc();
116bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  RAngleLoc = Info.getRAngleLoc();
117bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  NumTemplateArgs = Info.size();
118bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
119bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
120bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
121bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    Dependent = Dependent || Info[i].getArgument().isDependent();
122bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    ContainsUnexpandedParameterPack
123bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      = ContainsUnexpandedParameterPack ||
124bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        Info[i].getArgument().containsUnexpandedParameterPack();
125bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
126bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
127bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
128bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
129bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
130d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::copyInto(
131d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      TemplateArgumentListInfo &Info) const {
132d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  Info.setLAngleLoc(LAngleLoc);
133d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  Info.setRAngleLoc(RAngleLoc);
134d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned I = 0; I != NumTemplateArgs; ++I)
135d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Info.addArgument(getTemplateArgs()[I]);
136d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
137d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
1388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstd::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) {
1398dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return sizeof(ExplicitTemplateArgumentList) +
1408dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
1418dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
1428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
143d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallstd::size_t ExplicitTemplateArgumentList::sizeFor(
144d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      const TemplateArgumentListInfo &Info) {
1458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return sizeFor(Info.size());
146d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
147d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
1480da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregorvoid DeclRefExpr::computeDependence() {
1498e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  ExprBits.TypeDependent = false;
1508e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall  ExprBits.ValueDependent = false;
151c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1520da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  NamedDecl *D = getDecl();
1530da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor
1540da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  // (TD) C++ [temp.dep.expr]p3:
1550da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //   An id-expression is type-dependent if it contains:
1560da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //
157c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // and
1580da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //
1590da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  // (VD) C++ [temp.dep.constexpr]p2:
1600da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  An identifier is value-dependent if it is:
1610da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor
1620da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - an identifier that was declared with dependent type
1630da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD)  - a name declared with a dependent type,
1640da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  if (getType()->isDependentType()) {
1658e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.TypeDependent = true;
1668e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = true;
1670da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
1680da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - a conversion-function-id that specifies a dependent type
169c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  else if (D->getDeclName().getNameKind()
1700da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                               == DeclarationName::CXXConversionFunctionName &&
1710da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor           D->getDeclName().getCXXNameType()->isDependentType()) {
1728e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.TypeDependent = true;
1738e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = true;
1740da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
1750da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - a template-id that is dependent,
176096832c5ed5b9106fa177ebc148489760c3bc496John McCall  else if (hasExplicitTemplateArgs() &&
1770da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor           TemplateSpecializationType::anyDependentTemplateArguments(
178c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                       getTemplateArgs(),
1790da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                                       getNumTemplateArgs())) {
1808e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.TypeDependent = true;
1818e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = true;
1820da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
1830da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD)  - the name of a non-type template parameter,
1840da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  else if (isa<NonTypeTemplateParmDecl>(D))
1858e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = true;
1860da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD) - a constant with integral or enumeration type and is
1870da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //         initialized with an expression that is value-dependent.
1880da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
1892ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    if (Var->getType()->isIntegralOrEnumerationType() &&
190501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor        Var->getType().getCVRQualifiers() == Qualifiers::Const) {
19131310a21fb2a9f13950f864f681c86080b05d5b2Sebastian Redl      if (const Expr *Init = Var->getAnyInitializer())
192501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor        if (Init->isValueDependent())
1938e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall          ExprBits.ValueDependent = true;
194bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    }
195bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    // (VD) - FIXME: Missing from the standard:
196bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    //      -  a member function or a static data member of the current
197bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    //         instantiation
198bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    else if (Var->isStaticDataMember() &&
1997ed5bd3e27a6f2b37ee0449aa818116cbd03306eDouglas Gregor             Var->getDeclContext()->isDependentContext())
2008e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      ExprBits.ValueDependent = true;
201bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  }
202bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  // (VD) - FIXME: Missing from the standard:
203bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  //      -  a member function or a static data member of the current
204bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  //         instantiation
205bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  else if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext())
2068e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall    ExprBits.ValueDependent = true;
2070da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - a nested-name-specifier or a qualified-id that names a
2080da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //          member of an unknown specialization.
2090da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //        (handled by DependentScopeDeclRefExpr)
210bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
21110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  // Determine whether this expression contains any unexpanded parameter
21210738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  // packs.
21310738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  // Is the declaration a parameter pack?
2141fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor  if (D->isParameterPack())
2151fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor    ExprBits.ContainsUnexpandedParameterPack = true;
2160da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor}
2170da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor
218c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntDeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
219a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                         SourceRange QualifierRange,
220dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                         ValueDecl *D, SourceLocation NameLoc,
221d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                         const TemplateArgumentListInfo *TemplateArgs,
222f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                         QualType T, ExprValueKind VK)
223bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
224a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    DecoratedD(D,
225a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor               (Qualifier? HasQualifierFlag : 0) |
226d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
227a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Loc(NameLoc) {
228a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (Qualifier) {
229a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    NameQualifier *NQ = getNameQualifier();
230a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    NQ->NNS = Qualifier;
231a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    NQ->Range = QualifierRange;
232a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  }
233c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
234d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  if (TemplateArgs)
235096832c5ed5b9106fa177ebc148489760c3bc496John McCall    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
236a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
2370da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  computeDependence();
238a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}
239a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
2402577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
2412577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                         SourceRange QualifierRange,
2422577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                         ValueDecl *D, const DeclarationNameInfo &NameInfo,
2432577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                         const TemplateArgumentListInfo *TemplateArgs,
244f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                         QualType T, ExprValueKind VK)
245bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
2462577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    DecoratedD(D,
2472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara               (Qualifier? HasQualifierFlag : 0) |
2482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
2492577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
2502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (Qualifier) {
2512577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NameQualifier *NQ = getNameQualifier();
2522577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NQ->NNS = Qualifier;
2532577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    NQ->Range = QualifierRange;
2542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  }
2552577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2562577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (TemplateArgs)
257096832c5ed5b9106fa177ebc148489760c3bc496John McCall    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
2582577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  computeDependence();
2602577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
2612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
262a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
263a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                 NestedNameSpecifier *Qualifier,
264a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                 SourceRange QualifierRange,
265dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                 ValueDecl *D,
266a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                 SourceLocation NameLoc,
2670da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                 QualType T,
268f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
2690da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                 const TemplateArgumentListInfo *TemplateArgs) {
2702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return Create(Context, Qualifier, QualifierRange, D,
2712577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                DeclarationNameInfo(D->getDeclName(), NameLoc),
272f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                T, VK, TemplateArgs);
2732577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
2742577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2752577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
2762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 NestedNameSpecifier *Qualifier,
2772577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 SourceRange QualifierRange,
2782577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 ValueDecl *D,
2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 const DeclarationNameInfo &NameInfo,
2802577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 QualType T,
281f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
2822577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 const TemplateArgumentListInfo *TemplateArgs) {
283a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  std::size_t Size = sizeof(DeclRefExpr);
284a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (Qualifier != 0)
285a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Size += sizeof(NameQualifier);
286c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
287d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  if (TemplateArgs)
288d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
289c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2903248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
2912577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  return new (Mem) DeclRefExpr(Qualifier, QualifierRange, D, NameInfo,
292f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               TemplateArgs, T, VK);
293a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}
294a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
295663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios KyrtzidisDeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context, bool HasQualifier,
296663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                      unsigned NumTemplateArgs) {
297663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  std::size_t Size = sizeof(DeclRefExpr);
298663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (HasQualifier)
299663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    Size += sizeof(NameQualifier);
300663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
301663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (NumTemplateArgs)
302663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
303663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
3043248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
305663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  return new (Mem) DeclRefExpr(EmptyShell());
306663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis}
307663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
308a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorSourceRange DeclRefExpr::getSourceRange() const {
3092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  SourceRange R = getNameInfo().getSourceRange();
310a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (hasQualifier())
311a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    R.setBegin(getQualifierRange().getBegin());
312096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (hasExplicitTemplateArgs())
313a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    R.setEnd(getRAngleLoc());
314a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return R;
315a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}
316a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3173a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// FIXME: Maybe this should use DeclPrinter with a special "print predefined
3183a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// expr" policy instead.
319848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlssonstd::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
320848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson  ASTContext &Context = CurrentDecl->getASTContext();
321848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson
3223a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
323848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
3243a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      return FD->getNameAsString();
3253a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3263a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::SmallString<256> Name;
3273a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::raw_svector_ostream Out(Name);
3283a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3293a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
330848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson      if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
3313a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        Out << "virtual ";
3324eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (MD->isStatic())
3334eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Out << "static ";
3343a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    }
3353a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3363a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    PrintingPolicy Policy(Context.getLangOptions());
3373a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3383a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    std::string Proto = FD->getQualifiedNameAsString(Policy);
3393a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
340183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const FunctionType *AFT = FD->getType()->getAs<FunctionType>();
3413a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    const FunctionProtoType *FT = 0;
3423a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (FD->hasWrittenPrototype())
3433a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      FT = dyn_cast<FunctionProtoType>(AFT);
3443a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3453a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Proto += "(";
3463a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (FT) {
3473a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      llvm::raw_string_ostream POut(Proto);
3483a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
3493a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        if (i) POut << ", ";
3503a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        std::string Param;
3513a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy);
3523a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        POut << Param;
3533a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      }
3543a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3553a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      if (FT->isVariadic()) {
3563a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        if (FD->getNumParams()) POut << ", ";
3573a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        POut << "...";
3583a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      }
3593a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    }
3603a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Proto += ")";
3613a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3624eadcc569223135e13353c9381b448986e3f7053Sam Weinig    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
3634eadcc569223135e13353c9381b448986e3f7053Sam Weinig      Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
3644eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (ThisQuals.hasConst())
3654eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Proto += " const";
3664eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (ThisQuals.hasVolatile())
3674eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Proto += " volatile";
3684eadcc569223135e13353c9381b448986e3f7053Sam Weinig    }
3694eadcc569223135e13353c9381b448986e3f7053Sam Weinig
3703a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig    if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
3713a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig      AFT->getResultType().getAsStringInternal(Proto, Policy);
3723a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3733a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << Proto;
3743a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3753a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out.flush();
3763a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return Name.str().str();
3773a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
3783a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
3793a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::SmallString<256> Name;
3803a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::raw_svector_ostream Out(Name);
3813a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << (MD->isInstanceMethod() ? '-' : '+');
3823a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << '[';
383b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek
384b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
385b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    // a null check to avoid a crash.
386b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
387900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer      Out << ID;
388b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek
3893a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (const ObjCCategoryImplDecl *CID =
390900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
391900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer      Out << '(' << CID << ')';
392900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer
3933a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out <<  ' ';
3943a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << MD->getSelector().getAsString();
3953a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out <<  ']';
3963a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3973a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out.flush();
3983a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return Name.str().str();
3993a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
4003a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
4013a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
4023a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return "top level";
4033a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
4043a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  return "";
4053a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson}
4063a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4079996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisvoid APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) {
4089996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  if (hasAllocation())
4099996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    C.Deallocate(pVal);
4109996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4119996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  BitWidth = Val.getBitWidth();
4129996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  unsigned NumWords = Val.getNumWords();
4139996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  const uint64_t* Words = Val.getRawData();
4149996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  if (NumWords > 1) {
4159996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    pVal = new (C) uint64_t[NumWords];
4169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    std::copy(Words, Words + NumWords, pVal);
4179996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  } else if (NumWords == 1)
4189996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    VAL = Words[0];
4199996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  else
4209996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    VAL = 0;
4219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4229996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral *
4249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, const llvm::APInt &V,
4259996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                       QualType type, SourceLocation l) {
4269996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) IntegerLiteral(C, V, type, l);
4279996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4289996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4299996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral *
4309996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, EmptyShell Empty) {
4319996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) IntegerLiteral(Empty);
4329996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4339996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4349996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral *
4359996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V,
4369996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                        bool isexact, QualType Type, SourceLocation L) {
4379996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) FloatingLiteral(C, V, isexact, Type, L);
4389996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4399996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4409996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral *
4419996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, EmptyShell Empty) {
4429996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) FloatingLiteral(Empty);
4439996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4449996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
445da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// getValueAsApproximateDouble - This returns the value as an inaccurate
446da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// double.  Note that this may cause loss of precision, but is useful for
447da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// debugging dumps, etc.
448da8249e57f3badecf925571881fe57243935c6c1Chris Lattnerdouble FloatingLiteral::getValueAsApproximateDouble() const {
449da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  llvm::APFloat V = getValue();
450ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  bool ignored;
451ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
452ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen            &ignored);
453da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  return V.convertToDouble();
454da8249e57f3badecf925571881fe57243935c6c1Chris Lattner}
455da8249e57f3badecf925571881fe57243935c6c1Chris Lattner
4562085fd6cd22ec5c268175251db10d7c60caf7aaaChris LattnerStringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
4572085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner                                     unsigned ByteLength, bool Wide,
4582085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner                                     QualType Ty,
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const SourceLocation *Loc,
460a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson                                     unsigned NumStrs) {
4612085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  // Allocate enough space for the StringLiteral plus an array of locations for
4622085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  // any concatenated string tokens.
4632085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  void *Mem = C.Allocate(sizeof(StringLiteral)+
4642085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner                         sizeof(SourceLocation)*(NumStrs-1),
4653248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner                         llvm::alignOf<StringLiteral>());
4662085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  StringLiteral *SL = new (Mem) StringLiteral(Ty);
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // OPTIMIZE: could allocate this appended to the StringLiteral.
4692085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  char *AStrData = new (C, 1) char[ByteLength];
4702085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  memcpy(AStrData, StrData, ByteLength);
4712085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->StrData = AStrData;
4722085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->ByteLength = ByteLength;
4732085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->IsWide = Wide;
4742085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->TokLocs[0] = Loc[0];
4752085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->NumConcatenated = NumStrs;
4765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
477726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  if (NumStrs != 1)
4782085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner    memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
4792085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  return SL;
480726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner}
481726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner
482673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas GregorStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
483673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  void *Mem = C.Allocate(sizeof(StringLiteral)+
484673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor                         sizeof(SourceLocation)*(NumStrs-1),
4853248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner                         llvm::alignOf<StringLiteral>());
486673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  StringLiteral *SL = new (Mem) StringLiteral(QualType());
487673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->StrData = 0;
488673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->ByteLength = 0;
489673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->NumConcatenated = NumStrs;
490673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  return SL;
491673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor}
492673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
493b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbarvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) {
494b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  char *AStrData = new (C, 1) char[Str.size()];
495b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  memcpy(AStrData, Str.data(), Str.size());
496673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  StrData = AStrData;
497b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  ByteLength = Str.size();
498673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor}
499673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
50008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// getLocationOfByte - Return a source location that points to the specified
50108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// byte of this string literal.
50208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner///
50308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// Strings are amazingly complex.  They can be formed from multiple tokens and
50408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// can have escape sequences in them in addition to the usual trigraph and
50508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// escaped newline business.  This routine handles this complexity.
50608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner///
50708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnerSourceLocation StringLiteral::
50808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnergetLocationOfByte(unsigned ByteNo, const SourceManager &SM,
50908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                  const LangOptions &Features, const TargetInfo &Target) const {
51008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  assert(!isWide() && "This doesn't work for wide strings yet");
51108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
51208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  // Loop over all of the tokens in this string until we find the one that
51308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  // contains the byte we're looking for.
51408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  unsigned TokNo = 0;
51508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  while (1) {
51608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    assert(TokNo < getNumConcatenated() && "Invalid byte number!");
51708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
51808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
51908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Get the spelling of the string so that we can get the data that makes up
52008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // the string literal, not the identifier for the macro it is potentially
52108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // expanded through.
52208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
52308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
52408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Re-lex the token to get its length and original spelling.
52508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc);
52608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    bool Invalid = false;
52708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
52808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    if (Invalid)
52908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      return StrTokSpellingLoc;
53008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
53108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    const char *StrData = Buffer.data()+LocInfo.second;
53208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
53308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Create a langops struct and enable trigraphs.  This is sufficient for
53408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // relexing tokens.
53508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    LangOptions LangOpts;
53608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    LangOpts.Trigraphs = true;
53708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
53808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Create a lexer starting at the beginning of this token.
53908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData,
54008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                   Buffer.end());
54108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    Token TheTok;
54208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    TheLexer.LexFromRawLexer(TheTok);
54308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
54408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Use the StringLiteralParser to compute the length of the string in bytes.
54508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    StringLiteralParser SLP(&TheTok, 1, SM, Features, Target);
54608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    unsigned TokNumBytes = SLP.GetStringLength();
54708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
54808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // If the byte is in this token, return the location of the byte.
54908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    if (ByteNo < TokNumBytes ||
55008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner        (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) {
55108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
55208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
55308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      // Now that we know the offset of the token in the spelling, use the
55408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      // preprocessor to get the offset in the original source.
55508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
55608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    }
55708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
55808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Move to the next string token.
55908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    ++TokNo;
56008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    ByteNo -= TokNumBytes;
56108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  }
56208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner}
56308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
56408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
56508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "sizeof" or "[pre]++".
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *UnaryOperator::getOpcodeStr(Opcode Op) {
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (Op) {
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown unary operator");
5712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostInc: return "++";
5722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostDec: return "--";
5732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PreInc:  return "++";
5742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PreDec:  return "--";
5752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_AddrOf:  return "&";
5762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Deref:   return "*";
5772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:    return "+";
5782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus:   return "-";
5792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Not:     return "~";
5802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_LNot:    return "!";
5812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Real:    return "__real";
5822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Imag:    return "__imag";
5832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Extension: return "__extension__";
5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallUnaryOperatorKind
588bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
589bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  switch (OO) {
590bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  default: assert(false && "No unary operator for overloaded function");
5912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PlusPlus:   return Postfix ? UO_PostInc : UO_PreInc;
5922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
5932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Amp:        return UO_AddrOf;
5942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Star:       return UO_Deref;
5952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Plus:       return UO_Plus;
5962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Minus:      return UO_Minus;
5972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Tilde:      return UO_Not;
5982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Exclaim:    return UO_LNot;
599bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  }
600bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}
601bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
602bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
603bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  switch (Opc) {
6042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
6052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
6062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_AddrOf: return OO_Amp;
6072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Deref: return OO_Star;
6082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus: return OO_Plus;
6092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus: return OO_Minus;
6102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Not: return OO_Tilde;
6112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_LNot: return OO_Exclaim;
612bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  default: return OO_None;
613bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  }
614bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}
615bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
616bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators.
6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
621668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args,
622f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   unsigned numargs, QualType t, ExprValueKind VK,
623f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   SourceLocation rparenloc)
624f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(SC, t, VK, OK_Ordinary,
625bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isTypeDependent(),
626bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isValueDependent(),
627bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->containsUnexpandedParameterPack()),
628898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    NumArgs(numargs) {
6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
630668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek  SubExprs = new (C) Stmt*[numargs+1];
631b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  SubExprs[FN] = fn;
632bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != numargs; ++i) {
633bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
634bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
635bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
636bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
637bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
638bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
639bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
640b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    SubExprs[i+ARGS_START] = args[i];
641bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
642668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
643b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  RParenLoc = rparenloc;
644b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
645e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
646668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
647f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   QualType t, ExprValueKind VK, SourceLocation rparenloc)
648f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(CallExprClass, t, VK, OK_Ordinary,
649bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isTypeDependent(),
650bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isValueDependent(),
651bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->containsUnexpandedParameterPack()),
652898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    NumArgs(numargs) {
653668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
654668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek  SubExprs = new (C) Stmt*[numargs+1];
65577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  SubExprs[FN] = fn;
656bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != numargs; ++i) {
657bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
658bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
659bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
660bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
661bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
662bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
663bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
66477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek    SubExprs[i+ARGS_START] = args[i];
665bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
666668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RParenLoc = rparenloc;
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
672bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  // FIXME: Why do we allocate this?
6731f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor  SubExprs = new (C) Stmt*[1];
6741f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor}
6751f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor
676d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesDecl *CallExpr::getCalleeDecl() {
677a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  Expr *CEE = getCallee()->IgnoreParenCasts();
678200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  // If we're calling a dereference, look at the pointer instead.
679200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
680200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl    if (BO->isPtrMemOp())
681200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl      CEE = BO->getRHS()->IgnoreParenCasts();
682200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
683200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl    if (UO->getOpcode() == UO_Deref)
684200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl      CEE = UO->getSubExpr()->IgnoreParenCasts();
685200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  }
6866346f963145ed18b6edf50a78753b47db505e912Chris Lattner  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
687d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes    return DRE->getDecl();
688cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes  if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
689cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes    return ME->getMemberDecl();
690a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
691a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  return 0;
692a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu}
693a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
694d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesFunctionDecl *CallExpr::getDirectCallee() {
695caabf9bf331156e96dacb072385901fdfa057ec1Chris Lattner  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
696d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes}
697d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes
698d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// setNumArgs - This changes the number of arguments present in this call.
699d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// Any orphaned expressions are deleted by this, and any new operands are set
700d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// to null.
7018189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenekvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
702d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // No change, just return.
703d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  if (NumArgs == getNumArgs()) return;
7041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
705d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // If shrinking # arguments, just delete the extras and forgot them.
706d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  if (NumArgs < getNumArgs()) {
707d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    this->NumArgs = NumArgs;
708d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    return;
709d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  }
710d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner
711d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Otherwise, we are growing the # arguments.  New an bigger argument array.
71268a049cab6015a7437bec5661601b7d37d23c70cDaniel Dunbar  Stmt **NewSubExprs = new (C) Stmt*[NumArgs+1];
713d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Copy over args.
714d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i)
715d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    NewSubExprs[i] = SubExprs[i];
716d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Null out new args.
717d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i)
718d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    NewSubExprs[i] = 0;
7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
72088c9a46f0b84f1ee83e01917825346551ee540d0Douglas Gregor  if (SubExprs) C.Deallocate(SubExprs);
721d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  SubExprs = NewSubExprs;
722d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  this->NumArgs = NumArgs;
723d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner}
724d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner
725cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
726cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// not, return 0.
7274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned CallExpr::isBuiltinCall(const ASTContext &Context) const {
728c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  // All simple function calls (e.g. func()) are implicitly cast to pointer to
7291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // function. As a result, we try and obtain the DeclRefExpr from the
730c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  // ImplicitCastExpr.
731c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
732c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
733cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
735c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
736c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  if (!DRE)
737cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
739bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
740bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson  if (!FDecl)
741cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7434fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor  if (!FDecl->getIdentifier())
7444fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor    return 0;
7454fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor
7467814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor  return FDecl->getBuiltinID();
747cb888967400a03504c88acedd5248d6778a82f46Chris Lattner}
748bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson
7496dde78f744382a5627a04f984a97049e0c4b5e73Anders CarlssonQualType CallExpr::getCallReturnType() const {
7506dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  QualType CalleeType = getCallee()->getType();
7516217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
7526dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson    CalleeType = FnTypePtr->getPointeeType();
7536217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
7546dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson    CalleeType = BPT->getPointeeType();
7555291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor  else if (const MemberPointerType *MPT
7565291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor                                      = CalleeType->getAs<MemberPointerType>())
7575291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor    CalleeType = MPT->getPointeeType();
7585291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor
759183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  const FunctionType *FnType = CalleeType->getAs<FunctionType>();
7606dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  return FnType->getResultType();
7616dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson}
762cb888967400a03504c88acedd5248d6778a82f46Chris Lattner
763c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
7648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   SourceLocation OperatorLoc,
765c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                   TypeSourceInfo *tsi,
766c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                   OffsetOfNode* compsPtr, unsigned numComps,
7678ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   Expr** exprsPtr, unsigned numExprs,
7688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   SourceLocation RParenLoc) {
7698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
770c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                         sizeof(OffsetOfNode) * numComps +
7718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(Expr*) * numExprs);
7728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
7738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
7748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                exprsPtr, numExprs, RParenLoc);
7758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
7768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
7778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorOffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
7788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                        unsigned numComps, unsigned numExprs) {
7798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
7808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(OffsetOfNode) * numComps +
7818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(Expr*) * numExprs);
7828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return new (Mem) OffsetOfExpr(numComps, numExprs);
7838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
7848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
785c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
7868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           SourceLocation OperatorLoc, TypeSourceInfo *tsi,
787c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                           OffsetOfNode* compsPtr, unsigned numComps,
7888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           Expr** exprsPtr, unsigned numExprs,
7898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           SourceLocation RParenLoc)
790f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
791f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall         /*TypeDependent=*/false,
792bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*ValueDependent=*/tsi->getType()->isDependentType(),
793bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         tsi->getType()->containsUnexpandedParameterPack()),
794c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
795c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    NumComps(numComps), NumExprs(numExprs)
7968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor{
7978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for(unsigned i = 0; i < numComps; ++i) {
7988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    setComponent(i, compsPtr[i]);
7998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
800c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for(unsigned i = 0; i < numExprs; ++i) {
802bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent())
803bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
804bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprsPtr[i]->containsUnexpandedParameterPack())
805bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
806bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
8078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    setIndexExpr(i, exprsPtr[i]);
8088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
8098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorIdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
8128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(getKind() == Field || getKind() == Identifier);
8138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (getKind() == Field)
8148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getField()->getIdentifier();
815c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
8178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                               NestedNameSpecifier *qual,
82183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor                               SourceRange qualrange,
822f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                               ValueDecl *memberdecl,
823161755a09898c95d21bfff33707da9ca41cd53c5John McCall                               DeclAccessPair founddecl,
8242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               DeclarationNameInfo nameinfo,
825d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo *targs,
826f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               QualType ty,
827f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ExprValueKind vk,
828f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ExprObjectKind ok) {
82983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  std::size_t Size = sizeof(MemberExpr);
8306bb8017bb9e828d118e15e59d71c66bba323c364John McCall
831161755a09898c95d21bfff33707da9ca41cd53c5John McCall  bool hasQualOrFound = (qual != 0 ||
832161755a09898c95d21bfff33707da9ca41cd53c5John McCall                         founddecl.getDecl() != memberdecl ||
833161755a09898c95d21bfff33707da9ca41cd53c5John McCall                         founddecl.getAccess() != memberdecl->getAccess());
8346bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (hasQualOrFound)
8356bb8017bb9e828d118e15e59d71c66bba323c364John McCall    Size += sizeof(MemberNameQualifier);
8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
837d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  if (targs)
838d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Size += ExplicitTemplateArgumentList::sizeFor(*targs);
8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8403248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
841f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
842f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                       ty, vk, ok);
8436bb8017bb9e828d118e15e59d71c66bba323c364John McCall
8446bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (hasQualOrFound) {
8456bb8017bb9e828d118e15e59d71c66bba323c364John McCall    if (qual && qual->isDependent()) {
8466bb8017bb9e828d118e15e59d71c66bba323c364John McCall      E->setValueDependent(true);
8476bb8017bb9e828d118e15e59d71c66bba323c364John McCall      E->setTypeDependent(true);
8486bb8017bb9e828d118e15e59d71c66bba323c364John McCall    }
8496bb8017bb9e828d118e15e59d71c66bba323c364John McCall    E->HasQualifierOrFoundDecl = true;
8506bb8017bb9e828d118e15e59d71c66bba323c364John McCall
8516bb8017bb9e828d118e15e59d71c66bba323c364John McCall    MemberNameQualifier *NQ = E->getMemberQualifier();
8526bb8017bb9e828d118e15e59d71c66bba323c364John McCall    NQ->NNS = qual;
8536bb8017bb9e828d118e15e59d71c66bba323c364John McCall    NQ->Range = qualrange;
8546bb8017bb9e828d118e15e59d71c66bba323c364John McCall    NQ->FoundDecl = founddecl;
8556bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
8566bb8017bb9e828d118e15e59d71c66bba323c364John McCall
8576bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (targs) {
8586bb8017bb9e828d118e15e59d71c66bba323c364John McCall    E->HasExplicitTemplateArgumentList = true;
859096832c5ed5b9106fa177ebc148489760c3bc496John McCall    E->getExplicitTemplateArgs().initializeFrom(*targs);
8606bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
8616bb8017bb9e828d118e15e59d71c66bba323c364John McCall
8626bb8017bb9e828d118e15e59d71c66bba323c364John McCall  return E;
86383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor}
86483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
865f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlssonconst char *CastExpr::getCastKindName() const {
866f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  switch (getCastKind()) {
867daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_Dependent:
868daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "Dependent";
8692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BitCast:
870f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "BitCast";
8712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_LValueBitCast:
872e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    return "LValueBitCast";
8730ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall  case CK_LValueToRValue:
8740ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall    return "LValueToRValue";
875f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  case CK_GetObjCProperty:
876f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    return "GetObjCProperty";
8772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NoOp:
878f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "NoOp";
8792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerived:
88011de6de25a0110cd7be97eef761ef3b189781da6Anders Carlsson    return "BaseToDerived";
8812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBase:
882f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "DerivedToBase";
8832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UncheckedDerivedToBase:
88423cba801e11b03929c44f8cf54578305963a3476John McCall    return "UncheckedDerivedToBase";
8852de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_Dynamic:
886f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "Dynamic";
8872de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToUnion:
888f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ToUnion";
8892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ArrayToPointerDecay:
890f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ArrayToPointerDecay";
8912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FunctionToPointerDecay:
892f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "FunctionToPointerDecay";
8932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NullToMemberPointer:
894f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "NullToMemberPointer";
895404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  case CK_NullToPointer:
896404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    return "NullToPointer";
8972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerivedMemberPointer:
898f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "BaseToDerivedMemberPointer";
8992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBaseMemberPointer:
9001a31a18db9d657751f38c724adc0d62e86852bd7Anders Carlsson    return "DerivedToBaseMemberPointer";
9012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UserDefinedConversion:
902f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "UserDefinedConversion";
9032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ConstructorConversion:
904f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ConstructorConversion";
9052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToPointer:
9067f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return "IntegralToPointer";
9072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_PointerToIntegral:
9087f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return "PointerToIntegral";
909daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_PointerToBoolean:
910daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "PointerToBoolean";
9112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToVoid:
912ebeaf2031c968143c531bfe232d7507f20c57347Anders Carlsson    return "ToVoid";
9132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_VectorSplat:
91416a8904f3f5ed19158657e1da95e5902fbee66f7Anders Carlsson    return "VectorSplat";
9152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralCast:
91682debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "IntegralCast";
917daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_IntegralToBoolean:
918daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "IntegralToBoolean";
9192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToFloating:
92082debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "IntegralToFloating";
9212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingToIntegral:
92282debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "FloatingToIntegral";
9232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingCast:
924c6b29163557d02da5d2a4a06f986f0480291f51fBenjamin Kramer    return "FloatingCast";
925daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_FloatingToBoolean:
926daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "FloatingToBoolean";
9272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_MemberPointerToBoolean:
928bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson    return "MemberPointerToBoolean";
9292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToObjCPointerCast:
9304cbf9d43cc47bb7a070c5c5026521d7d6a8f73c7Fariborz Jahanian    return "AnyPointerToObjCPointerCast";
9312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToBlockPointerCast:
9323b27f1a80e4e433b503efd344c909eeafaa9033cFariborz Jahanian    return "AnyPointerToBlockPointerCast";
9332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ObjCObjectLValueCast:
934569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    return "ObjCObjectLValueCast";
9352bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_FloatingRealToComplex:
9362bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "FloatingRealToComplex";
937f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToReal:
938f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToReal";
939f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToBoolean:
940f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToBoolean";
9412bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_FloatingComplexCast:
9422bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "FloatingComplexCast";
943f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToIntegralComplex:
944f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToIntegralComplex";
9452bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_IntegralRealToComplex:
9462bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "IntegralRealToComplex";
947f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToReal:
948f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToReal";
949f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToBoolean:
950f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToBoolean";
9512bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_IntegralComplexCast:
9522bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "IntegralComplexCast";
953f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToFloatingComplex:
954f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToFloatingComplex";
955f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  }
9561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9572bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  llvm_unreachable("Unhandled cast kind!");
958f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  return 0;
959f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson}
960f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson
9616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas GregorExpr *CastExpr::getSubExprAsWritten() {
9626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  Expr *SubExpr = 0;
9636eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  CastExpr *E = this;
9646eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  do {
9656eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    SubExpr = E->getSubExpr();
966c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // Skip any temporary bindings; they're implicit.
9686eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
9696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = Binder->getSubExpr();
970c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9716eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // Conversions by constructor and conversion functions have a
9726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // subexpression describing the call; strip it off.
9732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (E->getCastKind() == CK_ConstructorConversion)
9746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
9752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    else if (E->getCastKind() == CK_UserDefinedConversion)
9766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
977c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // If the subexpression we're left with is an implicit cast, look
9796eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // through that, too.
980c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
981c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
9826eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return SubExpr;
9836eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor}
9846eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
985f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXBaseSpecifier **CastExpr::path_buffer() {
986f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  switch (getStmtClass()) {
987f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define ABSTRACT_STMT(x)
988f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define CASTEXPR(Type, Base) \
989f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  case Stmt::Type##Class: \
990f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
991f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define STMT(Type, Base)
992f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#include "clang/AST/StmtNodes.inc"
993f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  default:
994f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    llvm_unreachable("non-cast expressions not possible here");
995f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return 0;
996f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  }
997f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
998f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
999f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallvoid CastExpr::setCastPath(const CXXCastPath &Path) {
1000f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(Path.size() == path_size());
1001f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
1002f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1003f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1004f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T,
1005f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                           CastKind Kind, Expr *Operand,
1006f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                           const CXXCastPath *BasePath,
10075baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                                           ExprValueKind VK) {
1008f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1009f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1010f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1011f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  ImplicitCastExpr *E =
10125baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
1013f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
1014f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
1015f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1016f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1017f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C,
1018f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                                unsigned PathSize) {
1019f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1020f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1021f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
1022f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1023f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1024f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1025f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T,
1026f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                       ExprValueKind VK, CastKind K, Expr *Op,
1027f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       const CXXCastPath *BasePath,
1028f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       TypeSourceInfo *WrittenTy,
1029f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       SourceLocation L, SourceLocation R) {
1030f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1031f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1032f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1033f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CStyleCastExpr *E =
1034f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
1035f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
1036f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
1037f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1038f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1039f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
1040f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1041f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1042f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
1043f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1044f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
10455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "<<=".
10475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BinaryOperator::getOpcodeStr(Opcode Op) {
10485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (Op) {
10492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemD:   return ".*";
10502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemI:   return "->*";
10512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:       return "*";
10522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Div:       return "/";
10532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Rem:       return "%";
10542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:       return "+";
10552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:       return "-";
10562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shl:       return "<<";
10572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shr:       return ">>";
10582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LT:        return "<";
10592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GT:        return ">";
10602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LE:        return "<=";
10612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GE:        return ">=";
10622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_EQ:        return "==";
10632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_NE:        return "!=";
10642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_And:       return "&";
10652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Xor:       return "^";
10662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Or:        return "|";
10672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LAnd:      return "&&";
10682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LOr:       return "||";
10692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Assign:    return "=";
10702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_MulAssign: return "*=";
10712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_DivAssign: return "/=";
10722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_RemAssign: return "%=";
10732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_AddAssign: return "+=";
10742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_SubAssign: return "-=";
10752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_ShlAssign: return "<<=";
10762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_ShrAssign: return ">>=";
10772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_AndAssign: return "&=";
10782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_XorAssign: return "^=";
10792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_OrAssign:  return "|=";
10802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Comma:     return ",";
10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1082baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor
1083baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor  return "";
10845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallBinaryOperatorKind
1087063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
1088063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  switch (OO) {
1089b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner  default: assert(false && "Not an overloadable binary operator");
10902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Plus: return BO_Add;
10912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Minus: return BO_Sub;
10922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Star: return BO_Mul;
10932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Slash: return BO_Div;
10942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Percent: return BO_Rem;
10952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Caret: return BO_Xor;
10962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Amp: return BO_And;
10972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Pipe: return BO_Or;
10982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Equal: return BO_Assign;
10992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Less: return BO_LT;
11002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Greater: return BO_GT;
11012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PlusEqual: return BO_AddAssign;
11022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_MinusEqual: return BO_SubAssign;
11032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_StarEqual: return BO_MulAssign;
11042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_SlashEqual: return BO_DivAssign;
11052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PercentEqual: return BO_RemAssign;
11062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_CaretEqual: return BO_XorAssign;
11072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_AmpEqual: return BO_AndAssign;
11082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PipeEqual: return BO_OrAssign;
11092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessLess: return BO_Shl;
11102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterGreater: return BO_Shr;
11112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessLessEqual: return BO_ShlAssign;
11122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterGreaterEqual: return BO_ShrAssign;
11132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_EqualEqual: return BO_EQ;
11142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_ExclaimEqual: return BO_NE;
11152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessEqual: return BO_LE;
11162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterEqual: return BO_GE;
11172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_AmpAmp: return BO_LAnd;
11182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PipePipe: return BO_LOr;
11192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Comma: return BO_Comma;
11202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_ArrowStar: return BO_PtrMemI;
1121063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  }
1122063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor}
1123063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
1124063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
1125063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  static const OverloadedOperatorKind OverOps[] = {
1126063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
1127063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Star, OO_Slash, OO_Percent,
1128063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Plus, OO_Minus,
1129063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_LessLess, OO_GreaterGreater,
1130063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
1131063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_EqualEqual, OO_ExclaimEqual,
1132063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Amp,
1133063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Caret,
1134063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Pipe,
1135063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_AmpAmp,
1136063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PipePipe,
1137063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Equal, OO_StarEqual,
1138063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_SlashEqual, OO_PercentEqual,
1139063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PlusEqual, OO_MinusEqual,
1140063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_LessLessEqual, OO_GreaterGreaterEqual,
1141063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_AmpEqual, OO_CaretEqual,
1142063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PipeEqual,
1143063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Comma
1144063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  };
1145063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  return OverOps[Opc];
1146063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor}
1147063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
1148709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekInitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
1149418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner                           Expr **initExprs, unsigned numInits,
11504c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor                           SourceLocation rbraceloc)
1151bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
1152bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         false),
1153709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs(C, numInits),
11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
1155c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    UnionFieldInit(0), HadArrayRangeDesignator(false)
1156c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt{
1157ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  for (unsigned I = 0; I != numInits; ++I) {
1158ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    if (initExprs[I]->isTypeDependent())
11598e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      ExprBits.TypeDependent = true;
1160ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    if (initExprs[I]->isValueDependent())
11618e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      ExprBits.ValueDependent = true;
1162bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (initExprs[I]->containsUnexpandedParameterPack())
1163bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
116473460a32bc5299a5927d23d2e464d72af796eabfDouglas Gregor  }
1165c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1166709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
116766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
11685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1169709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
1170ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  if (NumInits > InitExprs.size())
1171709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs.reserve(C, NumInits);
1172fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor}
1173fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor
1174709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
1175709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitExprs.resize(C, NumInits, 0);
11764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor}
11774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
1178709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekExpr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
1179ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  if (Init >= InitExprs.size()) {
1180709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
1181ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    InitExprs.back() = expr;
1182ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    return 0;
11834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
11864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  InitExprs[Init] = expr;
11874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  return Result;
11884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor}
11894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
1190c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted KremenekSourceRange InitListExpr::getSourceRange() const {
1191c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (SyntacticForm)
1192c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    return SyntacticForm->getSourceRange();
1193c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  SourceLocation Beg = LBraceLoc, End = RBraceLoc;
1194c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (Beg.isInvalid()) {
1195c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    // Find the first non-null initializer.
1196c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    for (InitExprsTy::const_iterator I = InitExprs.begin(),
1197c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek                                     E = InitExprs.end();
1198c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      I != E; ++I) {
1199c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      if (Stmt *S = *I) {
1200c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        Beg = S->getLocStart();
1201c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        break;
1202c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      }
1203c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    }
1204c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  }
1205c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (End.isInvalid()) {
1206c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    // Find the first non-null initializer from the end.
1207c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(),
1208c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek                                             E = InitExprs.rend();
1209c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      I != E; ++I) {
1210c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      if (Stmt *S = *I) {
1211c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        End = S->getSourceRange().getEnd();
1212c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        break;
1213c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      }
1214c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    }
1215c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  }
1216c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  return SourceRange(Beg, End);
1217c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek}
1218c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek
1219bfdcae678d44906293e21c0cddc6537f3ee8b5a4Steve Naroff/// getFunctionType - Return the underlying function type for this block.
12204eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff///
12214eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffconst FunctionType *BlockExpr::getFunctionType() const {
12226217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  return getType()->getAs<BlockPointerType>()->
1223183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall                    getPointeeType()->getAs<FunctionType>();
12244eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
12254eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
12261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSourceLocation BlockExpr::getCaretLocation() const {
12271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return TheBlock->getCaretLocation();
122856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
12291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst Stmt *BlockExpr::getBody() const {
12307297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor  return TheBlock->getBody();
12317297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor}
12321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt *BlockExpr::getBody() {
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return TheBlock->getBody();
12347297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor}
123556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
123656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
12375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
12385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Generic Expression Routines
12395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
12405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1241026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// isUnusedResultAWarning - Return true if this immediate expression should
1242026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// be warned about if the result is unused.  If so, fill in Loc and Ranges
1243026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// with location to warn on and the source range[s] to report with the
1244026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// warning.
1245026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
1246df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                  SourceRange &R2, ASTContext &Ctx) const {
1247ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  // Don't warn if the expr is type dependent. The type could end up
1248ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  // instantiating to void.
1249ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  if (isTypeDependent())
1250ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson    return false;
12511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (getStmtClass()) {
12535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
12540faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
12550faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
1256026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = getExprLoc();
1257026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = getSourceRange();
1258026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
12595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ParenExprClass:
1260026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return cast<ParenExpr>(this)->getSubExpr()->
1261df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      isUnusedResultAWarning(Loc, R1, R2, Ctx);
12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UnaryOperatorClass: {
12635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const UnaryOperator *UO = cast<UnaryOperator>(this);
12641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    switch (UO->getOpcode()) {
1266026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    default: break;
12672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostInc:
12682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostDec:
12692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreInc:
12702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreDec:                 // ++/--
1271026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;  // Not a warning.
12722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Deref:
12735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // Dereferencing a volatile pointer is a side-effect.
1274df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1275026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner        return false;
1276026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      break;
12772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
12782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
12795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // accessing a piece of a volatile complex is a side-effect.
1280df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
1281df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump          .isVolatileQualified())
1282026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner        return false;
1283026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      break;
12842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
1285df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
12865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1287026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = UO->getOperatorLoc();
1288026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = UO->getSubExpr()->getSourceRange();
1289026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
12905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1291e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner  case BinaryOperatorClass: {
1292026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    const BinaryOperator *BO = cast<BinaryOperator>(this);
1293c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek    switch (BO->getOpcode()) {
1294c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek      default:
1295c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        break;
129625973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Consider the RHS of comma for side effects. LHS was checked by
129725973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Sema::CheckCommaOperands.
12982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_Comma:
1299c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        // ((foo = <blah>), 0) is an idiom for hiding the result (and
1300c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        // lvalue-ness) of an assignment written in a macro.
1301c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        if (IntegerLiteral *IE =
1302c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek              dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
1303c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek          if (IE->getValue() == 0)
1304c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek            return false;
130525973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
130625973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Consider '||', '&&' to have side effects if the LHS or RHS does.
13072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_LAnd:
13082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_LOr:
130925973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
131025973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis            !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
131125973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis          return false;
131225973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        break;
1313bf0ee354163f87623a4b60412544243911332343John McCall    }
1314026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    if (BO->isAssignmentOp())
1315026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1316026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = BO->getOperatorLoc();
1317026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = BO->getLHS()->getSourceRange();
1318026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = BO->getRHS()->getSourceRange();
1319026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1320e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner  }
1321eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  case CompoundAssignOperatorClass:
1322c6dfe194f623b02c123759f235b504d4850fc178Douglas Gregor  case VAArgExprClass:
1323026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
13245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1325ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian  case ConditionalOperatorClass: {
1326026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // The condition must be evaluated, but if either the LHS or RHS is a
1327026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // warning, warn about them.
1328ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
13291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (Exp->getLHS() &&
1330df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump        Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1331026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return true;
1332df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1333ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian  }
1334ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian
13355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case MemberExprClass:
1336026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // If the base pointer or element is to a volatile pointer/field, accessing
1337026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // it is a side effect.
1338df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1339026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1340026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<MemberExpr>(this)->getMemberLoc();
1341026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = SourceRange(Loc, Loc);
1342026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1343026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ArraySubscriptExprClass:
13465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // If the base pointer or element is to a volatile pointer/field, accessing
1347026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // it is a side effect.
1348df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1349026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1350026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1351026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1352026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1353026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1354211f6adf1301a1461015fb6cb08a05f0a35b65f3Eli Friedman
13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case CallExprClass:
1356852871abbff45f1c1d3787755a27fce08365b166Eli Friedman  case CXXOperatorCallExprClass:
1357852871abbff45f1c1d3787755a27fce08365b166Eli Friedman  case CXXMemberCallExprClass: {
1358026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // If this is a direct call, get the callee.
1359026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    const CallExpr *CE = cast<CallExpr>(this);
1360d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes    if (const Decl *FD = CE->getCalleeDecl()) {
1361026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      // If the callee has attribute pure, const, or warn_unused_result, warn
1362026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      // about it. void foo() { strlen("bar"); } should warn.
1363bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      //
1364bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1365bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      // updated to match for QoI.
1366bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      if (FD->getAttr<WarnUnusedResultAttr>() ||
1367bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner          FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1368bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        Loc = CE->getCallee()->getLocStart();
1369bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        R1 = CE->getCallee()->getSourceRange();
1370bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner
1371bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        if (unsigned NumArgs = CE->getNumArgs())
1372bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner          R2 = SourceRange(CE->getArg(0)->getLocStart(),
1373bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner                           CE->getArg(NumArgs-1)->getLocEnd());
1374bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        return true;
1375bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      }
1376026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    }
1377026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
1378026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  }
137958beed91d468863b8c85bce43425422703838d27Anders Carlsson
138058beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXTemporaryObjectExprClass:
138158beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXConstructExprClass:
138258beed91d468863b8c85bce43425422703838d27Anders Carlsson    return false;
138358beed91d468863b8c85bce43425422703838d27Anders Carlsson
1384f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian  case ObjCMessageExprClass: {
1385f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1386f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    const ObjCMethodDecl *MD = ME->getMethodDecl();
1387f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1388f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian      Loc = getExprLoc();
1389f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian      return true;
1390f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    }
1391026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
1392f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian  }
13931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case ObjCPropertyRefExprClass:
13955e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner    Loc = getExprLoc();
13965e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner    R1 = getSourceRange();
1397a50089ec68a583d13718107c1b0c898f0903709eChris Lattner    return true;
139812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall
1399611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner  case StmtExprClass: {
1400611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // Statement exprs don't logically have side effects themselves, but are
1401611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // sometimes used in macros in ways that give them a type that is unused.
1402611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1403611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // however, if the result of the stmt expr is dead, we don't want to emit a
1404611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // warning.
1405611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1406d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis    if (!CS->body_empty()) {
1407611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner      if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1408df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump        return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1409d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis      if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
1410d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis        if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
1411d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis          return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1412d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis    }
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14140faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
14150faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
1416026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<StmtExpr>(this)->getLParenLoc();
1417026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = getSourceRange();
1418026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1419611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner  }
14206eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor  case CStyleCastExprClass:
1421fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner    // If this is an explicit cast to void, allow it.  People do this when they
1422fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner    // think they know what they're doing :).
1423026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    if (getType()->isVoidType())
1424fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner      return false;
1425026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<CStyleCastExpr>(this)->getLParenLoc();
1426026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
1427026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
142858beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXFunctionalCastExprClass: {
14290faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
14300faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
143158beed91d468863b8c85bce43425422703838d27Anders Carlsson    const CastExpr *CE = cast<CastExpr>(this);
1432c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
143358beed91d468863b8c85bce43425422703838d27Anders Carlsson    // If this is a cast to void or a constructor conversion, check the operand.
143458beed91d468863b8c85bce43425422703838d27Anders Carlsson    // Otherwise, the result of the cast is unused.
14352de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (CE->getCastKind() == CK_ToVoid ||
14362de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        CE->getCastKind() == CK_ConstructorConversion)
1437df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      return (cast<CastExpr>(this)->getSubExpr()
1438df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump              ->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1439026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc();
1440026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange();
1441026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
144258beed91d468863b8c85bce43425422703838d27Anders Carlsson  }
14431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14444be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman  case ImplicitCastExprClass:
14454be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman    // Check the operand, since implicit casts are inserted by Sema
1446df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<ImplicitCastExpr>(this)
1447df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
14484be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman
144904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  case CXXDefaultArgExprClass:
1450df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<CXXDefaultArgExpr>(this)
1451df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
14524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
14534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  case CXXNewExprClass:
14544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    // FIXME: In theory, there might be new expressions that don't have side
14554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    // effects (e.g. a placement new with an uninitialized POD).
14564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  case CXXDeleteExprClass:
1457026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
14582d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  case CXXBindTemporaryExprClass:
1459df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<CXXBindTemporaryExpr>(this)
1460df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
14614765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case ExprWithCleanupsClass:
14624765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall    return (cast<ExprWithCleanups>(this)
1463df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
14644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
14655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
14665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
146744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian/// isOBJCGCCandidate - Check if an expression is objc gc'able.
14687f4f86a2167abc116275e49c81350fc3225485e5Fariborz Jahanian/// returns true, if it is; false otherwise.
1469102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanianbool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
147044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  switch (getStmtClass()) {
147144baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  default:
147244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return false;
147344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ObjCIvarRefExprClass:
147444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return true;
1475207c5210eb0ac7b632609f0c006eb97ef2738948Fariborz Jahanian  case Expr::UnaryOperatorClass:
1476102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
147744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ParenExprClass:
1478102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
147944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ImplicitCastExprClass:
1480102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
148106b89124a9a5971a0528cc9da6817740bac43164Fariborz Jahanian  case CStyleCastExprClass:
1482102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1483a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  case DeclRefExprClass: {
148444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    const Decl *D = cast<DeclRefExpr>(this)->getDecl();
1485102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1486102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian      if (VD->hasGlobalStorage())
1487102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian        return true;
1488102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian      QualType T = VD->getType();
148959a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian      // dereferencing to a  pointer is always a gc'able candidate,
149059a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian      // unless it is __weak.
14917e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar      return T->isPointerType() &&
14920953e767ff7817f97b3ab20896b229891eeff45bJohn McCall             (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1493102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    }
149444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return false;
149544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
149683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  case MemberExprClass: {
149744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    const MemberExpr *M = cast<MemberExpr>(this);
1498102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return M->getBase()->isOBJCGCCandidate(Ctx);
149944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
150044baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ArraySubscriptExprClass:
1501102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx);
150244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
150344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian}
1504369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
150511ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidisbool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
150611ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis  if (isTypeDependent())
150711ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis    return false;
15087eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
150911ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis}
151011ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis
1511369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1,
1512369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                          Expr::CanThrowResult CT2) {
1513369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // CanThrowResult constants are ordered so that the maximum is the correct
1514369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // merge result.
1515369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return CT1 > CT2 ? CT1 : CT2;
1516369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1517369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1518369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) {
1519369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr *E = const_cast<Expr*>(CE);
1520369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr::CanThrowResult R = Expr::CT_Cannot;
1521369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  for (Expr::child_iterator I = E->child_begin(), IE = E->child_end();
1522369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl       I != IE && R != Expr::CT_Can; ++I) {
1523369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C));
1524369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1525369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return R;
1526369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1527369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1528369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanCalleeThrow(const Decl *D,
1529369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                           bool NullThrows = true) {
1530369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!D)
1531369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return NullThrows ? Expr::CT_Can : Expr::CT_Cannot;
1532369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1533369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // See if we can get a function type from the decl somehow.
1534369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const ValueDecl *VD = dyn_cast<ValueDecl>(D);
1535369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!VD) // If we have no clue what we're calling, assume the worst.
1536369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Can;
1537369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
15385221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  // As an extension, we assume that __attribute__((nothrow)) functions don't
15395221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  // throw.
15405221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
15415221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl    return Expr::CT_Cannot;
15425221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl
1543369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  QualType T = VD->getType();
1544369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const FunctionProtoType *FT;
1545369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if ((FT = T->getAs<FunctionProtoType>())) {
1546369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  } else if (const PointerType *PT = T->getAs<PointerType>())
1547369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = PT->getPointeeType()->getAs<FunctionProtoType>();
1548369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
1549369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = RT->getPointeeType()->getAs<FunctionProtoType>();
1550369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const MemberPointerType *MT = T->getAs<MemberPointerType>())
1551369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = MT->getPointeeType()->getAs<FunctionProtoType>();
1552369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const BlockPointerType *BT = T->getAs<BlockPointerType>())
1553369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = BT->getPointeeType()->getAs<FunctionProtoType>();
1554369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1555369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!FT)
1556369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Can;
1557369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1558369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return FT->hasEmptyExceptionSpec() ? Expr::CT_Cannot : Expr::CT_Can;
1559369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1560369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1561369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) {
1562369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (DC->isTypeDependent())
1563369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Dependent;
1564369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1565295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  if (!DC->getTypeAsWritten()->isReferenceType())
1566295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl    return Expr::CT_Cannot;
1567295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
1568369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot;
1569369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1570369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1571369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanTypeidThrow(ASTContext &C,
1572369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                           const CXXTypeidExpr *DC) {
1573369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (DC->isTypeOperand())
1574369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1575369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1576369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr *Op = DC->getExprOperand();
1577369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (Op->isTypeDependent())
1578369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Dependent;
1579369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1580369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const RecordType *RT = Op->getType()->getAs<RecordType>();
1581369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!RT)
1582369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1583369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1584369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic())
1585369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1586369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1587369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (Op->Classify(C).isPRValue())
1588369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1589369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1590369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return Expr::CT_Can;
1591369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1592369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1593369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian RedlExpr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
1594369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // C++ [expr.unary.noexcept]p3:
1595369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  //   [Can throw] if in a potentially-evaluated context the expression would
1596369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  //   contain:
1597369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  switch (getStmtClass()) {
1598369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXThrowExprClass:
1599369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated throw-expression
1600369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1601369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1602369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDynamicCastExprClass: {
1603369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1604369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     where T is a reference type, that requires a run-time check
1605369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this));
1606369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1607369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1608369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1609369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1610369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1611369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXTypeidExprClass:
1612369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated typeid expression applied to a glvalue
1613369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     expression whose type is a polymorphic class type
1614369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CanTypeidThrow(C, cast<CXXTypeidExpr>(this));
1615369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1616369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated call to a function, member function, function
1617369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     pointer, or member function pointer that does not have a non-throwing
1618369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     exception-specification
1619369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CallExprClass:
1620369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXOperatorCallExprClass:
1621369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXMemberCallExprClass: {
1622369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = CanCalleeThrow(cast<CallExpr>(this)->getCalleeDecl());
1623369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1624369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1625369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1626369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1627369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1628295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  case CXXConstructExprClass:
1629295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  case CXXTemporaryObjectExprClass: {
1630369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = CanCalleeThrow(
1631369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl        cast<CXXConstructExpr>(this)->getConstructor());
1632369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1633369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1634369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1635369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1636369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1637369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXNewExprClass: {
1638369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = MergeCanThrow(
1639369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl        CanCalleeThrow(cast<CXXNewExpr>(this)->getOperatorNew()),
1640369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl        CanCalleeThrow(cast<CXXNewExpr>(this)->getConstructor(),
1641369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                       /*NullThrows*/false));
1642369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1643369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1644369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1645369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1646369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1647369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDeleteExprClass: {
1648369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = CanCalleeThrow(
1649369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl        cast<CXXDeleteExpr>(this)->getOperatorDelete());
1650369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1651369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
16520b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    const Expr *Arg = cast<CXXDeleteExpr>(this)->getArgument();
16530b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    // Unwrap exactly one implicit cast, which converts all pointers to void*.
16540b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    if (const ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg))
16550b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      Arg = Cast->getSubExpr();
16560b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    if (const PointerType *PT = Arg->getType()->getAs<PointerType>()) {
16570b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) {
16580b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl        CanThrowResult CT2 = CanCalleeThrow(
16590b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl            cast<CXXRecordDecl>(RT->getDecl())->getDestructor());
16600b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl        if (CT2 == CT_Can)
16610b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl          return CT2;
16620b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl        CT = MergeCanThrow(CT, CT2);
16630b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      }
16640b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    }
16650b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
16660b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  }
16670b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl
16680b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  case CXXBindTemporaryExprClass: {
16690b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    // The bound temporary has to be destroyed again, which might throw.
16700b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    CanThrowResult CT = CanCalleeThrow(
16710b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor());
16720b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    if (CT == CT_Can)
16730b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      return CT;
1674369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1675369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1676369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1677369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // ObjC message sends are like function calls, but never have exception
1678369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // specs.
1679369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCMessageExprClass:
1680369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCPropertyRefExprClass:
1681369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1682369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1683369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Many other things have subexpressions, so we have to test those.
1684369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some are simple:
1685369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ParenExprClass:
1686369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case MemberExprClass:
1687369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXReinterpretCastExprClass:
1688369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXConstCastExprClass:
1689369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ConditionalOperatorClass:
1690369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CompoundLiteralExprClass:
1691369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ExtVectorElementExprClass:
1692369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case InitListExprClass:
1693369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case DesignatedInitExprClass:
1694369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ParenListExprClass:
1695369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case VAArgExprClass:
1696369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDefaultArgExprClass:
16974765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case ExprWithCleanupsClass:
1698369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCIvarRefExprClass:
1699369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCIsaExprClass:
1700369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ShuffleVectorExprClass:
1701369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CanSubExprsThrow(C, this);
1702369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1703369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some might be dependent for other reasons.
1704369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case UnaryOperatorClass:
1705369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ArraySubscriptExprClass:
1706369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ImplicitCastExprClass:
1707369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CStyleCastExprClass:
1708369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXStaticCastExprClass:
1709369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXFunctionalCastExprClass:
1710369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case BinaryOperatorClass:
1711369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CompoundAssignOperatorClass: {
1712369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot;
1713369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1714369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1715369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1716369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms.
1717369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case StmtExprClass:
1718369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1719369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1720369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ChooseExprClass:
1721369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (isTypeDependent() || isValueDependent())
1722369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT_Dependent;
1723369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C);
1724369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1725369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some expressions are always dependent.
1726369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case DependentScopeDeclRefExprClass:
1727369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXUnresolvedConstructExprClass:
1728369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDependentScopeMemberExprClass:
1729369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Dependent;
1730369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1731369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  default:
1732369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // All other expressions don't have subexpressions, or else they are
1733369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // unevaluated.
1734369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Cannot;
1735369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1736369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1737369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
17384e99a5fc3b203397a91136c6e695e405fb8fc606Ted KremenekExpr* Expr::IgnoreParens() {
17394e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  Expr* E = this;
1740b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara  while (true) {
1741b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1742b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      E = P->getSubExpr();
1743b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1744b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1745b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1746b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1747b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1748b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1749b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1750b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1751b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
1752b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara  }
17534e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek}
17544e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek
175556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
175656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// or CastExprs or ImplicitCastExprs, returning their operand.
175756f349400c5932a196509c0480ff6f99a9a0b48fChris LattnerExpr *Expr::IgnoreParenCasts() {
175856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  Expr *E = this;
175956f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  while (true) {
1760b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
176156f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner      E = P->getSubExpr();
1762b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1763b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1764b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
176556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner      E = P->getSubExpr();
1766b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1767b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1768b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1769b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1770b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1771b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1772b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1773b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1774b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
177556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  }
177656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner}
177756f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner
17789c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue
17799c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts.  This is intended purely as a temporary workaround for code
17809c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// that hasn't yet been rewritten to do the right thing about those
17819c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts, and may disappear along with the last internal use.
1782f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallExpr *Expr::IgnoreParenLValueCasts() {
1783f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  Expr *E = this;
17849c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall  while (true) {
1785f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1786f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      E = P->getSubExpr();
1787f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      continue;
17889c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall    } else if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1789f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      if (P->getCastKind() == CK_LValueToRValue) {
1790f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        E = P->getSubExpr();
1791f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        continue;
1792f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      }
17939c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall    } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
17949c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall      if (P->getOpcode() == UO_Extension) {
17959c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall        E = P->getSubExpr();
17969c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall        continue;
17979c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall      }
1798f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    }
1799f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    break;
1800f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  }
1801f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  return E;
1802f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall}
1803f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
18042fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCallExpr *Expr::IgnoreParenImpCasts() {
18052fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  Expr *E = this;
18062fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  while (true) {
1807b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
18082fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall      E = P->getSubExpr();
1809b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1810b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1811b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) {
18122fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall      E = P->getSubExpr();
1813b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1814b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1815b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1816b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1817b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1818b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1819b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1820b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1821b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
18222fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  }
18232fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall}
18242fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall
1825ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
1826ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// value (including ptr->int casts of the same size).  Strip off any
1827ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// ParenExpr or CastExprs, returning their operand.
1828ecdd84147c0765caa999ddc22dde25b42712bb4dChris LattnerExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
1829ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  Expr *E = this;
1830ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  while (true) {
1831ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1832ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      E = P->getSubExpr();
1833ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      continue;
1834ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    }
18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1836ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1837ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      // We ignore integer <-> casts that are of the same width, ptr<->ptr and
18382ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor      // ptr<->int casts of the same width.  We also ignore all identity casts.
1839ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      Expr *SE = P->getSubExpr();
18401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1841ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
1842ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        E = SE;
1843ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        continue;
1844ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      }
18451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1846b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if ((E->getType()->isPointerType() ||
18479d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor           E->getType()->isIntegralType(Ctx)) &&
1848b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara          (SE->getType()->isPointerType() ||
18499d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor           SE->getType()->isIntegralType(Ctx)) &&
1850ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner          Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
1851ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        E = SE;
1852ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        continue;
1853ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      }
1854ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    }
18551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1856b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1857b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1858b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1859b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1860b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1861b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1862b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara
1863ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    return E;
1864ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  }
1865ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner}
1866ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
18676eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregorbool Expr::isDefaultArgument() const {
18686eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  const Expr *E = this;
18696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
18706eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    E = ICE->getSubExprAsWritten();
1871c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
18726eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return isa<CXXDefaultArgExpr>(E);
18736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor}
1874ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
18752f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// \brief Skip over any no-op casts and any temporary-binding
18762f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// expressions.
1877f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlssonstatic const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
18782f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
18792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (ICE->getCastKind() == CK_NoOp)
18802f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      E = ICE->getSubExpr();
18812f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    else
18822f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      break;
18832f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
18842f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
18852f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
18862f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    E = BE->getSubExpr();
18872f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
18882f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
18892de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (ICE->getCastKind() == CK_NoOp)
18902f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      E = ICE->getSubExpr();
18912f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    else
18922f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      break;
18932f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
1894f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson
1895f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson  return E->IgnoreParens();
18962f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor}
18972f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
1898558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// isTemporaryObject - Determines if this expression produces a
1899558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// temporary of the given class type.
1900558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallbool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
1901558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
1902558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    return false;
19032f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
1904f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson  const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
19052f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
190658277b57f9492d0234748be89bcad48b322c5cf7John McCall  // Temporaries are by definition pr-values of class type.
1907db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian  if (!E->Classify(C).isPRValue()) {
1908db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian    // In this context, property reference is a message call and is pr-value.
190912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    if (!isa<ObjCPropertyRefExpr>(E))
1910db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian      return false;
1911db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian  }
19122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
191319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // Black-list a few cases which yield pr-values of class type that don't
191419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // refer to temporaries of that type:
191519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
191619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // - implicit derived-to-base conversions
1917558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  if (isa<ImplicitCastExpr>(E)) {
1918558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
1919558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    case CK_DerivedToBase:
1920558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    case CK_UncheckedDerivedToBase:
1921558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return false;
1922558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    default:
1923558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      break;
1924558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    }
19252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
19262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
192719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // - member expressions (all)
192819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  if (isa<MemberExpr>(E))
192919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    return false;
193019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
1931558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  return true;
19322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor}
19332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
1934898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyTypeDependentArguments - Determines if any of the expressions
1935898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is type-dependent.
1936898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) {
1937898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  for (unsigned I = 0; I < NumExprs; ++I)
1938898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    if (Exprs[I]->isTypeDependent())
1939898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      return true;
1940898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1941898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  return false;
1942898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
1943898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1944898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyValueDependentArguments - Determines if any of the expressions
1945898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is value-dependent.
1946898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
1947898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  for (unsigned I = 0; I < NumExprs; ++I)
1948898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    if (Exprs[I]->isValueDependent())
1949898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      return true;
1950898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1951898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  return false;
1952898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
1953898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
19544204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCallbool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
1955c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // This function is attempting whether an expression is an initializer
1956c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // which can be evaluated at compile-time.  isEvaluatable handles most
1957c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // of the cases, but it can't deal with some initializer-specific
1958c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // expressions, and it can't deal with aggregates; we deal with those here,
1959c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // and fall back to isEvaluatable for the other cases.
1960c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman
19614204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  // If we ever capture reference-binding directly in the AST, we can
19624204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  // kill the second parameter.
19634204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
19644204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  if (IsForRef) {
19654204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    EvalResult Result;
19664204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects;
19674204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  }
19681f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman
1969e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  switch (getStmtClass()) {
1970c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  default: break;
1971e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  case StringLiteralClass:
197214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  case ObjCStringLiteralClass:
1973eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  case ObjCEncodeExprClass:
1974e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    return true;
1975b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXTemporaryObjectExprClass:
1976b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXConstructExprClass: {
1977b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall    const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
19784204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
19794204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // Only if it's
19804204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // 1) an application of the trivial default constructor or
1981b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall    if (!CE->getConstructor()->isTrivial()) return false;
19824204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    if (!CE->getNumArgs()) return true;
19834204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
19844204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // 2) an elidable trivial copy construction of an operand which is
19854204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    //    itself a constant initializer.  Note that we consider the
19864204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    //    operand on its own, *not* as a reference binding.
19874204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return CE->isElidable() &&
19884204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall           CE->getArg(0)->isConstantInitializer(Ctx, false);
1989b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  }
199059b5da6d853b4368b984700315adf7b37de05764Nate Begeman  case CompoundLiteralExprClass: {
19911f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // This handles gcc's extension that allows global initializers like
19921f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // "struct x {int x;} x = (struct x) {};".
19931f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This accepts other cases it shouldn't!
199459b5da6d853b4368b984700315adf7b37de05764Nate Begeman    const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
19954204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return Exp->isConstantInitializer(Ctx, false);
199659b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
1997e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  case InitListExprClass: {
19981f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This doesn't deal with fields with reference types correctly.
19991f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This incorrectly allows pointers cast to integers to be assigned
20001f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // to bitfields.
2001e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    const InitListExpr *Exp = cast<InitListExpr>(this);
2002e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    unsigned numInits = Exp->getNumInits();
2003e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    for (unsigned i = 0; i < numInits; i++) {
20044204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      if (!Exp->getInit(i)->isConstantInitializer(Ctx, false))
2005e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson        return false;
2006e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    }
2007c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    return true;
2008e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  }
20093498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  case ImplicitValueInitExprClass:
20103498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor    return true;
20113ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  case ParenExprClass:
20124204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return cast<ParenExpr>(this)->getSubExpr()
20134204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      ->isConstantInitializer(Ctx, IsForRef);
20145cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara  case ChooseExprClass:
20155cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
20165cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara      ->isConstantInitializer(Ctx, IsForRef);
2017c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  case UnaryOperatorClass: {
2018c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    const UnaryOperator* Exp = cast<UnaryOperator>(this);
20192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (Exp->getOpcode() == UO_Extension)
20204204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return Exp->getSubExpr()->isConstantInitializer(Ctx, false);
2021c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    break;
2022c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  }
20233ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  case BinaryOperatorClass: {
20243ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    // Special case &&foo - &&bar.  It would be nice to generalize this somehow
20253ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    // but this handles the common case.
20263ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    const BinaryOperator *Exp = cast<BinaryOperator>(this);
20272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (Exp->getOpcode() == BO_Sub &&
20283ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner        isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) &&
20293ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner        isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx)))
20303ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner      return true;
20313ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    break;
20323ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  }
20334204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  case CXXFunctionalCastExprClass:
2034b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXStaticCastExprClass:
203581045d8dcd967def69d8e0945566214a9fe9ffccChris Lattner  case ImplicitCastExprClass:
2036c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  case CStyleCastExprClass:
2037c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // Handle casts with a destination that's a struct or union; this
2038c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // deals with both the gcc no-op struct cast extension and the
2039c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // cast-to-union extension.
2040c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    if (getType()->isRecordType())
20414204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return cast<CastExpr>(this)->getSubExpr()
20424204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall        ->isConstantInitializer(Ctx, false);
2043c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2044430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    // Integer->integer casts can be handled here, which is important for
2045430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    // things like (int)(&&x-&&y).  Scary but true.
2046430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    if (getType()->isIntegerType() &&
2047430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner        cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType())
20484204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return cast<CastExpr>(this)->getSubExpr()
20494204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall        ->isConstantInitializer(Ctx, false);
2050c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2051c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    break;
2052e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  }
2053c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  return isEvaluatable(Ctx);
205438374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff}
205538374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff
20565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isNullPointerConstant - C99 6.3.2.3p3 -  Return true if this is either an
20575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// integer constant expression with the value zero, or if this is one that is
20585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// cast to void*.
2059ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregorbool Expr::isNullPointerConstant(ASTContext &Ctx,
2060ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor                                 NullPointerConstantValueDependence NPC) const {
2061ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  if (isValueDependent()) {
2062ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    switch (NPC) {
2063ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_NeverValueDependent:
2064ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      assert(false && "Unexpected value dependent expression!");
2065ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      // If the unthinkable happens, fall through to the safest alternative.
2066c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2067ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_ValueDependentIsNull:
20689d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor      return isTypeDependent() || getType()->isIntegralType(Ctx);
2069c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2070ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_ValueDependentIsNotNull:
2071ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      return false;
2072ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    }
2073ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  }
2074f515b2268f829adfbfdb751f54d102b53ed0285cDaniel Dunbar
20750777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // Strip off a cast to void*, if it exists. Except in C++.
20760835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
20776215dee86c0e715b9f2b0d401ab2a5fcf629f1afSebastian Redl    if (!Ctx.getLangOptions().CPlusPlus) {
20780777972d38a3125efed962b045704c30ae6965cfSebastian Redl      // Check that it is a cast to void*.
20796217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
20800777972d38a3125efed962b045704c30ae6965cfSebastian Redl        QualType Pointee = PT->getPointeeType();
20810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        if (!Pointee.hasQualifiers() &&
20820777972d38a3125efed962b045704c30ae6965cfSebastian Redl            Pointee->isVoidType() &&                              // to void*
20830777972d38a3125efed962b045704c30ae6965cfSebastian Redl            CE->getSubExpr()->getType()->isIntegerType())         // from int.
2084ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor          return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
20850777972d38a3125efed962b045704c30ae6965cfSebastian Redl      }
20865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2087aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
2088aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // Ignore the ImplicitCastExpr type entirely.
2089ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2090aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
2091aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // Accept ((void*)0) as a null pointer constant, as many other
2092aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // implementations do.
2093ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
20941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  } else if (const CXXDefaultArgExpr *DefaultArg
20958123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner               = dyn_cast<CXXDefaultArgExpr>(this)) {
209604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    // See through default argument expressions
2097ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
20982d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  } else if (isa<GNUNullExpr>(this)) {
20992d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor    // The GNU __null extension is always a null pointer constant.
21002d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor    return true;
2101aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  }
21022d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
21036e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // C++0x nullptr_t is always a null pointer constant.
21046e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  if (getType()->isNullPtrType())
21056e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl    return true;
21066e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
2107ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian  if (const RecordType *UT = getType()->getAsUnionType())
2108ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian    if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
2109ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian      if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
2110ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian        const Expr *InitExpr = CLE->getInitializer();
2111ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian        if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
2112ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian          return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
2113ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian      }
2114aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  // This expression must be an integer type.
2115c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (!getType()->isIntegerType() ||
211656fc0d18caf9c829647a5e3ce35197f0d7e0feeeFariborz Jahanian      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
2117aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    return false;
21181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
21195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If we have an integer constant expression, we need to *evaluate* it and
21205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // test for the value 0.
212109de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman  llvm::APSInt Result;
212209de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman  return isIntegerConstantExpr(Result, Ctx) && Result == 0;
21235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
212431a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff
2125f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// \brief If this expression is an l-value for an Objective C
2126f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// property, find the underlying property reference expression.
2127f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallconst ObjCPropertyRefExpr *Expr::getObjCProperty() const {
2128f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  const Expr *E = this;
2129f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  while (true) {
2130f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    assert((E->getValueKind() == VK_LValue &&
2131f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall            E->getObjectKind() == OK_ObjCProperty) &&
2132f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall           "expression is not a property reference");
2133f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    E = E->IgnoreParenCasts();
2134f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
2135f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      if (BO->getOpcode() == BO_Comma) {
2136f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        E = BO->getRHS();
2137f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        continue;
2138f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      }
2139f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    }
2140f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
2141f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    break;
2142f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  }
2143f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
2144f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  return cast<ObjCPropertyRefExpr>(E);
2145f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall}
2146f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
214733bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas GregorFieldDecl *Expr::getBitField() {
21486f4a69a3107e7ff1569c747f7c6bdf7cff8cbf55Douglas Gregor  Expr *E = this->IgnoreParens();
214933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
2150de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor  while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2151f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (ICE->getCastKind() == CK_LValueToRValue ||
2152f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp))
2153de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor      E = ICE->getSubExpr()->IgnoreParens();
2154de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor    else
2155de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor      break;
2156de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor  }
2157de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor
215827c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor  if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
215986f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
216033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor      if (Field->isBitField())
216133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor        return Field;
216233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
21630f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis  if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E))
21640f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis    if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
21650f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis      if (Field->isBitField())
21660f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis        return Field;
21670f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis
216833bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
216933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor    if (BinOp->isAssignmentOp() && BinOp->getLHS())
217033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor      return BinOp->getLHS()->getBitField();
217133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
217233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  return 0;
217327c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor}
217427c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor
2175093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlssonbool Expr::refersToVectorElement() const {
2176093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  const Expr *E = this->IgnoreParens();
2177c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2178093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
21795baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    if (ICE->getValueKind() != VK_RValue &&
21802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        ICE->getCastKind() == CK_NoOp)
2181093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson      E = ICE->getSubExpr()->IgnoreParens();
2182093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    else
2183093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson      break;
2184093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  }
2185c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2186093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
2187093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    return ASE->getBase()->getType()->isVectorType();
2188093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
2189093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  if (isa<ExtVectorElementExpr>(E))
2190093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    return true;
2191093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
2192093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  return false;
2193093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson}
2194093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
21952140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// isArrow - Return true if the base expression is a pointer to vector,
21962140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// return false if the base expression is a vector.
21972140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattnerbool ExtVectorElementExpr::isArrow() const {
21982140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner  return getBase()->getType()->isPointerType();
21992140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner}
22002140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner
2201213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanunsigned ExtVectorElementExpr::getNumElements() const {
2202183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const VectorType *VT = getType()->getAs<VectorType>())
22038a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    return VT->getNumElements();
22048a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman  return 1;
22054d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner}
22064d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner
22078a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// containsDuplicateElements - Return true if any element access is repeated.
2208213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanbool ExtVectorElementExpr::containsDuplicateElements() const {
2209a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar  // FIXME: Refactor this code to an accessor on the AST node which returns the
2210a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar  // "type" of component access, and share with code below and in Sema.
221101eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar  llvm::StringRef Comp = Accessor->getName();
2212190d6a25393995b42e32086949a68285ee423fb9Nate Begeman
2213190d6a25393995b42e32086949a68285ee423fb9Nate Begeman  // Halving swizzles do not contain duplicate elements.
2214150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
2215190d6a25393995b42e32086949a68285ee423fb9Nate Begeman    return false;
22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2217190d6a25393995b42e32086949a68285ee423fb9Nate Begeman  // Advance past s-char prefix on hex swizzles.
2218150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  if (Comp[0] == 's' || Comp[0] == 'S')
2219150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar    Comp = Comp.substr(1);
22201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2221150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  for (unsigned i = 0, e = Comp.size(); i != e; ++i)
2222150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar    if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos)
2223fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff        return true;
2224150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar
2225fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff  return false;
2226fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff}
2227b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner
22288a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
22293b8d116703db8018f855cbb4733ace426422623bNate Begemanvoid ExtVectorElementExpr::getEncodedElementAccess(
22303b8d116703db8018f855cbb4733ace426422623bNate Begeman                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
22314b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  llvm::StringRef Comp = Accessor->getName();
22324b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  if (Comp[0] == 's' || Comp[0] == 'S')
22334b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar    Comp = Comp.substr(1);
22341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22354b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isHi =   Comp == "hi";
22364b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isLo =   Comp == "lo";
22374b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isEven = Comp == "even";
22384b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isOdd  = Comp == "odd";
22391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22408a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
22418a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    uint64_t Index;
22421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22438a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    if (isHi)
22448a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = e + i;
22458a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isLo)
22468a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = i;
22478a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isEven)
22488a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = 2 * i;
22498a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isOdd)
22508a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = 2 * i + 1;
22518a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else
22524b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar      Index = ExtVectorType::getAccessorIdx(Comp[i]);
2253b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner
22543b8d116703db8018f855cbb4733ace426422623bNate Begeman    Elts.push_back(Index);
2255b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner  }
22568a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman}
22578a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman
225804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2259f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
226004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
226104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation SuperLoc,
226204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 bool IsInstanceSuper,
226304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 QualType SuperType,
2264c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 Selector Sel,
2265f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
226604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
226704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
226804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2269f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
2270bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*TypeDependent=*/false, /*ValueDependent=*/false,
2271bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*ContainsUnexpandedParameterPack=*/false),
227204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
227304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    HasMethod(Method != 0), SuperLoc(SuperLoc),
227404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
227504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2276f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2277c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor{
227804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(SuperType.getAsOpaquePtr());
227904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (NumArgs)
228004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
228104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
228204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
228304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2284f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
228504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
228604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 TypeSourceInfo *Receiver,
2287f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 Selector Sel,
2288f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
228904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
229004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
229104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2292f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
2293bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         T->isDependentType(), T->containsUnexpandedParameterPack()),
229404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0),
229504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
229604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2297f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
229804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{
229904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(Receiver);
2300aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **MyArgs = getArgs();
2301bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I) {
2302bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isTypeDependent())
2303bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2304bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isValueDependent())
2305bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2306bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->containsUnexpandedParameterPack())
2307bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2308bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2309bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    MyArgs[I] = Args[I];
2310bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
231104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
231204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
231304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
231504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
231604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr *Receiver,
2317c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 Selector Sel,
2318f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
231904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
232004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
232104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2322f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
2323bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Receiver->isTypeDependent(),
2324bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Receiver->containsUnexpandedParameterPack()),
232504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0),
232604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
232704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2328f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
232904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{
233004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(Receiver);
2331aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **MyArgs = getArgs();
2332bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I) {
2333bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isTypeDependent())
2334bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2335bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isValueDependent())
2336bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2337bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->containsUnexpandedParameterPack())
2338bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2339bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2340bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    MyArgs[I] = Args[I];
2341bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
234204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
234304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
234404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2345f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
234604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
234704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation SuperLoc,
234804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         bool IsInstanceSuper,
234904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         QualType SuperType,
2350c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                         Selector Sel,
2351f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
235204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
235304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
235404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2355c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
235604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
235704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2358f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
2359f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   SuperType, Sel, SelLoc, Method, Args,NumArgs,
236004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                   RBracLoc);
236104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
236204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
236304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2364f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
236504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
236604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         TypeSourceInfo *Receiver,
2367c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                         Selector Sel,
2368f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
236904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
237004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
237104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2372c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
237304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
237404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2375f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2376f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   Method, Args, NumArgs, RBracLoc);
237704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
237804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
237904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2380f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
238104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
238204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr *Receiver,
2383f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         Selector Sel,
2384f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
238504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
238604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
238704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2388c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
238904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
239004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2391f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2392f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   Method, Args, NumArgs, RBracLoc);
239304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
239404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
2395c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
239604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                              unsigned NumArgs) {
2397c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
239804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
239904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
240004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
240104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
2402e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2403e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios KyrtzidisSourceRange ObjCMessageExpr::getReceiverRange() const {
2404e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  switch (getReceiverKind()) {
2405e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case Instance:
2406e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getInstanceReceiver()->getSourceRange();
2407e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2408e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case Class:
2409e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
2410e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2411e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case SuperInstance:
2412e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case SuperClass:
2413e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getSuperLoc();
2414e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  }
2415e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2416e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  return SourceLocation();
2417e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis}
2418e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
241904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorSelector ObjCMessageExpr::getSelector() const {
242004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (HasMethod)
242104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
242204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                               ->getSelector();
2423c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Selector(SelectorOrMethod);
242404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
242504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
242604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
242704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (getReceiverKind()) {
242804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case Instance:
242904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    if (const ObjCObjectPointerType *Ptr
243004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor          = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
243104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      return Ptr->getInterfaceDecl();
243204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
24334df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek
243404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case Class:
2435c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (const ObjCObjectType *Ty
2436c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          = getClassReceiver()->getAs<ObjCObjectType>())
2437c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return Ty->getInterface();
243804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
24394df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek
244004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case SuperInstance:
244104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    if (const ObjCObjectPointerType *Ptr
244204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor          = getSuperType()->getAs<ObjCObjectPointerType>())
244304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      return Ptr->getInterfaceDecl();
244404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
2445c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor
244604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case SuperClass:
244704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    if (const ObjCObjectPointerType *Iface
244804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                       = getSuperType()->getAs<ObjCObjectPointerType>())
244904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      return Iface->getInterfaceDecl();
245004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
245104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
24520389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner
245304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  return 0;
2454eb3b324800598cc3d5385fbad95ae5cff2c79113Ted Kremenek}
24550389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner
24564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ChooseExpr::isConditionTrue(const ASTContext &C) const {
24579a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman  return getCond()->EvaluateAsInt(C) != 0;
245827437caadea35f84d550cd29f024fcf3ea240eecChris Lattner}
245927437caadea35f84d550cd29f024fcf3ea240eecChris Lattner
2460bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
2461bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     QualType Type, SourceLocation BLoc,
2462bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     SourceLocation RP)
2463bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor   : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
2464bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          Type->isDependentType(), Type->isDependentType(),
2465bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          Type->containsUnexpandedParameterPack()),
2466bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor     BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
2467bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor{
2468bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  SubExprs = new (C) Stmt*[nexpr];
2469bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i < nexpr; i++) {
2470bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
2471bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2472bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
2473bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2474bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
2475bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2476bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2477bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    SubExprs[i] = args[i];
2478bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
2479bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
2480bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2481888376a2bbcfc2f047902249f8455918e2489ae1Nate Begemanvoid ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
2482888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman                                 unsigned NumExprs) {
2483888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman  if (SubExprs) C.Deallocate(SubExprs);
2484888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman
2485888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman  SubExprs = new (C) Stmt* [NumExprs];
248694cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  this->NumExprs = NumExprs;
248794cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
24881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
2489888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman
249077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===//
249105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//  DesignatedInitExpr
249205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===//
249305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
249405c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorIdentifierInfo *DesignatedInitExpr::Designator::getFieldName() {
249505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  assert(Kind == FieldDesignator && "Only valid on a field designator");
249605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  if (Field.NameOrField & 0x01)
249705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
249805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  else
249905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return getField()->getIdentifier();
250005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
250105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
2502c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntDesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
2503319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                                       unsigned NumDesignators,
2504ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                       const Designator *Designators,
25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       SourceLocation EqualOrColonLoc,
2506ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                       bool GNUSyntax,
25071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       Expr **IndexExprs,
25089ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                       unsigned NumIndexExprs,
25099ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                       Expr *Init)
25101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : Expr(DesignatedInitExprClass, Ty,
2511f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall         Init->getValueKind(), Init->getObjectKind(),
2512bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Init->isTypeDependent(), Init->isValueDependent(),
2513bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Init->containsUnexpandedParameterPack()),
25141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
25151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
2516319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  this->Designators = new (C) Designator[NumDesignators];
25179ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25189ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // Record the initializer itself.
25199ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  child_iterator Child = child_begin();
25209ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  *Child++ = Init;
25219ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25229ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // Copy the designators and their subexpressions, computing
25239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // value-dependence along the way.
25249ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  unsigned IndexIdx = 0;
25259ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  for (unsigned I = 0; I != NumDesignators; ++I) {
2526ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    this->Designators[I] = Designators[I];
25279ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25289ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    if (this->Designators[I].isArrayDesignator()) {
25299ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Compute type- and value-dependence.
25309ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *Index = IndexExprs[IndexIdx];
2531bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Index->isTypeDependent() || Index->isValueDependent())
2532bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
2533bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2534bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      // Propagate unexpanded parameter packs.
2535bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Index->containsUnexpandedParameterPack())
2536bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ContainsUnexpandedParameterPack = true;
25379ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25389ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Copy the index expressions into permanent storage.
25399ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
25409ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    } else if (this->Designators[I].isArrayRangeDesignator()) {
25419ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Compute type- and value-dependence.
25429ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *Start = IndexExprs[IndexIdx];
25439ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *End = IndexExprs[IndexIdx + 1];
2544bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Start->isTypeDependent() || Start->isValueDependent() ||
2545bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          End->isTypeDependent() || End->isValueDependent())
2546bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
2547bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2548bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      // Propagate unexpanded parameter packs.
2549bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Start->containsUnexpandedParameterPack() ||
2550bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          End->containsUnexpandedParameterPack())
2551bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ContainsUnexpandedParameterPack = true;
25529ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25539ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Copy the start/end expressions into permanent storage.
25549ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
25559ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
25569ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    }
25579ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  }
25589ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
25599ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
2560ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor}
2561ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
256205c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorDesignatedInitExpr *
25631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
256405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           unsigned NumDesignators,
256505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           Expr **IndexExprs, unsigned NumIndexExprs,
256605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           SourceLocation ColonOrEqualLoc,
256705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           bool UsesColonSyntax, Expr *Init) {
2568c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2569c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2570319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
25719ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                      ColonOrEqualLoc, UsesColonSyntax,
25729ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                      IndexExprs, NumIndexExprs, Init);
257305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
257405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
25751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
2576d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                                                    unsigned NumIndexExprs) {
2577d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2578d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2579d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
2580d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor}
2581d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
2582319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::setDesignators(ASTContext &C,
2583319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                                        const Designator *Desigs,
2584d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                                        unsigned NumDesigs) {
2585319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  Designators = new (C) Designator[NumDesigs];
2586d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  NumDesignators = NumDesigs;
2587d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  for (unsigned I = 0; I != NumDesigs; ++I)
2588d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    Designators[I] = Desigs[I];
2589d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor}
2590d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
259105c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSourceRange DesignatedInitExpr::getSourceRange() const {
259205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation StartLoc;
2593d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner  Designator &First =
2594d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    *const_cast<DesignatedInitExpr*>(this)->designators_begin();
259505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  if (First.isFieldDesignator()) {
2596eeae8f072748affce25ab4064982626361293390Douglas Gregor    if (GNUSyntax)
259705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
259805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    else
259905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
260005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  } else
2601d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    StartLoc =
2602d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner      SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
260305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
260405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
260505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
260605c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
260705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
260805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
260905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
261005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
261105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
261205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
261305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
261405c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
26151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(D.Kind == Designator::ArrayRangeDesignator &&
261605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor         "Requires array range designator");
261705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
261805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
261905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
262005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
262105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
262205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
262305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(D.Kind == Designator::ArrayRangeDesignator &&
262505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor         "Requires array range designator");
262605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
262705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
262805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
262905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
263005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
263105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
2632ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Replaces the designator at index @p Idx with the series
2633ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// of designators in [First, Last).
2634319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
26351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const Designator *First,
2636ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                          const Designator *Last) {
2637ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  unsigned NumNewDesignators = Last - First;
2638ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  if (NumNewDesignators == 0) {
2639ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    std::copy_backward(Designators + Idx + 1,
2640ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                       Designators + NumDesignators,
2641ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                       Designators + Idx);
2642ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    --NumNewDesignators;
2643ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    return;
2644ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  } else if (NumNewDesignators == 1) {
2645ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    Designators[Idx] = *First;
2646ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    return;
2647ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  }
2648ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
26491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Designator *NewDesignators
2650319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor    = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
2651ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(Designators, Designators + Idx, NewDesignators);
2652ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(First, Last, NewDesignators + Idx);
2653ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(Designators + Idx + 1, Designators + NumDesignators,
2654ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor            NewDesignators + Idx + NumNewDesignators);
2655ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  Designators = NewDesignators;
2656ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  NumDesignators = NumDesignators - 1 + NumNewDesignators;
2657ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor}
2658ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
26591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
26602ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman                             Expr **exprs, unsigned nexprs,
26612ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman                             SourceLocation rparenloc)
2662bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
2663bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         false, false, false),
2664bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
26651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
26662ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  Exprs = new (C) Stmt*[nexprs];
2667bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != nexprs; ++i) {
2668bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->isTypeDependent())
2669bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2670bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->isValueDependent())
2671bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2672bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->containsUnexpandedParameterPack())
2673bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2674bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
26752ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    Exprs[i] = exprs[i];
2676bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
26772ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
26782ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
267905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===//
2680ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//  ExprIterator.
2681ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===//
2682ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
2683ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
2684ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator*() const { return cast<Expr>(*I); }
2685ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator->() const { return cast<Expr>(*I); }
2686ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator[](size_t idx) const {
2687ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  return cast<Expr>(I[idx]);
2688ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek}
2689ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
2690ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
2691ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
2692ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===//
269377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//  Child Iterators for iterating over subexpressions/substatements
269477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===//
269577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
269677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// DeclRefExpr
26979ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
26989ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
269977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
27007779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff// ObjCIvarRefExpr
27015549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
27025549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
27037779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
2704e3e9add4fd788927df6f545570e7838db59c01d7Steve Naroff// ObjCPropertyRefExpr
27058ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz JahanianStmt::child_iterator ObjCPropertyRefExpr::child_begin()
27068ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian{
270712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Receiver.is<Stmt*>()) {
27088ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    // Hack alert!
270912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    return reinterpret_cast<Stmt**> (&Receiver);
27108ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  }
27118ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  return child_iterator();
27128ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian}
27138ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian
27148ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz JahanianStmt::child_iterator ObjCPropertyRefExpr::child_end()
271512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall{ return Receiver.is<Stmt*>() ?
271612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall          reinterpret_cast<Stmt**> (&Receiver)+1 :
27178ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian          child_iterator();
27188ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian}
2719ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff
2720f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff// ObjCIsaExpr
2721f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; }
2722f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve NaroffStmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; }
2723f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
2724d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner// PredefinedExpr
2725d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); }
2726d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris LattnerStmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); }
272777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
272877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// IntegerLiteral
27299ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); }
27309ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); }
273177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
273277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CharacterLiteral
2733d603eaa682cecac2c10771a700cb83aa301653b4Chris LattnerStmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();}
27349ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); }
273577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
273677ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// FloatingLiteral
27379ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); }
27389ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
273977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
27405d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner// ImaginaryLiteral
27415549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; }
27425549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; }
27435d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
274477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// StringLiteral
27459ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
27469ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
274777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
274877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ParenExpr
27495549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_begin() { return &Val; }
27505549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ParenExpr::child_end() { return &Val+1; }
275177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
275277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// UnaryOperator
27535549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_begin() { return &Val; }
27545549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator UnaryOperator::child_end() { return &Val+1; }
275577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
27568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor// OffsetOfExpr
27578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorStmt::child_iterator OffsetOfExpr::child_begin() {
27588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return reinterpret_cast<Stmt **> (reinterpret_cast<OffsetOfNode *> (this + 1)
27598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                      + NumComps);
27608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
27618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorStmt::child_iterator OffsetOfExpr::child_end() {
27628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return child_iterator(&*child_begin() + NumExprs);
27638ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
27648ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
27650518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl// SizeOfAlignOfExpr
27661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator SizeOfAlignOfExpr::child_begin() {
27670518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // If this is of a type and the type is a VLA type (and not a typedef), the
27680518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // size expression of the VLA needs to be treated as an executable expression.
27690518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // Why isn't this weirdness documented better in StmtIterator?
27700518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (isArgumentType()) {
2771f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    if (const VariableArrayType* T = dyn_cast<VariableArrayType>(
27720518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl                                   getArgumentType().getTypePtr()))
27730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl      return child_iterator(T);
27740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    return child_iterator();
27750518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
2776d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  return child_iterator(&Argument.Ex);
27779ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
27780518999d3adcc289997bd974dce90cc97f5c1c44Sebastian RedlStmt::child_iterator SizeOfAlignOfExpr::child_end() {
27790518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (isArgumentType())
27800518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    return child_iterator();
2781d457589fc69dc7a9c80cd74d317c0b81a35a27c9Sebastian Redl  return child_iterator(&Argument.Ex + 1);
27829ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
278377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
278477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// ArraySubscriptExpr
27851237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_begin() {
27865549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0];
278777ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
27881237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ArraySubscriptExpr::child_end() {
27895549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0]+END_EXPR;
279077ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
279177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
279277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek// CallExpr
27931237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_begin() {
27945549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0];
279577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
27961237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator CallExpr::child_end() {
27975549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0]+NumArgs+ARGS_START;
279877ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek}
27991237c673c07f9d827129ba02720108816abde562Ted Kremenek
28001237c673c07f9d827129ba02720108816abde562Ted Kremenek// MemberExpr
28015549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_begin() { return &Base; }
28025549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator MemberExpr::child_end() { return &Base+1; }
28031237c673c07f9d827129ba02720108816abde562Ted Kremenek
2804213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman// ExtVectorElementExpr
28055549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; }
28065549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; }
28071237c673c07f9d827129ba02720108816abde562Ted Kremenek
28081237c673c07f9d827129ba02720108816abde562Ted Kremenek// CompoundLiteralExpr
28095549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; }
28105549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; }
28111237c673c07f9d827129ba02720108816abde562Ted Kremenek
28121237c673c07f9d827129ba02720108816abde562Ted Kremenek// CastExpr
28135549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_begin() { return &Op; }
28145549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator CastExpr::child_end() { return &Op+1; }
28151237c673c07f9d827129ba02720108816abde562Ted Kremenek
28161237c673c07f9d827129ba02720108816abde562Ted Kremenek// BinaryOperator
28171237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_begin() {
28185549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0];
28191237c673c07f9d827129ba02720108816abde562Ted Kremenek}
28201237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator BinaryOperator::child_end() {
28215549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0]+END_EXPR;
28221237c673c07f9d827129ba02720108816abde562Ted Kremenek}
28231237c673c07f9d827129ba02720108816abde562Ted Kremenek
28241237c673c07f9d827129ba02720108816abde562Ted Kremenek// ConditionalOperator
28251237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_begin() {
28265549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0];
28271237c673c07f9d827129ba02720108816abde562Ted Kremenek}
28281237c673c07f9d827129ba02720108816abde562Ted KremenekStmt::child_iterator ConditionalOperator::child_end() {
28295549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0]+END_EXPR;
28301237c673c07f9d827129ba02720108816abde562Ted Kremenek}
28311237c673c07f9d827129ba02720108816abde562Ted Kremenek
28321237c673c07f9d827129ba02720108816abde562Ted Kremenek// AddrLabelExpr
28339ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); }
28349ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
28351237c673c07f9d827129ba02720108816abde562Ted Kremenek
28361237c673c07f9d827129ba02720108816abde562Ted Kremenek// StmtExpr
28375549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_begin() { return &SubStmt; }
28385549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; }
28391237c673c07f9d827129ba02720108816abde562Ted Kremenek
28401237c673c07f9d827129ba02720108816abde562Ted Kremenek
28411237c673c07f9d827129ba02720108816abde562Ted Kremenek// ChooseExpr
28425549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; }
28435549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; }
28442d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
28452d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor// GNUNullExpr
28462d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); }
28472d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas GregorStmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); }
28481237c673c07f9d827129ba02720108816abde562Ted Kremenek
2849d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman// ShuffleVectorExpr
2850d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_begin() {
28515549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0];
2852d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
2853d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanStmt::child_iterator ShuffleVectorExpr::child_end() {
28545549976193e34417d4474a5f4a514268ef6666c7Ted Kremenek  return &SubExprs[0]+NumExprs;
2855d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman}
2856d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman
28577c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson// VAArgExpr
28585549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_begin() { return &Val; }
28595549976193e34417d4474a5f4a514268ef6666c7Ted KremenekStmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
28607c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
286166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson// InitListExpr
2862ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed KremenekStmt::child_iterator InitListExpr::child_begin() {
2863ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  return InitExprs.size() ? &InitExprs[0] : 0;
2864ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek}
2865ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed KremenekStmt::child_iterator InitListExpr::child_end() {
2866ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
2867ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek}
286866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
28693498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// DesignatedInitExpr
287005c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_begin() {
287105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
287205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
287305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
287405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
287505c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorStmt::child_iterator DesignatedInitExpr::child_end() {
287605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return child_iterator(&*child_begin() + NumSubExprs);
287705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
287805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
28793498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor// ImplicitValueInitExpr
28801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_begin() {
28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return child_iterator();
28823498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}
28833498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
28841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ImplicitValueInitExpr::child_end() {
28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return child_iterator();
28863498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}
28873498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
28882ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman// ParenListExpr
28892ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_begin() {
28902ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  return &Exprs[0];
28912ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
28922ef13e5abef0570a9f567b4671367275c05d4d34Nate BegemanStmt::child_iterator ParenListExpr::child_end() {
28932ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  return &Exprs[0]+NumExprs;
28942ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
28952ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
28961237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCStringLiteral
28971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCStringLiteral::child_begin() {
2898c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner  return &String;
28999ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
29009ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCStringLiteral::child_end() {
2901c6c16af963eddc3e9b75b5d2614d069e1162fe27Chris Lattner  return &String+1;
29029ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
29031237c673c07f9d827129ba02720108816abde562Ted Kremenek
29041237c673c07f9d827129ba02720108816abde562Ted Kremenek// ObjCEncodeExpr
29059ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); }
29069ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); }
29071237c673c07f9d827129ba02720108816abde562Ted Kremenek
2908b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian// ObjCSelectorExpr
29091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCSelectorExpr::child_begin() {
29109ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek  return child_iterator();
29119ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
29129ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCSelectorExpr::child_end() {
29139ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek  return child_iterator();
29149ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
2915b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
2916390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian// ObjCProtocolExpr
29179ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_begin() {
29189ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek  return child_iterator();
29199ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
29209ac5928abeb3a47592201e1c30fe2930c20a507eTed KremenekStmt::child_iterator ObjCProtocolExpr::child_end() {
29219ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek  return child_iterator();
29229ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
2923390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
2924563477da25f824e37c535131695dc4dc9b68c465Steve Naroff// ObjCMessageExpr
29251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt::child_iterator ObjCMessageExpr::child_begin() {
292604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (getReceiverKind() == Instance)
292704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    return reinterpret_cast<Stmt **>(this + 1);
2928aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  return reinterpret_cast<Stmt **>(getArgs());
2929563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
2930563477da25f824e37c535131695dc4dc9b68c465Steve NaroffStmt::child_iterator ObjCMessageExpr::child_end() {
2931aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  return reinterpret_cast<Stmt **>(getArgs() + getNumArgs());
2932563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
2933563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
29344eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Blocks
2935a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas GregorBlockDeclRefExpr::BlockDeclRefExpr(ValueDecl *d, QualType t, ExprValueKind VK,
2936a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor                                   SourceLocation l, bool ByRef,
2937a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor                                   bool constAdded, Stmt *copyConstructorVal)
2938a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary,
2939a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor         (!t.isNull() && t->isDependentType()), false,
2940a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor         d->isParameterPack()),
2941a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    D(d), Loc(l), IsByRef(ByRef),
2942a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    ConstQualAdded(constAdded),  CopyConstructorVal(copyConstructorVal)
2943a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor{
2944a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor  // FIXME: Compute type/value dependence.
2945a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor}
2946a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor
294756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_begin() { return child_iterator(); }
294856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffStmt::child_iterator BlockExpr::child_end() { return child_iterator(); }
29494eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
29509da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();}
29519da13f9ddb2567e36f4bbee7b3c32f54aeb76d5bTed KremenekStmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); }
29527cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
29537cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall// OpaqueValueExpr
29547cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallSourceRange OpaqueValueExpr::getSourceRange() const { return SourceRange(); }
29557cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallStmt::child_iterator OpaqueValueExpr::child_begin() { return child_iterator(); }
29567cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallStmt::child_iterator OpaqueValueExpr::child_end() { return child_iterator(); }
29577cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
2958