Expr.cpp revision 03e80030515c800d1ab44125b9052dfffd1bd04c
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"
257a614d8380297fcd2bc23986241905d97222948cRichard Smith#include "clang/Sema/SemaDiagnostic.h"
261b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
2708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner#include "clang/Basic/SourceManager.h"
28da5a6b6d9fd52899499d5b7b46273ec844dcaa6eChris Lattner#include "clang/Basic/TargetInfo.h"
29cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor#include "llvm/Support/ErrorHandling.h"
303a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson#include "llvm/Support/raw_ostream.h"
31ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor#include <algorithm>
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
342b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// isKnownToHaveBooleanValue - Return true if this is an integer expression
352b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// that is known to return 0 or 1.  This happens for _Bool/bool expressions
362b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// but also int expressions which are produced by things like comparisons in
372b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner/// C.
382b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattnerbool Expr::isKnownToHaveBooleanValue() const {
39f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const Expr *E = IgnoreParens();
40f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
412b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  // If this value has _Bool type, it is obvious 0/1.
42f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (E->getType()->isBooleanType()) return true;
43c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // If this is a non-scalar-integer type, we don't care enough to try.
44f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (!E->getType()->isIntegralOrEnumerationType()) return false;
45c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
46f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
472b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    switch (UO->getOpcode()) {
482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
492b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return UO->getSubExpr()->isKnownToHaveBooleanValue();
502b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    default:
512b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return false;
522b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    }
532b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  }
54c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
556907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  // Only look through implicit casts.  If the user writes
566907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  // '(int) (a && b)' treat it as an arbitrary int.
57f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
582b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    return CE->getSubExpr()->isKnownToHaveBooleanValue();
59c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
60f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
612b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    switch (BO->getOpcode()) {
622b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    default: return false;
632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LT:   // Relational operators.
642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GT:
652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LE:
662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_GE:
672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_EQ:   // Equality operators.
682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_NE:
692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LAnd: // AND operator.
702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_LOr:  // Logical OR operator.
712b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return true;
72c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_And:  // Bitwise AND operator.
742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Xor:  // Bitwise XOR operator.
752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Or:   // Bitwise OR operator.
762b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      // Handle things like (x==2)|(y==12).
772b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return BO->getLHS()->isKnownToHaveBooleanValue() &&
782b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner             BO->getRHS()->isKnownToHaveBooleanValue();
79c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Comma:
812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case BO_Assign:
822b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner      return BO->getRHS()->isKnownToHaveBooleanValue();
832b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    }
842b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  }
85c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
86f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E))
872b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner    return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
882b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner           CO->getFalseExpr()->isKnownToHaveBooleanValue();
89c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
902b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner  return false;
912b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner}
922b334bb3126a67895813e49e6228dad4aec0b4d6Chris Lattner
9363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall// Amusing macro metaprogramming hack: check whether a class provides
9463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall// a more specific implementation of getExprLoc().
9563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCallnamespace {
9663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// This implementation is used when a class provides a custom
9763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// implementation of getExprLoc.
9863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  template <class E, class T>
9963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLocImpl(const Expr *expr,
10063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall                                SourceLocation (T::*v)() const) {
10163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return static_cast<const E*>(expr)->getExprLoc();
10263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
10363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall
10463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// This implementation is used when a class doesn't provide
10563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// a custom implementation of getExprLoc.  Overload resolution
10663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// should pick it over the implementation above because it's
10763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  /// more specialized according to function template partial ordering.
10863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  template <class E>
10963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  SourceLocation getExprLocImpl(const Expr *expr,
11063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall                                SourceLocation (Expr::*v)() const) {
11163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return static_cast<const E*>(expr)->getSourceRange().getBegin();
11263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
11363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall}
11463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall
11563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCallSourceLocation Expr::getExprLoc() const {
11663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  switch (getStmtClass()) {
11763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  case Stmt::NoStmtClass: llvm_unreachable("statement without class");
11863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define ABSTRACT_STMT(type)
11963c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define STMT(type, base) \
12063c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break;
12163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#define EXPR(type, base) \
12263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
12363c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall#include "clang/AST/StmtNodes.inc"
12463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  }
12563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  llvm_unreachable("unknown statement kind");
12663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  return SourceLocation();
12763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall}
12863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Primary Expressions.
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
133d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::initializeFrom(
134d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      const TemplateArgumentListInfo &Info) {
135d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  LAngleLoc = Info.getLAngleLoc();
136d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  RAngleLoc = Info.getRAngleLoc();
137d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  NumTemplateArgs = Info.size();
138d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
139d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
140d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned i = 0; i != NumTemplateArgs; ++i)
141d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
142d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
143d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
144bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorvoid ExplicitTemplateArgumentList::initializeFrom(
145bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   const TemplateArgumentListInfo &Info,
146bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   bool &Dependent,
147bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                   bool &ContainsUnexpandedParameterPack) {
148bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  LAngleLoc = Info.getLAngleLoc();
149bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  RAngleLoc = Info.getRAngleLoc();
150bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  NumTemplateArgs = Info.size();
151bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
152bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
153bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
154bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    Dependent = Dependent || Info[i].getArgument().isDependent();
155bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    ContainsUnexpandedParameterPack
156bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      = ContainsUnexpandedParameterPack ||
157bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        Info[i].getArgument().containsUnexpandedParameterPack();
158bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
159bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
160bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
161bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
162bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
163d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallvoid ExplicitTemplateArgumentList::copyInto(
164d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      TemplateArgumentListInfo &Info) const {
165d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  Info.setLAngleLoc(LAngleLoc);
166d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  Info.setRAngleLoc(RAngleLoc);
167d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  for (unsigned I = 0; I != NumTemplateArgs; ++I)
168d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Info.addArgument(getTemplateArgs()[I]);
169d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
170d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
1718dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstd::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) {
1728dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return sizeof(ExplicitTemplateArgumentList) +
1738dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
1748dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
1758dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
176d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallstd::size_t ExplicitTemplateArgumentList::sizeFor(
177d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                                      const TemplateArgumentListInfo &Info) {
1788dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return sizeFor(Info.size());
179d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall}
180d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall
181d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor/// \brief Compute the type- and value-dependence of a declaration reference
182d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor/// based on the declaration being referenced.
183d967e31ee796efff24b84b704a063634f6b55627Douglas Gregorstatic void computeDeclRefDependence(NamedDecl *D, QualType T,
184d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor                                     bool &TypeDependent,
185d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor                                     bool &ValueDependent) {
186d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  TypeDependent = false;
187d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  ValueDependent = false;
188c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1890da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor
1900da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  // (TD) C++ [temp.dep.expr]p3:
1910da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //   An id-expression is type-dependent if it contains:
1920da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //
193c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  // and
1940da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //
1950da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  // (VD) C++ [temp.dep.constexpr]p2:
1960da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  An identifier is value-dependent if it is:
197d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
1980da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - an identifier that was declared with dependent type
1990da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD)  - a name declared with a dependent type,
200d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (T->isDependentType()) {
201d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    TypeDependent = true;
202d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    ValueDependent = true;
203d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    return;
2040da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
205d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
2060da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (TD)  - a conversion-function-id that specifies a dependent type
207d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (D->getDeclName().getNameKind()
208d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor           == DeclarationName::CXXConversionFunctionName &&
2090da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor           D->getDeclName().getCXXNameType()->isDependentType()) {
210d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    TypeDependent = true;
211d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    ValueDependent = true;
212d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    return;
2130da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  }
2140da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD)  - the name of a non-type template parameter,
215d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (isa<NonTypeTemplateParmDecl>(D)) {
216d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    ValueDependent = true;
217d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    return;
218d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  }
219d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
2200da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //  (VD) - a constant with integral or enumeration type and is
2210da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor  //         initialized with an expression that is value-dependent.
222d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
2232ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor    if (Var->getType()->isIntegralOrEnumerationType() &&
224501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor        Var->getType().getCVRQualifiers() == Qualifiers::Const) {
22531310a21fb2a9f13950f864f681c86080b05d5b2Sebastian Redl      if (const Expr *Init = Var->getAnyInitializer())
226501edb6a54524555ad27fbf41a7920dc756b08c6Douglas Gregor        if (Init->isValueDependent())
227d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor          ValueDependent = true;
228bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    }
229d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
230bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    // (VD) - FIXME: Missing from the standard:
231bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    //      -  a member function or a static data member of the current
232bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    //         instantiation
233bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor    else if (Var->isStaticDataMember() &&
2347ed5bd3e27a6f2b37ee0449aa818116cbd03306eDouglas Gregor             Var->getDeclContext()->isDependentContext())
235d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor      ValueDependent = true;
236d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
237d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    return;
238d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  }
239d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
240bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  // (VD) - FIXME: Missing from the standard:
241bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  //      -  a member function or a static data member of the current
242bb6e73fcf60fa5a4cc36c14744dc366b658443b5Douglas Gregor  //         instantiation
243d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) {
244d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    ValueDependent = true;
245d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    return;
246d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  }
247d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor}
248d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
249d967e31ee796efff24b84b704a063634f6b55627Douglas Gregorvoid DeclRefExpr::computeDependence() {
250d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  bool TypeDependent = false;
251d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  bool ValueDependent = false;
252d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  computeDeclRefDependence(getDecl(), getType(), TypeDependent, ValueDependent);
253d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
254d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  // (TD) C++ [temp.dep.expr]p3:
255d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  //   An id-expression is type-dependent if it contains:
256d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  //
257d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  // and
258d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  //
259d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  // (VD) C++ [temp.dep.constexpr]p2:
260d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  //  An identifier is value-dependent if it is:
261d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (!TypeDependent && !ValueDependent &&
262d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor      hasExplicitTemplateArgs() &&
263d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor      TemplateSpecializationType::anyDependentTemplateArguments(
264d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor                                                            getTemplateArgs(),
265d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor                                                       getNumTemplateArgs())) {
266d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    TypeDependent = true;
267d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor    ValueDependent = true;
268d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  }
269d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
270d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  ExprBits.TypeDependent = TypeDependent;
271d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  ExprBits.ValueDependent = ValueDependent;
272d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor
27310738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  // Is the declaration a parameter pack?
274d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  if (getDecl()->isParameterPack())
2751fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor    ExprBits.ContainsUnexpandedParameterPack = true;
2760da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor}
2770da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor
2783aa8140bde5b9bedf13e46ec0a668daa54814196Chandler CarruthDeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2792577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                         ValueDecl *D, const DeclarationNameInfo &NameInfo,
2803aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                         NamedDecl *FoundD,
2812577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                         const TemplateArgumentListInfo *TemplateArgs,
282f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                         QualType T, ExprValueKind VK)
283bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
284cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth    D(D), Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
285cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0;
2867e740bd36772aae16b5cc5e605998ccc5eaf26dbChandler Carruth  if (QualifierLoc)
2876857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth    getInternalQualifierLoc() = QualifierLoc;
2883aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  DeclRefExprBits.HasFoundDecl = FoundD ? 1 : 0;
2893aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (FoundD)
2903aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    getInternalFoundDecl() = FoundD;
291cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  DeclRefExprBits.HasExplicitTemplateArgs = TemplateArgs ? 1 : 0;
2922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  if (TemplateArgs)
293096832c5ed5b9106fa177ebc148489760c3bc496John McCall    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
2942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
2952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  computeDependence();
2962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
2972577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
298a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
29940d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                 NestedNameSpecifierLoc QualifierLoc,
300dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall                                 ValueDecl *D,
301a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                 SourceLocation NameLoc,
3020da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                 QualType T,
303f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
3043aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                                 NamedDecl *FoundD,
3050da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                 const TemplateArgumentListInfo *TemplateArgs) {
30640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  return Create(Context, QualifierLoc, D,
3072577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                DeclarationNameInfo(D->getDeclName(), NameLoc),
3083aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                T, VK, FoundD, TemplateArgs);
3092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara}
3102577743c5650c646fb705df01403707e94f2df04Abramo Bagnara
3112577743c5650c646fb705df01403707e94f2df04Abramo BagnaraDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
31240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                                 NestedNameSpecifierLoc QualifierLoc,
3132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 ValueDecl *D,
3142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 const DeclarationNameInfo &NameInfo,
3152577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 QualType T,
316f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
3173aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                                 NamedDecl *FoundD,
3182577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                                 const TemplateArgumentListInfo *TemplateArgs) {
3193aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  // Filter out cases where the found Decl is the same as the value refenenced.
3203aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (D == FoundD)
3213aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    FoundD = 0;
3223aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
323a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  std::size_t Size = sizeof(DeclRefExpr);
32440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  if (QualifierLoc != 0)
3256857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth    Size += sizeof(NestedNameSpecifierLoc);
3263aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (FoundD)
3273aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    Size += sizeof(NamedDecl *);
328d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  if (TemplateArgs)
329d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
3303aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
3313248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
3323aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  return new (Mem) DeclRefExpr(QualifierLoc, D, NameInfo, FoundD, TemplateArgs,
3333aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                               T, VK);
334a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}
335a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3363aa8140bde5b9bedf13e46ec0a668daa54814196Chandler CarruthDeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context,
337def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                      bool HasQualifier,
3383aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth                                      bool HasFoundDecl,
339def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                      bool HasExplicitTemplateArgs,
340663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                      unsigned NumTemplateArgs) {
341663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  std::size_t Size = sizeof(DeclRefExpr);
342663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (HasQualifier)
3436857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth    Size += sizeof(NestedNameSpecifierLoc);
3443aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (HasFoundDecl)
3453aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    Size += sizeof(NamedDecl *);
346def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (HasExplicitTemplateArgs)
347663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
3483aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
3493248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
350663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  return new (Mem) DeclRefExpr(EmptyShell());
351663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis}
352663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
353a2813cec2605ce7878d1b13471d685f689b251afDouglas GregorSourceRange DeclRefExpr::getSourceRange() const {
3542577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  SourceRange R = getNameInfo().getSourceRange();
355a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (hasQualifier())
35640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    R.setBegin(getQualifierLoc().getBeginLoc());
357096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (hasExplicitTemplateArgs())
358a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    R.setEnd(getRAngleLoc());
359a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  return R;
360a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor}
361a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor
3623a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// FIXME: Maybe this should use DeclPrinter with a special "print predefined
3633a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson// expr" policy instead.
364848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlssonstd::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
365848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson  ASTContext &Context = CurrentDecl->getASTContext();
366848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson
3673a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
368848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson    if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
3693a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      return FD->getNameAsString();
3703a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3713a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::SmallString<256> Name;
3723a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::raw_svector_ostream Out(Name);
3733a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3743a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
375848fa64143fbe5ae62a601ad61277f741e54dfabAnders Carlsson      if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
3763a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        Out << "virtual ";
3774eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (MD->isStatic())
3784eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Out << "static ";
3793a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    }
3803a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3813a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    PrintingPolicy Policy(Context.getLangOptions());
3823a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3833a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    std::string Proto = FD->getQualifiedNameAsString(Policy);
3843a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
385183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall    const FunctionType *AFT = FD->getType()->getAs<FunctionType>();
3863a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    const FunctionProtoType *FT = 0;
3873a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (FD->hasWrittenPrototype())
3883a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      FT = dyn_cast<FunctionProtoType>(AFT);
3893a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
3903a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Proto += "(";
3913a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (FT) {
3923a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      llvm::raw_string_ostream POut(Proto);
3933a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
3943a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        if (i) POut << ", ";
3953a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        std::string Param;
3963a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy);
3973a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        POut << Param;
3983a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      }
3993a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4003a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      if (FT->isVariadic()) {
4013a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        if (FD->getNumParams()) POut << ", ";
4023a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson        POut << "...";
4033a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson      }
4043a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    }
4053a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Proto += ")";
4063a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4074eadcc569223135e13353c9381b448986e3f7053Sam Weinig    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
4084eadcc569223135e13353c9381b448986e3f7053Sam Weinig      Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
4094eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (ThisQuals.hasConst())
4104eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Proto += " const";
4114eadcc569223135e13353c9381b448986e3f7053Sam Weinig      if (ThisQuals.hasVolatile())
4124eadcc569223135e13353c9381b448986e3f7053Sam Weinig        Proto += " volatile";
4134eadcc569223135e13353c9381b448986e3f7053Sam Weinig    }
4144eadcc569223135e13353c9381b448986e3f7053Sam Weinig
4153a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig    if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
4163a1ce1ed0f5686384e712837bad28c576622e442Sam Weinig      AFT->getResultType().getAsStringInternal(Proto, Policy);
4173a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4183a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << Proto;
4193a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4203a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out.flush();
4213a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return Name.str().str();
4223a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
4233a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
4243a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::SmallString<256> Name;
4253a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    llvm::raw_svector_ostream Out(Name);
4263a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << (MD->isInstanceMethod() ? '-' : '+');
4273a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << '[';
428b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek
429b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
430b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    // a null check to avoid a crash.
431b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
432900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer      Out << ID;
433b03d33edaf24af2893a50caee4d2c99839242c44Ted Kremenek
4343a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    if (const ObjCCategoryImplDecl *CID =
435900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
436900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer      Out << '(' << CID << ')';
437900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer
4383a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out <<  ' ';
4393a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out << MD->getSelector().getAsString();
4403a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out <<  ']';
4413a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4423a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    Out.flush();
4433a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return Name.str().str();
4443a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
4453a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
4463a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
4473a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson    return "top level";
4483a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  }
4493a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson  return "";
4503a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson}
4513a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson
4529996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidisvoid APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) {
4539996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  if (hasAllocation())
4549996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    C.Deallocate(pVal);
4559996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4569996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  BitWidth = Val.getBitWidth();
4579996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  unsigned NumWords = Val.getNumWords();
4589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  const uint64_t* Words = Val.getRawData();
4599996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  if (NumWords > 1) {
4609996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    pVal = new (C) uint64_t[NumWords];
4619996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    std::copy(Words, Words + NumWords, pVal);
4629996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  } else if (NumWords == 1)
4639996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    VAL = Words[0];
4649996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  else
4659996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis    VAL = 0;
4669996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4679996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4689996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral *
4699996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, const llvm::APInt &V,
4709996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                       QualType type, SourceLocation l) {
4719996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) IntegerLiteral(C, V, type, l);
4729996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4739996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4749996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral *
4759996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisIntegerLiteral::Create(ASTContext &C, EmptyShell Empty) {
4769996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) IntegerLiteral(Empty);
4779996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4789996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4799996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral *
4809996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V,
4819996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis                        bool isexact, QualType Type, SourceLocation L) {
4829996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) FloatingLiteral(C, V, isexact, Type, L);
4839996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4849996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
4859996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral *
4869996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios KyrtzidisFloatingLiteral::Create(ASTContext &C, EmptyShell Empty) {
4879996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  return new (C) FloatingLiteral(Empty);
4889996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis}
4899996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis
490da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// getValueAsApproximateDouble - This returns the value as an inaccurate
491da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// double.  Note that this may cause loss of precision, but is useful for
492da8249e57f3badecf925571881fe57243935c6c1Chris Lattner/// debugging dumps, etc.
493da8249e57f3badecf925571881fe57243935c6c1Chris Lattnerdouble FloatingLiteral::getValueAsApproximateDouble() const {
494da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  llvm::APFloat V = getValue();
495ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  bool ignored;
496ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen  V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
497ee5a700af3fe9ae1a639c271f093f40677dddc04Dale Johannesen            &ignored);
498da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  return V.convertToDouble();
499da8249e57f3badecf925571881fe57243935c6c1Chris Lattner}
500da8249e57f3badecf925571881fe57243935c6c1Chris Lattner
50165aa6885818d4b4eea2e5a9d12085b2398148662Jay FoadStringLiteral *StringLiteral::Create(ASTContext &C, llvm::StringRef Str,
50265aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad                                     bool Wide,
5033e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson                                     bool Pascal, QualType Ty,
5041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const SourceLocation *Loc,
505a135fb43eb94524a6529768596a4533eed9aa70dAnders Carlsson                                     unsigned NumStrs) {
5062085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  // Allocate enough space for the StringLiteral plus an array of locations for
5072085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  // any concatenated string tokens.
5082085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  void *Mem = C.Allocate(sizeof(StringLiteral)+
5092085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner                         sizeof(SourceLocation)*(NumStrs-1),
5103248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner                         llvm::alignOf<StringLiteral>());
5112085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  StringLiteral *SL = new (Mem) StringLiteral(Ty);
5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // OPTIMIZE: could allocate this appended to the StringLiteral.
51465aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad  char *AStrData = new (C, 1) char[Str.size()];
51565aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad  memcpy(AStrData, Str.data(), Str.size());
5162085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->StrData = AStrData;
51765aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad  SL->ByteLength = Str.size();
5182085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->IsWide = Wide;
5193e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  SL->IsPascal = Pascal;
5202085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->TokLocs[0] = Loc[0];
5212085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  SL->NumConcatenated = NumStrs;
5225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
523726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner  if (NumStrs != 1)
5242085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner    memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
5252085fd6cd22ec5c268175251db10d7c60caf7aaaChris Lattner  return SL;
526726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner}
527726e168dc09fb23f53c7b004f8e919421ee91806Chris Lattner
528673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas GregorStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
529673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  void *Mem = C.Allocate(sizeof(StringLiteral)+
530673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor                         sizeof(SourceLocation)*(NumStrs-1),
5313248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner                         llvm::alignOf<StringLiteral>());
532673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  StringLiteral *SL = new (Mem) StringLiteral(QualType());
533673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->StrData = 0;
534673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->ByteLength = 0;
535673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  SL->NumConcatenated = NumStrs;
536673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  return SL;
537673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor}
538673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
539b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbarvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) {
540b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  char *AStrData = new (C, 1) char[Str.size()];
541b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  memcpy(AStrData, Str.data(), Str.size());
542673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor  StrData = AStrData;
543b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  ByteLength = Str.size();
544673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor}
545673ecd6a4a9f7c12fb6f76f84f654dbdcdc89e76Douglas Gregor
54608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// getLocationOfByte - Return a source location that points to the specified
54708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// byte of this string literal.
54808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner///
54908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// Strings are amazingly complex.  They can be formed from multiple tokens and
55008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// can have escape sequences in them in addition to the usual trigraph and
55108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner/// escaped newline business.  This routine handles this complexity.
55208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner///
55308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnerSourceLocation StringLiteral::
55408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris LattnergetLocationOfByte(unsigned ByteNo, const SourceManager &SM,
55508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                  const LangOptions &Features, const TargetInfo &Target) const {
55608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  assert(!isWide() && "This doesn't work for wide strings yet");
55708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
55808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  // Loop over all of the tokens in this string until we find the one that
55908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  // contains the byte we're looking for.
56008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  unsigned TokNo = 0;
56108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  while (1) {
56208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    assert(TokNo < getNumConcatenated() && "Invalid byte number!");
56308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
56408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
56508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Get the spelling of the string so that we can get the data that makes up
56608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // the string literal, not the identifier for the macro it is potentially
56708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // expanded through.
56808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
56908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
57008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Re-lex the token to get its length and original spelling.
57108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc);
57208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    bool Invalid = false;
57308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
57408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    if (Invalid)
57508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      return StrTokSpellingLoc;
57608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
57708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    const char *StrData = Buffer.data()+LocInfo.second;
57808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
57908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Create a langops struct and enable trigraphs.  This is sufficient for
58008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // relexing tokens.
58108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    LangOptions LangOpts;
58208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    LangOpts.Trigraphs = true;
58308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
58408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Create a lexer starting at the beginning of this token.
58508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData,
58608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner                   Buffer.end());
58708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    Token TheTok;
58808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    TheLexer.LexFromRawLexer(TheTok);
58908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
59008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Use the StringLiteralParser to compute the length of the string in bytes.
59108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    StringLiteralParser SLP(&TheTok, 1, SM, Features, Target);
59208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    unsigned TokNumBytes = SLP.GetStringLength();
59308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
59408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // If the byte is in this token, return the location of the byte.
59508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    if (ByteNo < TokNumBytes ||
59608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner        (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) {
59708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
59808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
59908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      // Now that we know the offset of the token in the spelling, use the
60008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      // preprocessor to get the offset in the original source.
60108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner      return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
60208f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    }
60308f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
60408f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    // Move to the next string token.
60508f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    ++TokNo;
60608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    ByteNo -= TokNumBytes;
60708f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner  }
60808f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner}
60908f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
61008f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
61108f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner
6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "sizeof" or "[pre]++".
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *UnaryOperator::getOpcodeStr(Opcode Op) {
6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (Op) {
6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown unary operator");
6172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostInc: return "++";
6182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostDec: return "--";
6192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PreInc:  return "++";
6202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PreDec:  return "--";
6212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_AddrOf:  return "&";
6222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Deref:   return "*";
6232de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus:    return "+";
6242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus:   return "-";
6252de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Not:     return "~";
6262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_LNot:    return "!";
6272de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Real:    return "__real";
6282de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Imag:    return "__imag";
6292de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Extension: return "__extension__";
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6332de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallUnaryOperatorKind
634bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
635bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  switch (OO) {
636bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  default: assert(false && "No unary operator for overloaded function");
6372de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PlusPlus:   return Postfix ? UO_PostInc : UO_PreInc;
6382de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
6392de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Amp:        return UO_AddrOf;
6402de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Star:       return UO_Deref;
6412de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Plus:       return UO_Plus;
6422de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Minus:      return UO_Minus;
6432de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Tilde:      return UO_Not;
6442de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Exclaim:    return UO_LNot;
645bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  }
646bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}
647bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
648bc736fceca6f0bca31d16003a7587857190408fbDouglas GregorOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
649bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  switch (Opc) {
6502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
6512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
6522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_AddrOf: return OO_Amp;
6532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Deref: return OO_Star;
6542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Plus: return OO_Plus;
6552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Minus: return OO_Minus;
6562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_Not: return OO_Tilde;
6572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case UO_LNot: return OO_Exclaim;
658bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  default: return OO_None;
659bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor  }
660bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor}
661bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
662bc736fceca6f0bca31d16003a7587857190408fbDouglas Gregor
6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Postfix Operators.
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
6665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
667cc324ad80ab940efca006b0064f7ca70a6181816Peter CollingbourneCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
668cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne                   Expr **args, unsigned numargs, QualType t, ExprValueKind VK,
669f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   SourceLocation rparenloc)
670f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(SC, t, VK, OK_Ordinary,
671bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isTypeDependent(),
672bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isValueDependent(),
673bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->containsUnexpandedParameterPack()),
674898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    NumArgs(numargs) {
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
676cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  SubExprs = new (C) Stmt*[numargs+PREARGS_START+NumPreArgs];
677b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  SubExprs[FN] = fn;
678bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != numargs; ++i) {
679bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
680bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
681bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
682bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
683bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
684bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
685bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
686cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    SubExprs[i+PREARGS_START+NumPreArgs] = args[i];
687bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
688668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
689cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExprBits.NumPreArgs = NumPreArgs;
690b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  RParenLoc = rparenloc;
691b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
692e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
693668bf91d31265b6ea8c3eb854ba450857701f269Ted KremenekCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
694f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                   QualType t, ExprValueKind VK, SourceLocation rparenloc)
695f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(CallExprClass, t, VK, OK_Ordinary,
696bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isTypeDependent(),
697bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->isValueDependent(),
698bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         fn->containsUnexpandedParameterPack()),
699898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    NumArgs(numargs) {
700668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
701cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  SubExprs = new (C) Stmt*[numargs+PREARGS_START];
70277ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek  SubExprs[FN] = fn;
703bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != numargs; ++i) {
704bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
705bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
706bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
707bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
708bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
709bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
710bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
711cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne    SubExprs[i+PREARGS_START] = args[i];
712bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
713668bf91d31265b6ea8c3eb854ba450857701f269Ted Kremenek
714cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExprBits.NumPreArgs = 0;
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RParenLoc = rparenloc;
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
720bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  // FIXME: Why do we allocate this?
721cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  SubExprs = new (C) Stmt*[PREARGS_START];
722cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExprBits.NumPreArgs = 0;
723cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne}
724cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne
725cc324ad80ab940efca006b0064f7ca70a6181816Peter CollingbourneCallExpr::CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs,
726cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne                   EmptyShell Empty)
727cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
728cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  // FIXME: Why do we allocate this?
729cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  SubExprs = new (C) Stmt*[PREARGS_START+NumPreArgs];
730cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  CallExprBits.NumPreArgs = NumPreArgs;
7311f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor}
7321f0d0133b0e8d1f01f63951ee04927796b34740dDouglas Gregor
733d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesDecl *CallExpr::getCalleeDecl() {
734a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  Expr *CEE = getCallee()->IgnoreParenCasts();
735200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  // If we're calling a dereference, look at the pointer instead.
736200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
737200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl    if (BO->isPtrMemOp())
738200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl      CEE = BO->getRHS()->IgnoreParenCasts();
739200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
740200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl    if (UO->getOpcode() == UO_Deref)
741200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl      CEE = UO->getSubExpr()->IgnoreParenCasts();
742200121569dc6cff10a1fb6ed7500098770b9dd25Sebastian Redl  }
7436346f963145ed18b6edf50a78753b47db505e912Chris Lattner  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
744d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes    return DRE->getDecl();
745cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes  if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
746cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes    return ME->getMemberDecl();
747a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
748a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu  return 0;
749a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu}
750a00425414e8c209cabc25d1826b200aeb94259afZhongxing Xu
751d20254f2875d0004c57ee766f258dbcee29f4841Nuno LopesFunctionDecl *CallExpr::getDirectCallee() {
752caabf9bf331156e96dacb072385901fdfa057ec1Chris Lattner  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
753d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes}
754d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes
755d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// setNumArgs - This changes the number of arguments present in this call.
756d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// Any orphaned expressions are deleted by this, and any new operands are set
757d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner/// to null.
7588189cde56b4f6f938cd65f53c932fe1860d0204cTed Kremenekvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
759d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // No change, just return.
760d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  if (NumArgs == getNumArgs()) return;
7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
762d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // If shrinking # arguments, just delete the extras and forgot them.
763d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  if (NumArgs < getNumArgs()) {
764d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    this->NumArgs = NumArgs;
765d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    return;
766d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  }
767d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner
768d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Otherwise, we are growing the # arguments.  New an bigger argument array.
769cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  unsigned NumPreArgs = getNumPreArgs();
770cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  Stmt **NewSubExprs = new (C) Stmt*[NumArgs+PREARGS_START+NumPreArgs];
771d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Copy over args.
772cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  for (unsigned i = 0; i != getNumArgs()+PREARGS_START+NumPreArgs; ++i)
773d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    NewSubExprs[i] = SubExprs[i];
774d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  // Null out new args.
775cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne  for (unsigned i = getNumArgs()+PREARGS_START+NumPreArgs;
776cc324ad80ab940efca006b0064f7ca70a6181816Peter Collingbourne       i != NumArgs+PREARGS_START+NumPreArgs; ++i)
777d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner    NewSubExprs[i] = 0;
7781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
77988c9a46f0b84f1ee83e01917825346551ee540d0Douglas Gregor  if (SubExprs) C.Deallocate(SubExprs);
780d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  SubExprs = NewSubExprs;
781d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner  this->NumArgs = NumArgs;
782d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner}
783d18b3299debb7b0dbd9d34d9369189dc98c87f53Chris Lattner
784cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
785cb888967400a03504c88acedd5248d6778a82f46Chris Lattner/// not, return 0.
7864ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadunsigned CallExpr::isBuiltinCall(const ASTContext &Context) const {
787c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  // All simple function calls (e.g. func()) are implicitly cast to pointer to
7881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // function. As a result, we try and obtain the DeclRefExpr from the
789c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  // ImplicitCastExpr.
790c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
791c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
792cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
7931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
794c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
795c4f8e8b645b8e0e685c089dde0674c6f29a24168Steve Naroff  if (!DRE)
796cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
798bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
799bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson  if (!FDecl)
800cb888967400a03504c88acedd5248d6778a82f46Chris Lattner    return 0;
8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8024fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor  if (!FDecl->getIdentifier())
8034fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor    return 0;
8044fcd399a52ae45ed8ebfdd3a25e01cfb76fa366dDouglas Gregor
8057814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor  return FDecl->getBuiltinID();
806cb888967400a03504c88acedd5248d6778a82f46Chris Lattner}
807bcba201a1118d7852b8b97187d495ae2a4f49519Anders Carlsson
8086dde78f744382a5627a04f984a97049e0c4b5e73Anders CarlssonQualType CallExpr::getCallReturnType() const {
8096dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  QualType CalleeType = getCallee()->getType();
8106217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
8116dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson    CalleeType = FnTypePtr->getPointeeType();
8126217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
8136dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson    CalleeType = BPT->getPointeeType();
814864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  else if (CalleeType->isSpecificPlaceholderType(BuiltinType::BoundMember))
815864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    // This should never be overloaded and so should never return null.
816864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    CalleeType = Expr::findBoundMemberType(getCallee());
8175291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor
818864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  const FunctionType *FnType = CalleeType->castAs<FunctionType>();
8196dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson  return FnType->getResultType();
8206dde78f744382a5627a04f984a97049e0c4b5e73Anders Carlsson}
821cb888967400a03504c88acedd5248d6778a82f46Chris Lattner
8222882eca5a184c78f793188083f6ce539740a5cf2John McCallSourceRange CallExpr::getSourceRange() const {
8232882eca5a184c78f793188083f6ce539740a5cf2John McCall  if (isa<CXXOperatorCallExpr>(this))
8242882eca5a184c78f793188083f6ce539740a5cf2John McCall    return cast<CXXOperatorCallExpr>(this)->getSourceRange();
8252882eca5a184c78f793188083f6ce539740a5cf2John McCall
8262882eca5a184c78f793188083f6ce539740a5cf2John McCall  SourceLocation begin = getCallee()->getLocStart();
8272882eca5a184c78f793188083f6ce539740a5cf2John McCall  if (begin.isInvalid() && getNumArgs() > 0)
8282882eca5a184c78f793188083f6ce539740a5cf2John McCall    begin = getArg(0)->getLocStart();
8292882eca5a184c78f793188083f6ce539740a5cf2John McCall  SourceLocation end = getRParenLoc();
8302882eca5a184c78f793188083f6ce539740a5cf2John McCall  if (end.isInvalid() && getNumArgs() > 0)
8312882eca5a184c78f793188083f6ce539740a5cf2John McCall    end = getArg(getNumArgs() - 1)->getLocEnd();
8322882eca5a184c78f793188083f6ce539740a5cf2John McCall  return SourceRange(begin, end);
8332882eca5a184c78f793188083f6ce539740a5cf2John McCall}
8342882eca5a184c78f793188083f6ce539740a5cf2John McCall
835c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
8368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   SourceLocation OperatorLoc,
837c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                   TypeSourceInfo *tsi,
838c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                   OffsetOfNode* compsPtr, unsigned numComps,
8398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   Expr** exprsPtr, unsigned numExprs,
8408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                   SourceLocation RParenLoc) {
8418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
842c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                         sizeof(OffsetOfNode) * numComps +
8438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(Expr*) * numExprs);
8448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8458ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
8468ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                exprsPtr, numExprs, RParenLoc);
8478ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8498ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorOffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
8508ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                                        unsigned numComps, unsigned numExprs) {
8518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
8528ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(OffsetOfNode) * numComps +
8538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                         sizeof(Expr*) * numExprs);
8548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return new (Mem) OffsetOfExpr(numComps, numExprs);
8558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8568ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
857c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntOffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
8588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           SourceLocation OperatorLoc, TypeSourceInfo *tsi,
859c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                           OffsetOfNode* compsPtr, unsigned numComps,
8608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           Expr** exprsPtr, unsigned numExprs,
8618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                           SourceLocation RParenLoc)
862f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
863f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall         /*TypeDependent=*/false,
864bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*ValueDependent=*/tsi->getType()->isDependentType(),
865bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         tsi->getType()->containsUnexpandedParameterPack()),
866c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
867c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    NumComps(numComps), NumExprs(numExprs)
8688ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor{
8698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for(unsigned i = 0; i < numComps; ++i) {
8708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    setComponent(i, compsPtr[i]);
8718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
872c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for(unsigned i = 0; i < numExprs; ++i) {
874bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent())
875bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
876bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprsPtr[i]->containsUnexpandedParameterPack())
877bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
878bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
8798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    setIndexExpr(i, exprsPtr[i]);
8808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
8818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas GregorIdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
8848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(getKind() == Field || getKind() == Identifier);
8858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  if (getKind() == Field)
8868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    return getField()->getIdentifier();
887c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
8898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
8911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
89240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor                               NestedNameSpecifierLoc QualifierLoc,
893f595cc41c4d95fe323f8a2b209523de9956f874dEli Friedman                               ValueDecl *memberdecl,
894161755a09898c95d21bfff33707da9ca41cd53c5John McCall                               DeclAccessPair founddecl,
8952577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                               DeclarationNameInfo nameinfo,
896d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall                               const TemplateArgumentListInfo *targs,
897f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               QualType ty,
898f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ExprValueKind vk,
899f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                               ExprObjectKind ok) {
90083f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  std::size_t Size = sizeof(MemberExpr);
9016bb8017bb9e828d118e15e59d71c66bba323c364John McCall
90240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor  bool hasQualOrFound = (QualifierLoc ||
903161755a09898c95d21bfff33707da9ca41cd53c5John McCall                         founddecl.getDecl() != memberdecl ||
904161755a09898c95d21bfff33707da9ca41cd53c5John McCall                         founddecl.getAccess() != memberdecl->getAccess());
9056bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (hasQualOrFound)
9066bb8017bb9e828d118e15e59d71c66bba323c364John McCall    Size += sizeof(MemberNameQualifier);
9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
908d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  if (targs)
909d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall    Size += ExplicitTemplateArgumentList::sizeFor(*targs);
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9113248854a5d16e1de17c58e05f726bdef9f042df2Chris Lattner  void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
912f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
913f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                       ty, vk, ok);
9146bb8017bb9e828d118e15e59d71c66bba323c364John McCall
9156bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (hasQualOrFound) {
91640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    // FIXME: Wrong. We should be looking at the member declaration we found.
91740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) {
9186bb8017bb9e828d118e15e59d71c66bba323c364John McCall      E->setValueDependent(true);
9196bb8017bb9e828d118e15e59d71c66bba323c364John McCall      E->setTypeDependent(true);
9206bb8017bb9e828d118e15e59d71c66bba323c364John McCall    }
9216bb8017bb9e828d118e15e59d71c66bba323c364John McCall    E->HasQualifierOrFoundDecl = true;
9226bb8017bb9e828d118e15e59d71c66bba323c364John McCall
9236bb8017bb9e828d118e15e59d71c66bba323c364John McCall    MemberNameQualifier *NQ = E->getMemberQualifier();
92440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor    NQ->QualifierLoc = QualifierLoc;
9256bb8017bb9e828d118e15e59d71c66bba323c364John McCall    NQ->FoundDecl = founddecl;
9266bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
9276bb8017bb9e828d118e15e59d71c66bba323c364John McCall
9286bb8017bb9e828d118e15e59d71c66bba323c364John McCall  if (targs) {
9296bb8017bb9e828d118e15e59d71c66bba323c364John McCall    E->HasExplicitTemplateArgumentList = true;
930096832c5ed5b9106fa177ebc148489760c3bc496John McCall    E->getExplicitTemplateArgs().initializeFrom(*targs);
9316bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
9326bb8017bb9e828d118e15e59d71c66bba323c364John McCall
9336bb8017bb9e828d118e15e59d71c66bba323c364John McCall  return E;
93483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor}
93583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
93675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas GregorSourceRange MemberExpr::getSourceRange() const {
93775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  SourceLocation StartLoc;
93875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  if (isImplicitAccess()) {
93975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    if (hasQualifier())
94075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      StartLoc = getQualifierLoc().getBeginLoc();
94175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    else
94275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      StartLoc = MemberLoc;
94375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  } else {
94475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    // FIXME: We don't want this to happen. Rather, we should be able to
94575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    // detect all kinds of implicit accesses more cleanly.
94675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    StartLoc = getBase()->getLocStart();
94775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    if (StartLoc.isInvalid())
94875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      StartLoc = MemberLoc;
94975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  }
95075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
95175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  SourceLocation EndLoc =
95275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    HasExplicitTemplateArgumentList? getRAngleLoc()
95375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor                                   : getMemberNameInfo().getEndLoc();
95475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
95575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  return SourceRange(StartLoc, EndLoc);
95675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor}
95775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
958f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlssonconst char *CastExpr::getCastKindName() const {
959f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  switch (getCastKind()) {
960daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_Dependent:
961daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "Dependent";
9622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BitCast:
963f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "BitCast";
9642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_LValueBitCast:
965e39a3894513349908cdb3beba2614e53cb288e6cDouglas Gregor    return "LValueBitCast";
9660ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall  case CK_LValueToRValue:
9670ae287a498b8cec2086fe6b7e753cbb3df63e74aJohn McCall    return "LValueToRValue";
968f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  case CK_GetObjCProperty:
969f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    return "GetObjCProperty";
9702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NoOp:
971f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "NoOp";
9722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerived:
97311de6de25a0110cd7be97eef761ef3b189781da6Anders Carlsson    return "BaseToDerived";
9742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBase:
975f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "DerivedToBase";
9762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UncheckedDerivedToBase:
97723cba801e11b03929c44f8cf54578305963a3476John McCall    return "UncheckedDerivedToBase";
9782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_Dynamic:
979f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "Dynamic";
9802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToUnion:
981f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ToUnion";
9822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ArrayToPointerDecay:
983f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ArrayToPointerDecay";
9842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FunctionToPointerDecay:
985f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "FunctionToPointerDecay";
9862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_NullToMemberPointer:
987f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "NullToMemberPointer";
988404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall  case CK_NullToPointer:
989404cd1669c3ba138a9ae0a619bd689cce5aae271John McCall    return "NullToPointer";
9902de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_BaseToDerivedMemberPointer:
991f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "BaseToDerivedMemberPointer";
9922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_DerivedToBaseMemberPointer:
9931a31a18db9d657751f38c724adc0d62e86852bd7Anders Carlsson    return "DerivedToBaseMemberPointer";
9942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_UserDefinedConversion:
995f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "UserDefinedConversion";
9962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ConstructorConversion:
997f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson    return "ConstructorConversion";
9982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToPointer:
9997f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return "IntegralToPointer";
10002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_PointerToIntegral:
10017f9e646b7ed47bc8e9a60031ad0c2b55031e2077Anders Carlsson    return "PointerToIntegral";
1002daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_PointerToBoolean:
1003daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "PointerToBoolean";
10042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ToVoid:
1005ebeaf2031c968143c531bfe232d7507f20c57347Anders Carlsson    return "ToVoid";
10062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_VectorSplat:
100716a8904f3f5ed19158657e1da95e5902fbee66f7Anders Carlsson    return "VectorSplat";
10082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralCast:
100982debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "IntegralCast";
1010daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_IntegralToBoolean:
1011daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "IntegralToBoolean";
10122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_IntegralToFloating:
101382debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "IntegralToFloating";
10142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingToIntegral:
101582debc7d282e723e58d183bfa89ddc2500a8daafAnders Carlsson    return "FloatingToIntegral";
10162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_FloatingCast:
1017c6b29163557d02da5d2a4a06f986f0480291f51fBenjamin Kramer    return "FloatingCast";
1018daa8e4e888758d55a7a759dd4a91b83921cef222John McCall  case CK_FloatingToBoolean:
1019daa8e4e888758d55a7a759dd4a91b83921cef222John McCall    return "FloatingToBoolean";
10202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_MemberPointerToBoolean:
1021bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson    return "MemberPointerToBoolean";
10222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToObjCPointerCast:
10234cbf9d43cc47bb7a070c5c5026521d7d6a8f73c7Fariborz Jahanian    return "AnyPointerToObjCPointerCast";
10242de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_AnyPointerToBlockPointerCast:
10253b27f1a80e4e433b503efd344c909eeafaa9033cFariborz Jahanian    return "AnyPointerToBlockPointerCast";
10262de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case CK_ObjCObjectLValueCast:
1027569c3166874324c24011f8ade6978421f0d39b3cDouglas Gregor    return "ObjCObjectLValueCast";
10282bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_FloatingRealToComplex:
10292bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "FloatingRealToComplex";
1030f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToReal:
1031f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToReal";
1032f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToBoolean:
1033f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToBoolean";
10342bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_FloatingComplexCast:
10352bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "FloatingComplexCast";
1036f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_FloatingComplexToIntegralComplex:
1037f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "FloatingComplexToIntegralComplex";
10382bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_IntegralRealToComplex:
10392bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "IntegralRealToComplex";
1040f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToReal:
1041f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToReal";
1042f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToBoolean:
1043f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToBoolean";
10442bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  case CK_IntegralComplexCast:
10452bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall    return "IntegralComplexCast";
1046f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall  case CK_IntegralComplexToFloatingComplex:
1047f3ea8cfe6b1c2ef0702efe130561e9e66708d799John McCall    return "IntegralComplexToFloatingComplex";
1048f85e193739c953358c865005855253af4f68a497John McCall  case CK_ObjCConsumeObject:
1049f85e193739c953358c865005855253af4f68a497John McCall    return "ObjCConsumeObject";
1050f85e193739c953358c865005855253af4f68a497John McCall  case CK_ObjCProduceObject:
1051f85e193739c953358c865005855253af4f68a497John McCall    return "ObjCProduceObject";
1052f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  }
10531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10542bb5d00fcf71a7b4d478d478be778fff0494aff6John McCall  llvm_unreachable("Unhandled cast kind!");
1055f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson  return 0;
1056f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson}
1057f8ec55a104e55961f8666f773dce99bbc628298fAnders Carlsson
10586eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas GregorExpr *CastExpr::getSubExprAsWritten() {
10596eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  Expr *SubExpr = 0;
10606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  CastExpr *E = this;
10616eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  do {
10626eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    SubExpr = E->getSubExpr();
106303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
106403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // Skip through reference binding to temporary.
106503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    if (MaterializeTemporaryExpr *Materialize
106603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                  = dyn_cast<MaterializeTemporaryExpr>(SubExpr))
106703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      SubExpr = Materialize->GetTemporaryExpr();
106803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
10696eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // Skip any temporary bindings; they're implicit.
10706eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
10716eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = Binder->getSubExpr();
1072c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
10736eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // Conversions by constructor and conversion functions have a
10746eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // subexpression describing the call; strip it off.
10752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (E->getCastKind() == CK_ConstructorConversion)
10766eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
10772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    else if (E->getCastKind() == CK_UserDefinedConversion)
10786eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor      SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
1079c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
10806eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // If the subexpression we're left with is an implicit cast, look
10816eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    // through that, too.
1082c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
1083c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
10846eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return SubExpr;
10856eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor}
10866eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor
1087f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCXXBaseSpecifier **CastExpr::path_buffer() {
1088f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  switch (getStmtClass()) {
1089f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define ABSTRACT_STMT(x)
1090f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define CASTEXPR(Type, Base) \
1091f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  case Stmt::Type##Class: \
1092f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
1093f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#define STMT(Type, Base)
1094f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall#include "clang/AST/StmtNodes.inc"
1095f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  default:
1096f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    llvm_unreachable("non-cast expressions not possible here");
1097f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    return 0;
1098f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  }
1099f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1100f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1101f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallvoid CastExpr::setCastPath(const CXXCastPath &Path) {
1102f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(Path.size() == path_size());
1103f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
1104f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1105f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1106f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T,
1107f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                           CastKind Kind, Expr *Operand,
1108f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                           const CXXCastPath *BasePath,
11095baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall                                           ExprValueKind VK) {
1110f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1111f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1112f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1113f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  ImplicitCastExpr *E =
11145baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
1115f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
1116f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
1117f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1118f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1119f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C,
1120f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                                unsigned PathSize) {
1121f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1122f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1123f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
1124f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1125f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1126f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1127f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T,
1128f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                       ExprValueKind VK, CastKind K, Expr *Op,
1129f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       const CXXCastPath *BasePath,
1130f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       TypeSourceInfo *WrittenTy,
1131f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall                                       SourceLocation L, SourceLocation R) {
1132f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1133f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1134f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1135f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CStyleCastExpr *E =
1136f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
1137f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (PathSize) E->setCastPath(*BasePath);
1138f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return E;
1139f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1140f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
1141f871d0cc377a1367b519a6cce26be74607566ebaJohn McCallCStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
1142f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  void *Buffer =
1143f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1144f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
1145f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall}
1146f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall
11475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
11485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// corresponds to, e.g. "<<=".
11495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BinaryOperator::getOpcodeStr(Opcode Op) {
11505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (Op) {
11512de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemD:   return ".*";
11522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_PtrMemI:   return "->*";
11532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Mul:       return "*";
11542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Div:       return "/";
11552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Rem:       return "%";
11562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Add:       return "+";
11572de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Sub:       return "-";
11582de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shl:       return "<<";
11592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Shr:       return ">>";
11602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LT:        return "<";
11612de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GT:        return ">";
11622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LE:        return "<=";
11632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_GE:        return ">=";
11642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_EQ:        return "==";
11652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_NE:        return "!=";
11662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_And:       return "&";
11672de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Xor:       return "^";
11682de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Or:        return "|";
11692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LAnd:      return "&&";
11702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_LOr:       return "||";
11712de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Assign:    return "=";
11722de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_MulAssign: return "*=";
11732de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_DivAssign: return "/=";
11742de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_RemAssign: return "%=";
11752de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_AddAssign: return "+=";
11762de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_SubAssign: return "-=";
11772de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_ShlAssign: return "<<=";
11782de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_ShrAssign: return ">>=";
11792de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_AndAssign: return "&=";
11802de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_XorAssign: return "^=";
11812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_OrAssign:  return "|=";
11822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case BO_Comma:     return ",";
11835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1184baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor
1185baf534875ed0a55c6342636ff3f4602b8ac22b69Douglas Gregor  return "";
11865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
11882de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCallBinaryOperatorKind
1189063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
1190063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  switch (OO) {
1191b7beee9f2b52f34a3b0800a5f0038f0e4295b260Chris Lattner  default: assert(false && "Not an overloadable binary operator");
11922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Plus: return BO_Add;
11932de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Minus: return BO_Sub;
11942de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Star: return BO_Mul;
11952de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Slash: return BO_Div;
11962de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Percent: return BO_Rem;
11972de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Caret: return BO_Xor;
11982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Amp: return BO_And;
11992de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Pipe: return BO_Or;
12002de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Equal: return BO_Assign;
12012de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Less: return BO_LT;
12022de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Greater: return BO_GT;
12032de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PlusEqual: return BO_AddAssign;
12042de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_MinusEqual: return BO_SubAssign;
12052de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_StarEqual: return BO_MulAssign;
12062de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_SlashEqual: return BO_DivAssign;
12072de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PercentEqual: return BO_RemAssign;
12082de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_CaretEqual: return BO_XorAssign;
12092de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_AmpEqual: return BO_AndAssign;
12102de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PipeEqual: return BO_OrAssign;
12112de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessLess: return BO_Shl;
12122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterGreater: return BO_Shr;
12132de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessLessEqual: return BO_ShlAssign;
12142de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterGreaterEqual: return BO_ShrAssign;
12152de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_EqualEqual: return BO_EQ;
12162de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_ExclaimEqual: return BO_NE;
12172de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_LessEqual: return BO_LE;
12182de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_GreaterEqual: return BO_GE;
12192de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_AmpAmp: return BO_LAnd;
12202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_PipePipe: return BO_LOr;
12212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_Comma: return BO_Comma;
12222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  case OO_ArrowStar: return BO_PtrMemI;
1223063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  }
1224063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor}
1225063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
1226063daf6e196c51f162e0485478355d8e280eef5cDouglas GregorOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
1227063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  static const OverloadedOperatorKind OverOps[] = {
1228063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
1229063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Star, OO_Slash, OO_Percent,
1230063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Plus, OO_Minus,
1231063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_LessLess, OO_GreaterGreater,
1232063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
1233063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_EqualEqual, OO_ExclaimEqual,
1234063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Amp,
1235063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Caret,
1236063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Pipe,
1237063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_AmpAmp,
1238063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PipePipe,
1239063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Equal, OO_StarEqual,
1240063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_SlashEqual, OO_PercentEqual,
1241063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PlusEqual, OO_MinusEqual,
1242063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_LessLessEqual, OO_GreaterGreaterEqual,
1243063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_AmpEqual, OO_CaretEqual,
1244063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_PipeEqual,
1245063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor    OO_Comma
1246063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  };
1247063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor  return OverOps[Opc];
1248063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor}
1249063daf6e196c51f162e0485478355d8e280eef5cDouglas Gregor
1250709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekInitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
1251418f6c7d142e5ff4607f70cd8431d008442bafe9Chris Lattner                           Expr **initExprs, unsigned numInits,
12524c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor                           SourceLocation rbraceloc)
1253bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
1254bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         false),
1255709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs(C, numInits),
12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
12574423ac0282acb8ba801eb05b38712438dc0c1e3eArgyrios Kyrtzidis    HadArrayRangeDesignator(false)
1258c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt{
1259ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  for (unsigned I = 0; I != numInits; ++I) {
1260ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    if (initExprs[I]->isTypeDependent())
12618e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      ExprBits.TypeDependent = true;
1262ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    if (initExprs[I]->isValueDependent())
12638e6285af719adc6f86d6faa235d22a08eb68ee3aJohn McCall      ExprBits.ValueDependent = true;
1264bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (initExprs[I]->containsUnexpandedParameterPack())
1265bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
126673460a32bc5299a5927d23d2e464d72af796eabfDouglas Gregor  }
1267c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
1268709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
126966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
12705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1271709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
1272ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  if (NumInits > InitExprs.size())
1273709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs.reserve(C, NumInits);
1274fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor}
1275fa2192042f223b5122a9e17719930f77634fd31fDouglas Gregor
1276709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenekvoid InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
1277709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  InitExprs.resize(C, NumInits, 0);
12784c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor}
12794c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
1280709210feee317b8d6690dd1d15c2b74cfe55e261Ted KremenekExpr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
1281ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek  if (Init >= InitExprs.size()) {
1282709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek    InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
1283ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    InitExprs.back() = expr;
1284ba7bc5584b8d46f4e8deb3a9d363256908fa86eaTed Kremenek    return 0;
12854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
12884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  InitExprs[Init] = expr;
12894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  return Result;
12904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor}
12914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
12923e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidisvoid InitListExpr::setArrayFiller(Expr *filler) {
12933e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis  ArrayFillerOrUnionFieldInit = filler;
12943e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis  // Fill out any "holes" in the array due to designated initializers.
12953e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis  Expr **inits = getInits();
12963e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis  for (unsigned i = 0, e = getNumInits(); i != e; ++i)
12973e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis    if (inits[i] == 0)
12983e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis      inits[i] = filler;
12993e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis}
13003e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2Argyrios Kyrtzidis
1301c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted KremenekSourceRange InitListExpr::getSourceRange() const {
1302c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (SyntacticForm)
1303c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    return SyntacticForm->getSourceRange();
1304c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  SourceLocation Beg = LBraceLoc, End = RBraceLoc;
1305c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (Beg.isInvalid()) {
1306c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    // Find the first non-null initializer.
1307c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    for (InitExprsTy::const_iterator I = InitExprs.begin(),
1308c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek                                     E = InitExprs.end();
1309c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      I != E; ++I) {
1310c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      if (Stmt *S = *I) {
1311c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        Beg = S->getLocStart();
1312c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        break;
1313c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      }
1314c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    }
1315c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  }
1316c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  if (End.isInvalid()) {
1317c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    // Find the first non-null initializer from the end.
1318c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(),
1319c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek                                             E = InitExprs.rend();
1320c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      I != E; ++I) {
1321c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      if (Stmt *S = *I) {
1322c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        End = S->getSourceRange().getEnd();
1323c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek        break;
1324c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek      }
1325c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek    }
1326c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  }
1327c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek  return SourceRange(Beg, End);
1328c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek}
1329c4ba51f365a3cd3374b3ef87272a9b3e517cd5d3Ted Kremenek
1330bfdcae678d44906293e21c0cddc6537f3ee8b5a4Steve Naroff/// getFunctionType - Return the underlying function type for this block.
13314eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff///
13324eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffconst FunctionType *BlockExpr::getFunctionType() const {
13336217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek  return getType()->getAs<BlockPointerType>()->
1334183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall                    getPointeeType()->getAs<FunctionType>();
13354eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
13364eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
13371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSourceLocation BlockExpr::getCaretLocation() const {
13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return TheBlock->getCaretLocation();
133956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
13401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst Stmt *BlockExpr::getBody() const {
13417297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor  return TheBlock->getBody();
13427297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor}
13431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpStmt *BlockExpr::getBody() {
13441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return TheBlock->getBody();
13457297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor}
134656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
134756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
13485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
13495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Generic Expression Routines
13505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
13515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1352026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// isUnusedResultAWarning - Return true if this immediate expression should
1353026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// be warned about if the result is unused.  If so, fill in Loc and Ranges
1354026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// with location to warn on and the source range[s] to report with the
1355026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner/// warning.
1356026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattnerbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
1357df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump                                  SourceRange &R2, ASTContext &Ctx) const {
1358ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  // Don't warn if the expr is type dependent. The type could end up
1359ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  // instantiating to void.
1360ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson  if (isTypeDependent())
1361ffce2df6ae280d354d51371282a579df1eb86876Anders Carlsson    return false;
13621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (getStmtClass()) {
13645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
13650faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
13660faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
1367026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = getExprLoc();
1368026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = getSourceRange();
1369026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
13705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ParenExprClass:
1371026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return cast<ParenExpr>(this)->getSubExpr()->
1372df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      isUnusedResultAWarning(Loc, R1, R2, Ctx);
1373f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  case GenericSelectionExprClass:
1374f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<GenericSelectionExpr>(this)->getResultExpr()->
1375f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      isUnusedResultAWarning(Loc, R1, R2, Ctx);
13765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UnaryOperatorClass: {
13775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const UnaryOperator *UO = cast<UnaryOperator>(this);
13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    switch (UO->getOpcode()) {
1380026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    default: break;
13812de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostInc:
13822de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PostDec:
13832de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreInc:
13842de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_PreDec:                 // ++/--
1385026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;  // Not a warning.
13862de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Deref:
13875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // Dereferencing a volatile pointer is a side-effect.
1388df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1389026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner        return false;
1390026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      break;
13912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
13922de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
13935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // accessing a piece of a volatile complex is a side-effect.
1394df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
1395df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump          .isVolatileQualified())
1396026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner        return false;
1397026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      break;
13982de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
1399df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
14005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1401026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = UO->getOperatorLoc();
1402026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = UO->getSubExpr()->getSourceRange();
1403026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
14045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1405e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner  case BinaryOperatorClass: {
1406026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    const BinaryOperator *BO = cast<BinaryOperator>(this);
1407c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek    switch (BO->getOpcode()) {
1408c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek      default:
1409c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        break;
141025973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Consider the RHS of comma for side effects. LHS was checked by
141125973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Sema::CheckCommaOperands.
14122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_Comma:
1413c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        // ((foo = <blah>), 0) is an idiom for hiding the result (and
1414c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        // lvalue-ness) of an assignment written in a macro.
1415c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek        if (IntegerLiteral *IE =
1416c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek              dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
1417c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek          if (IE->getValue() == 0)
1418c46a246f5fb00bf8448a1081e7d7e73bb6dbfbf5Ted Kremenek            return false;
141925973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
142025973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis      // Consider '||', '&&' to have side effects if the LHS or RHS does.
14212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_LAnd:
14222de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall      case BO_LOr:
142325973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
142425973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis            !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
142525973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis          return false;
142625973455aed1cdc9c40b208c792b5db4f8f1297dArgyrios Kyrtzidis        break;
1427bf0ee354163f87623a4b60412544243911332343John McCall    }
1428026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    if (BO->isAssignmentOp())
1429026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1430026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = BO->getOperatorLoc();
1431026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = BO->getLHS()->getSourceRange();
1432026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = BO->getRHS()->getSourceRange();
1433026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1434e7716e6133e23e4a89248a65a388bc840d8c130cChris Lattner  }
1435eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  case CompoundAssignOperatorClass:
1436c6dfe194f623b02c123759f235b504d4850fc178Douglas Gregor  case VAArgExprClass:
1437026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
14385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1439ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian  case ConditionalOperatorClass: {
1440fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    // If only one of the LHS or RHS is a warning, the operator might
1441fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    // be being used for control flow. Only warn if both the LHS and
1442fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    // RHS are warnings.
1443ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
1444fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    if (!Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1445fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek      return false;
1446fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    if (!Exp->getLHS())
1447026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return true;
1448fb7cb35fa0a8131853b1b049ca7be77980e144f5Ted Kremenek    return Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1449ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian  }
1450ab38e4b50268633f037a10841fdfb612513f8d33Fariborz Jahanian
14515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case MemberExprClass:
1452026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // If the base pointer or element is to a volatile pointer/field, accessing
1453026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // it is a side effect.
1454df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1455026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1456026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<MemberExpr>(this)->getMemberLoc();
1457026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = SourceRange(Loc, Loc);
1458026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1459026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
14601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ArraySubscriptExprClass:
14625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // If the base pointer or element is to a volatile pointer/field, accessing
1463026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // it is a side effect.
1464df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1465026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      return false;
1466026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1467026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1468026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1469026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1470211f6adf1301a1461015fb6cb08a05f0a35b65f3Eli Friedman
14715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case CallExprClass:
1472852871abbff45f1c1d3787755a27fce08365b166Eli Friedman  case CXXOperatorCallExprClass:
1473852871abbff45f1c1d3787755a27fce08365b166Eli Friedman  case CXXMemberCallExprClass: {
1474026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    // If this is a direct call, get the callee.
1475026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    const CallExpr *CE = cast<CallExpr>(this);
1476d20254f2875d0004c57ee766f258dbcee29f4841Nuno Lopes    if (const Decl *FD = CE->getCalleeDecl()) {
1477026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      // If the callee has attribute pure, const, or warn_unused_result, warn
1478026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner      // about it. void foo() { strlen("bar"); } should warn.
1479bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      //
1480bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1481bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      // updated to match for QoI.
1482bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      if (FD->getAttr<WarnUnusedResultAttr>() ||
1483bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner          FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1484bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        Loc = CE->getCallee()->getLocStart();
1485bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        R1 = CE->getCallee()->getSourceRange();
1486bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner
1487bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        if (unsigned NumArgs = CE->getNumArgs())
1488bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner          R2 = SourceRange(CE->getArg(0)->getLocStart(),
1489bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner                           CE->getArg(NumArgs-1)->getLocEnd());
1490bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner        return true;
1491bc8d42c6f1565c0b2f93ad524edebfd7a4e6cac6Chris Lattner      }
1492026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    }
1493026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
1494026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner  }
149558beed91d468863b8c85bce43425422703838d27Anders Carlsson
149658beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXTemporaryObjectExprClass:
149758beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXConstructExprClass:
149858beed91d468863b8c85bce43425422703838d27Anders Carlsson    return false;
149958beed91d468863b8c85bce43425422703838d27Anders Carlsson
1500f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian  case ObjCMessageExprClass: {
1501f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1502f85e193739c953358c865005855253af4f68a497John McCall    if (Ctx.getLangOptions().ObjCAutoRefCount &&
1503f85e193739c953358c865005855253af4f68a497John McCall        ME->isInstanceMessage() &&
1504f85e193739c953358c865005855253af4f68a497John McCall        !ME->getType()->isVoidType() &&
1505f85e193739c953358c865005855253af4f68a497John McCall        ME->getSelector().getIdentifierInfoForSlot(0) &&
1506f85e193739c953358c865005855253af4f68a497John McCall        ME->getSelector().getIdentifierInfoForSlot(0)
1507f85e193739c953358c865005855253af4f68a497John McCall                                               ->getName().startswith("init")) {
1508f85e193739c953358c865005855253af4f68a497John McCall      Loc = getExprLoc();
1509f85e193739c953358c865005855253af4f68a497John McCall      R1 = ME->getSourceRange();
1510f85e193739c953358c865005855253af4f68a497John McCall      return true;
1511f85e193739c953358c865005855253af4f68a497John McCall    }
1512f85e193739c953358c865005855253af4f68a497John McCall
1513f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    const ObjCMethodDecl *MD = ME->getMethodDecl();
1514f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1515f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian      Loc = getExprLoc();
1516f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian      return true;
1517f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian    }
1518026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
1519f031774aa2638b4d3f487e7e44180c1f89b867efFariborz Jahanian  }
15201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
152112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case ObjCPropertyRefExprClass:
15225e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner    Loc = getExprLoc();
15235e94a0d82b1f49be41c35a73106b219e3f588c8cChris Lattner    R1 = getSourceRange();
1524a50089ec68a583d13718107c1b0c898f0903709eChris Lattner    return true;
152512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall
1526611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner  case StmtExprClass: {
1527611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // Statement exprs don't logically have side effects themselves, but are
1528611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // sometimes used in macros in ways that give them a type that is unused.
1529611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1530611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // however, if the result of the stmt expr is dead, we don't want to emit a
1531611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    // warning.
1532611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner    const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1533d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis    if (!CS->body_empty()) {
1534611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner      if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1535df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump        return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1536d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis      if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
1537d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis        if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
1538d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis          return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1539d2827af6f96d441d72315dbe6d8505c3be0f2aa6Argyrios Kyrtzidis    }
15401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15410faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
15420faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
1543026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<StmtExpr>(this)->getLParenLoc();
1544026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = getSourceRange();
1545026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
1546611b2eccaf3869f32de51ecc02985426d1c0aaefChris Lattner  }
15476eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregor  case CStyleCastExprClass:
1548fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner    // If this is an explicit cast to void, allow it.  People do this when they
1549fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner    // think they know what they're doing :).
1550026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    if (getType()->isVoidType())
1551fb84664349ca6f37f5ec4df440f6c362cca62470Chris Lattner      return false;
1552026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<CStyleCastExpr>(this)->getLParenLoc();
1553026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
1554026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
155558beed91d468863b8c85bce43425422703838d27Anders Carlsson  case CXXFunctionalCastExprClass: {
15560faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall    if (getType()->isVoidType())
15570faede6f31b07bcec7b776f2b420c3ea9bb3e58cJohn McCall      return false;
155858beed91d468863b8c85bce43425422703838d27Anders Carlsson    const CastExpr *CE = cast<CastExpr>(this);
1559c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
156058beed91d468863b8c85bce43425422703838d27Anders Carlsson    // If this is a cast to void or a constructor conversion, check the operand.
156158beed91d468863b8c85bce43425422703838d27Anders Carlsson    // Otherwise, the result of the cast is unused.
15622de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (CE->getCastKind() == CK_ToVoid ||
15632de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        CE->getCastKind() == CK_ConstructorConversion)
1564df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump      return (cast<CastExpr>(this)->getSubExpr()
1565df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump              ->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1566026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc();
1567026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange();
1568026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return true;
156958beed91d468863b8c85bce43425422703838d27Anders Carlsson  }
15701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15714be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman  case ImplicitCastExprClass:
15724be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman    // Check the operand, since implicit casts are inserted by Sema
1573df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<ImplicitCastExpr>(this)
1574df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
15754be1f47de20525ad90f02ba8682a7e2cbd3205d1Eli Friedman
157603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case MaterializeTemporaryExprClass:
157703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    return cast<MaterializeTemporaryExpr>(this)->GetTemporaryExpr()
157803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                    ->isUnusedResultAWarning(Loc, R1, R2, Ctx);
157903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
158004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  case CXXDefaultArgExprClass:
1581df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<CXXDefaultArgExpr>(this)
1582df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
15834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
15844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  case CXXNewExprClass:
15854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    // FIXME: In theory, there might be new expressions that don't have side
15864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    // effects (e.g. a placement new with an uninitialized POD).
15874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  case CXXDeleteExprClass:
1588026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner    return false;
15892d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  case CXXBindTemporaryExprClass:
1590df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump    return (cast<CXXBindTemporaryExpr>(this)
1591df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
15924765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case ExprWithCleanupsClass:
15934765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall    return (cast<ExprWithCleanups>(this)
1594df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
15954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
15965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
15975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
159844baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian/// isOBJCGCCandidate - Check if an expression is objc gc'able.
15997f4f86a2167abc116275e49c81350fc3225485e5Fariborz Jahanian/// returns true, if it is; false otherwise.
1600102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanianbool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
1601f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  const Expr *E = IgnoreParens();
1602f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  switch (E->getStmtClass()) {
160344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  default:
160444baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return false;
160544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ObjCIvarRefExprClass:
160644baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return true;
1607207c5210eb0ac7b632609f0c006eb97ef2738948Fariborz Jahanian  case Expr::UnaryOperatorClass:
1608f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
160944baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ImplicitCastExprClass:
1610f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
161103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case MaterializeTemporaryExprClass:
161203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    return cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr()
161303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                                      ->isOBJCGCCandidate(Ctx);
161406b89124a9a5971a0528cc9da6817740bac43164Fariborz Jahanian  case CStyleCastExprClass:
1615f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1616a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  case DeclRefExprClass: {
1617f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    const Decl *D = cast<DeclRefExpr>(E)->getDecl();
1618102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1619102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian      if (VD->hasGlobalStorage())
1620102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian        return true;
1621102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian      QualType T = VD->getType();
162259a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian      // dereferencing to a  pointer is always a gc'able candidate,
162359a53fa3f8ea73bae52ea36d0038f76e9f10729cFariborz Jahanian      // unless it is __weak.
16247e88a60d38b36695520e4f8d9279766ef111a662Daniel Dunbar      return T->isPointerType() &&
16250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall             (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1626102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    }
162744baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian    return false;
162844baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
162983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  case MemberExprClass: {
1630f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    const MemberExpr *M = cast<MemberExpr>(E);
1631102e390bcb5a1fb1a8fdbc8505e6dfd905374bbdFariborz Jahanian    return M->getBase()->isOBJCGCCandidate(Ctx);
163244baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
163344baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  case ArraySubscriptExprClass:
1634f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx);
163544baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian  }
163644baa8abba2a1552b6b50bf750a8750ab9da9f76Fariborz Jahanian}
1637369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
163811ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidisbool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
163911ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis  if (isTypeDependent())
164011ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis    return false;
16417eb0a9eb0cde8444b97f9c5b713d9be7a6f1e607John McCall  return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
164211ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis}
164311ab79030938209f50691acae0ddb65e72a58ca9Argyrios Kyrtzidis
1644864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCallQualType Expr::findBoundMemberType(const Expr *expr) {
1645864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  assert(expr->getType()->isSpecificPlaceholderType(BuiltinType::BoundMember));
1646864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1647864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // Bound member expressions are always one of these possibilities:
1648864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  //   x->m      x.m      x->*y      x.*y
1649864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  // (possibly parenthesized)
1650864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1651864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  expr = expr->IgnoreParens();
1652864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  if (const MemberExpr *mem = dyn_cast<MemberExpr>(expr)) {
1653864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    assert(isa<CXXMethodDecl>(mem->getMemberDecl()));
1654864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    return mem->getMemberDecl()->getType();
1655864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  }
1656864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1657864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  if (const BinaryOperator *op = dyn_cast<BinaryOperator>(expr)) {
1658864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    QualType type = op->getRHS()->getType()->castAs<MemberPointerType>()
1659864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall                      ->getPointeeType();
1660864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    assert(type->isFunctionType());
1661864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    return type;
1662864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  }
1663864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1664864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  assert(isa<UnresolvedMemberExpr>(expr));
1665864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall  return QualType();
1666864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall}
1667864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall
1668369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1,
1669369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                          Expr::CanThrowResult CT2) {
1670369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // CanThrowResult constants are ordered so that the maximum is the correct
1671369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // merge result.
1672369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return CT1 > CT2 ? CT1 : CT2;
1673369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1674369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1675369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) {
1676369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr *E = const_cast<Expr*>(CE);
1677369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr::CanThrowResult R = Expr::CT_Cannot;
16787502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall  for (Expr::child_range I = E->children(); I && R != Expr::CT_Can; ++I) {
1679369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C));
1680369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1681369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return R;
1682369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1683369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
16847a614d8380297fcd2bc23986241905d97222948cRichard Smithstatic Expr::CanThrowResult CanCalleeThrow(ASTContext &Ctx, const Expr *E,
16857a614d8380297fcd2bc23986241905d97222948cRichard Smith                                           const Decl *D,
1686369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                           bool NullThrows = true) {
1687369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!D)
1688369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return NullThrows ? Expr::CT_Can : Expr::CT_Cannot;
1689369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1690369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // See if we can get a function type from the decl somehow.
1691369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const ValueDecl *VD = dyn_cast<ValueDecl>(D);
1692369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!VD) // If we have no clue what we're calling, assume the worst.
1693369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Can;
1694369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
16955221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  // As an extension, we assume that __attribute__((nothrow)) functions don't
16965221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  // throw.
16975221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
16985221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl    return Expr::CT_Cannot;
16995221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl
1700369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  QualType T = VD->getType();
1701369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const FunctionProtoType *FT;
1702369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if ((FT = T->getAs<FunctionProtoType>())) {
1703369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  } else if (const PointerType *PT = T->getAs<PointerType>())
1704369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = PT->getPointeeType()->getAs<FunctionProtoType>();
1705369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
1706369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = RT->getPointeeType()->getAs<FunctionProtoType>();
1707369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const MemberPointerType *MT = T->getAs<MemberPointerType>())
1708369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = MT->getPointeeType()->getAs<FunctionProtoType>();
1709369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  else if (const BlockPointerType *BT = T->getAs<BlockPointerType>())
1710369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    FT = BT->getPointeeType()->getAs<FunctionProtoType>();
1711369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1712369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!FT)
1713369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Can;
1714369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
17157a614d8380297fcd2bc23986241905d97222948cRichard Smith  if (FT->getExceptionSpecType() == EST_Delayed) {
17167a614d8380297fcd2bc23986241905d97222948cRichard Smith    assert(isa<CXXConstructorDecl>(D) &&
17177a614d8380297fcd2bc23986241905d97222948cRichard Smith           "only constructor exception specs can be unknown");
17187a614d8380297fcd2bc23986241905d97222948cRichard Smith    Ctx.getDiagnostics().Report(E->getLocStart(),
17197a614d8380297fcd2bc23986241905d97222948cRichard Smith                                diag::err_exception_spec_unknown)
17207a614d8380297fcd2bc23986241905d97222948cRichard Smith      << E->getSourceRange();
17217a614d8380297fcd2bc23986241905d97222948cRichard Smith    return Expr::CT_Can;
17227a614d8380297fcd2bc23986241905d97222948cRichard Smith  }
17237a614d8380297fcd2bc23986241905d97222948cRichard Smith
17248026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  return FT->isNothrow(Ctx) ? Expr::CT_Cannot : Expr::CT_Can;
1725369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1726369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1727369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) {
1728369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (DC->isTypeDependent())
1729369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Dependent;
1730369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1731295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  if (!DC->getTypeAsWritten()->isReferenceType())
1732295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl    return Expr::CT_Cannot;
1733295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
1734be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  if (DC->getSubExpr()->isTypeDependent())
1735be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    return Expr::CT_Dependent;
1736be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman
1737369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot;
1738369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1739369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1740369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redlstatic Expr::CanThrowResult CanTypeidThrow(ASTContext &C,
1741369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                                           const CXXTypeidExpr *DC) {
1742369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (DC->isTypeOperand())
1743369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1744369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1745369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  Expr *Op = DC->getExprOperand();
1746369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (Op->isTypeDependent())
1747369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Dependent;
1748369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1749369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  const RecordType *RT = Op->getType()->getAs<RecordType>();
1750369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!RT)
1751369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1752369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1753369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic())
1754369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1755369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1756369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  if (Op->Classify(C).isPRValue())
1757369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return Expr::CT_Cannot;
1758369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1759369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  return Expr::CT_Can;
1760369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1761369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1762369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian RedlExpr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
1763369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  // C++ [expr.unary.noexcept]p3:
1764369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  //   [Can throw] if in a potentially-evaluated context the expression would
1765369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  //   contain:
1766369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  switch (getStmtClass()) {
1767369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXThrowExprClass:
1768369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated throw-expression
1769369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1770369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1771369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDynamicCastExprClass: {
1772369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1773369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     where T is a reference type, that requires a run-time check
1774369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this));
1775369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1776369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1777369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1778369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1779369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1780369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXTypeidExprClass:
1781369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated typeid expression applied to a glvalue
1782369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     expression whose type is a polymorphic class type
1783369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CanTypeidThrow(C, cast<CXXTypeidExpr>(this));
1784369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1785369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //   - a potentially evaluated call to a function, member function, function
1786369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     pointer, or member function pointer that does not have a non-throwing
1787369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    //     exception-specification
1788369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CallExprClass:
1789369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXOperatorCallExprClass:
1790369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXMemberCallExprClass: {
1791ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedman    const CallExpr *CE = cast<CallExpr>(this);
1792be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    CanThrowResult CT;
1793be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    if (isTypeDependent())
1794be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      CT = CT_Dependent;
1795ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedman    else if (isa<CXXPseudoDestructorExpr>(CE->getCallee()->IgnoreParens()))
1796ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedman      CT = CT_Cannot;
1797be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    else
17987a614d8380297fcd2bc23986241905d97222948cRichard Smith      CT = CanCalleeThrow(C, this, CE->getCalleeDecl());
1799369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1800369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1801369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1802369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1803369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1804295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  case CXXConstructExprClass:
1805295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  case CXXTemporaryObjectExprClass: {
18067a614d8380297fcd2bc23986241905d97222948cRichard Smith    CanThrowResult CT = CanCalleeThrow(C, this,
1807369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl        cast<CXXConstructExpr>(this)->getConstructor());
1808369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1809369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1810369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1811369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1812369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1813369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXNewExprClass: {
1814be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    CanThrowResult CT;
1815be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    if (isTypeDependent())
1816be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      CT = CT_Dependent;
1817be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    else
1818be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      CT = MergeCanThrow(
18197a614d8380297fcd2bc23986241905d97222948cRichard Smith        CanCalleeThrow(C, this, cast<CXXNewExpr>(this)->getOperatorNew()),
18207a614d8380297fcd2bc23986241905d97222948cRichard Smith        CanCalleeThrow(C, this, cast<CXXNewExpr>(this)->getConstructor(),
1821369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl                       /*NullThrows*/false));
1822369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (CT == CT_Can)
1823369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT;
1824369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1825369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1826369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1827369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDeleteExprClass: {
1828be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    CanThrowResult CT;
1829be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    QualType DTy = cast<CXXDeleteExpr>(this)->getDestroyedType();
1830be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    if (DTy.isNull() || DTy->isDependentType()) {
1831be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      CT = CT_Dependent;
1832be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman    } else {
18337a614d8380297fcd2bc23986241905d97222948cRichard Smith      CT = CanCalleeThrow(C, this,
18347a614d8380297fcd2bc23986241905d97222948cRichard Smith                          cast<CXXDeleteExpr>(this)->getOperatorDelete());
1835be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      if (const RecordType *RT = DTy->getAs<RecordType>()) {
1836be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman        const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
18377a614d8380297fcd2bc23986241905d97222948cRichard Smith        CT = MergeCanThrow(CT, CanCalleeThrow(C, this, RD->getDestructor()));
18380b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      }
1839be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman      if (CT == CT_Can)
1840be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman        return CT;
18410b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    }
18420b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
18430b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  }
18440b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl
18450b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  case CXXBindTemporaryExprClass: {
18460b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    // The bound temporary has to be destroyed again, which might throw.
18477a614d8380297fcd2bc23986241905d97222948cRichard Smith    CanThrowResult CT = CanCalleeThrow(C, this,
18480b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor());
18490b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl    if (CT == CT_Can)
18500b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl      return CT;
1851369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1852369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1853369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1854369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // ObjC message sends are like function calls, but never have exception
1855369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // specs.
1856369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCMessageExprClass:
1857369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCPropertyRefExprClass:
1858369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1859369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1860369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Many other things have subexpressions, so we have to test those.
1861369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some are simple:
1862369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ParenExprClass:
1863369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case MemberExprClass:
1864369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXReinterpretCastExprClass:
1865369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXConstCastExprClass:
1866369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ConditionalOperatorClass:
1867369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CompoundLiteralExprClass:
1868369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ExtVectorElementExprClass:
1869369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case InitListExprClass:
1870369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case DesignatedInitExprClass:
1871369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ParenListExprClass:
1872369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case VAArgExprClass:
1873369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDefaultArgExprClass:
18744765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  case ExprWithCleanupsClass:
1875369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCIvarRefExprClass:
1876369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ObjCIsaExprClass:
1877369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ShuffleVectorExprClass:
1878369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CanSubExprsThrow(C, this);
1879369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1880369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some might be dependent for other reasons.
1881369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case UnaryOperatorClass:
1882369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ArraySubscriptExprClass:
1883369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ImplicitCastExprClass:
1884369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CStyleCastExprClass:
1885369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXStaticCastExprClass:
1886369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXFunctionalCastExprClass:
1887369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case BinaryOperatorClass:
188803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case CompoundAssignOperatorClass:
188903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case MaterializeTemporaryExprClass: {
1890369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot;
1891369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1892369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1893369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1894369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms.
1895369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case StmtExprClass:
1896369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Can;
1897369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1898369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case ChooseExprClass:
1899369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    if (isTypeDependent() || isValueDependent())
1900369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl      return CT_Dependent;
1901369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C);
1902369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1903f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  case GenericSelectionExprClass:
1904f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (cast<GenericSelectionExpr>(this)->isResultDependent())
1905f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      return CT_Dependent;
1906f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<GenericSelectionExpr>(this)->getResultExpr()->CanThrow(C);
1907f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
1908369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // Some expressions are always dependent.
1909369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case DependentScopeDeclRefExprClass:
1910369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXUnresolvedConstructExprClass:
1911369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  case CXXDependentScopeMemberExprClass:
1912369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Dependent;
1913369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
1914369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  default:
1915369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // All other expressions don't have subexpressions, or else they are
1916369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    // unevaluated.
1917369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl    return CT_Cannot;
1918369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl  }
1919369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl}
1920369e51fa400aeb5835bb9af4634ea516c11429a7Sebastian Redl
19214e99a5fc3b203397a91136c6e695e405fb8fc606Ted KremenekExpr* Expr::IgnoreParens() {
19224e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek  Expr* E = this;
1923b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara  while (true) {
1924b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1925b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      E = P->getSubExpr();
1926b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1927b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1928b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1929b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1930b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1931b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1932b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1933b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1934f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1935f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      if (!P->isResultDependent()) {
1936f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        E = P->getResultExpr();
1937f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        continue;
1938f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      }
1939f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    }
1940b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
1941b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara  }
19424e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek}
19434e99a5fc3b203397a91136c6e695e405fb8fc606Ted Kremenek
194456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
194556f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner/// or CastExprs or ImplicitCastExprs, returning their operand.
194656f349400c5932a196509c0480ff6f99a9a0b48fChris LattnerExpr *Expr::IgnoreParenCasts() {
194756f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  Expr *E = this;
194856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  while (true) {
1949b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
195056f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner      E = P->getSubExpr();
1951b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1952b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1953b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
195456f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner      E = P->getSubExpr();
1955b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
1956b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1957b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1958b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
1959b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
1960b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
1961b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
1962b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
1963f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1964f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      if (!P->isResultDependent()) {
1965f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        E = P->getResultExpr();
1966f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        continue;
1967f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      }
1968f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    }
196903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    if (MaterializeTemporaryExpr *Materialize
197003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                      = dyn_cast<MaterializeTemporaryExpr>(E)) {
197103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      E = Materialize->GetTemporaryExpr();
197203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      continue;
197303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    }
197403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
1975b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
197656f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner  }
197756f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner}
197856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner
19799c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue
19809c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts.  This is intended purely as a temporary workaround for code
19819c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// that hasn't yet been rewritten to do the right thing about those
19829c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall/// casts, and may disappear along with the last internal use.
1983f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallExpr *Expr::IgnoreParenLValueCasts() {
1984f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  Expr *E = this;
19859c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall  while (true) {
1986f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1987f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      E = P->getSubExpr();
1988f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      continue;
19899c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall    } else if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1990f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      if (P->getCastKind() == CK_LValueToRValue) {
1991f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        E = P->getSubExpr();
1992f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        continue;
1993f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      }
19949c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall    } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
19959c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall      if (P->getOpcode() == UO_Extension) {
19969c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall        E = P->getSubExpr();
19979c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall        continue;
19989c5d70cee1fab3f988f9cd40316071b088a3f19dJohn McCall      }
1999f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    } else if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2000f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      if (!P->isResultDependent()) {
2001f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        E = P->getResultExpr();
2002f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        continue;
2003f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      }
200403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    } else if (MaterializeTemporaryExpr *Materialize
200503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                      = dyn_cast<MaterializeTemporaryExpr>(E)) {
200603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      E = Materialize->GetTemporaryExpr();
200703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      continue;
2008f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    }
2009f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    break;
2010f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  }
2011f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  return E;
2012f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall}
2013f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
20142fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCallExpr *Expr::IgnoreParenImpCasts() {
20152fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  Expr *E = this;
20162fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  while (true) {
2017b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
20182fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall      E = P->getSubExpr();
2019b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
2020b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
2021b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) {
20222fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall      E = P->getSubExpr();
2023b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      continue;
2024b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
2025b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2026b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
2027b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
2028b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
2029b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
2030b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
2031f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2032f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      if (!P->isResultDependent()) {
2033f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        E = P->getResultExpr();
2034f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        continue;
2035f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      }
2036f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    }
203703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    if (MaterializeTemporaryExpr *Materialize
203803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                      = dyn_cast<MaterializeTemporaryExpr>(E)) {
203903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      E = Materialize->GetTemporaryExpr();
204003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      continue;
204103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    }
2042b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    return E;
20432fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall  }
20442fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall}
20452fc46bf1a9bc31d50f82de37c70ea257d3cded27John McCall
20462f072b442879b8bba8c5dea11d7c61bedb1924aeHans WennborgExpr *Expr::IgnoreConversionOperator() {
20472f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg  if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
20482f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg    if (isa<CXXConversionDecl>(MCE->getMethodDecl()))
20492f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg      return MCE->getImplicitObjectArgument();
20502f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg  }
20512f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg  return this;
20522f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg}
20532f072b442879b8bba8c5dea11d7c61bedb1924aeHans Wennborg
2054ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
2055ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// value (including ptr->int casts of the same size).  Strip off any
2056ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner/// ParenExpr or CastExprs, returning their operand.
2057ecdd84147c0765caa999ddc22dde25b42712bb4dChris LattnerExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
2058ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  Expr *E = this;
2059ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  while (true) {
2060ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
2061ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      E = P->getSubExpr();
2062ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      continue;
2063ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    }
20641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2065ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
2066ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      // We ignore integer <-> casts that are of the same width, ptr<->ptr and
20672ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor      // ptr<->int casts of the same width.  We also ignore all identity casts.
2068ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      Expr *SE = P->getSubExpr();
20691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2070ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
2071ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        E = SE;
2072ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        continue;
2073ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      }
20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2075b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if ((E->getType()->isPointerType() ||
20769d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor           E->getType()->isIntegralType(Ctx)) &&
2077b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara          (SE->getType()->isPointerType() ||
20789d3347a5887d2d25afe8b0bd35783a72ec86cce2Douglas Gregor           SE->getType()->isIntegralType(Ctx)) &&
2079ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner          Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
2080ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        E = SE;
2081ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner        continue;
2082ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner      }
2083ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    }
20841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2085b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2086b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      if (P->getOpcode() == UO_Extension) {
2087b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        E = P->getSubExpr();
2088b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara        continue;
2089b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara      }
2090b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara    }
2091b9eb35ced8369c8c8479efc17712faaf34e16c56Abramo Bagnara
2092f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2093f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      if (!P->isResultDependent()) {
2094f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        E = P->getResultExpr();
2095f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne        continue;
2096f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      }
2097f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    }
2098f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
2099ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner    return E;
2100ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner  }
2101ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner}
2102ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
21036eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregorbool Expr::isDefaultArgument() const {
21046eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  const Expr *E = this;
210503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
210603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    E = M->GetTemporaryExpr();
210703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
21086eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
21096eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor    E = ICE->getSubExprAsWritten();
2110c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
21116eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor  return isa<CXXDefaultArgExpr>(E);
21126eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor}
2113ecdd84147c0765caa999ddc22dde25b42712bb4dChris Lattner
21142f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// \brief Skip over any no-op casts and any temporary-binding
21152f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor/// expressions.
2116f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlssonstatic const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
211703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
211803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    E = M->GetTemporaryExpr();
211903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
21202f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
21212de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (ICE->getCastKind() == CK_NoOp)
21222f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      E = ICE->getSubExpr();
21232f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    else
21242f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      break;
21252f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
21262f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
21272f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
21282f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    E = BE->getSubExpr();
21292f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
21302f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
21312de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (ICE->getCastKind() == CK_NoOp)
21322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      E = ICE->getSubExpr();
21332f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor    else
21342f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor      break;
21352f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
2136f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson
2137f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson  return E->IgnoreParens();
21382f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor}
21392f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
2140558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// isTemporaryObject - Determines if this expression produces a
2141558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall/// temporary of the given class type.
2142558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallbool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
2143558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
2144558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    return false;
21452f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
2146f8b3015060096a946d91578d0f3b65d3097a4ebbAnders Carlsson  const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
21472f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
214858277b57f9492d0234748be89bcad48b322c5cf7John McCall  // Temporaries are by definition pr-values of class type.
2149db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian  if (!E->Classify(C).isPRValue()) {
2150db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian    // In this context, property reference is a message call and is pr-value.
215112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    if (!isa<ObjCPropertyRefExpr>(E))
2152db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian      return false;
2153db148be93c9af45da1f3aa9302c577618a56e6eaFariborz Jahanian  }
21542f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
215519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // Black-list a few cases which yield pr-values of class type that don't
215619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // refer to temporaries of that type:
215719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
215819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // - implicit derived-to-base conversions
2159558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  if (isa<ImplicitCastExpr>(E)) {
2160558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
2161558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    case CK_DerivedToBase:
2162558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    case CK_UncheckedDerivedToBase:
2163558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return false;
2164558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    default:
2165558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      break;
2166558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    }
21672f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor  }
21682f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
216919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // - member expressions (all)
217019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  if (isa<MemberExpr>(E))
217119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    return false;
217219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
217356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  // - opaque values (all)
217456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  if (isa<OpaqueValueExpr>(E))
217556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    return false;
217656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
2177558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  return true;
21782f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor}
21792f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor
218075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregorbool Expr::isImplicitCXXThis() const {
218175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  const Expr *E = this;
218275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
218375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  // Strip away parentheses and casts we don't care about.
218475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  while (true) {
218575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) {
218675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      E = Paren->getSubExpr();
218775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      continue;
218875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    }
218975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
219075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
219175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      if (ICE->getCastKind() == CK_NoOp ||
219275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor          ICE->getCastKind() == CK_LValueToRValue ||
219375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor          ICE->getCastKind() == CK_DerivedToBase ||
219475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor          ICE->getCastKind() == CK_UncheckedDerivedToBase) {
219575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor        E = ICE->getSubExpr();
219675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor        continue;
219775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      }
219875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    }
219975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
220075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
220175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      if (UnOp->getOpcode() == UO_Extension) {
220275e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor        E = UnOp->getSubExpr();
220375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor        continue;
220475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor      }
220575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    }
220675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
220703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    if (const MaterializeTemporaryExpr *M
220803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                      = dyn_cast<MaterializeTemporaryExpr>(E)) {
220903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      E = M->GetTemporaryExpr();
221003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      continue;
221103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    }
221203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
221375e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    break;
221475e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  }
221575e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
221675e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E))
221775e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor    return This->isImplicit();
221875e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
221975e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor  return false;
222075e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor}
222175e85048e73fcde2ce9d8a48dfdb1220e132eb59Douglas Gregor
2222898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyTypeDependentArguments - Determines if any of the expressions
2223898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is type-dependent.
2224898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) {
2225898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  for (unsigned I = 0; I < NumExprs; ++I)
2226898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    if (Exprs[I]->isTypeDependent())
2227898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      return true;
2228898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
2229898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  return false;
2230898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
2231898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
2232898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// hasAnyValueDependentArguments - Determines if any of the expressions
2233898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// in Exprs is value-dependent.
2234898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorbool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
2235898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  for (unsigned I = 0; I < NumExprs; ++I)
2236898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    if (Exprs[I]->isValueDependent())
2237898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor      return true;
2238898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
2239898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  return false;
2240898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
2241898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
22424204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCallbool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
2243c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // This function is attempting whether an expression is an initializer
2244c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // which can be evaluated at compile-time.  isEvaluatable handles most
2245c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // of the cases, but it can't deal with some initializer-specific
2246c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // expressions, and it can't deal with aggregates; we deal with those here,
2247c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  // and fall back to isEvaluatable for the other cases.
2248c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman
22494204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  // If we ever capture reference-binding directly in the AST, we can
22504204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  // kill the second parameter.
22514204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
22524204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  if (IsForRef) {
22534204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    EvalResult Result;
22544204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects;
22554204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  }
22561f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman
2257e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  switch (getStmtClass()) {
2258c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  default: break;
2259e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  case StringLiteralClass:
226014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  case ObjCStringLiteralClass:
2261eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  case ObjCEncodeExprClass:
2262e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    return true;
2263b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXTemporaryObjectExprClass:
2264b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXConstructExprClass: {
2265b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall    const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
22664204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
22674204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // Only if it's
22684204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // 1) an application of the trivial default constructor or
2269b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall    if (!CE->getConstructor()->isTrivial()) return false;
22704204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    if (!CE->getNumArgs()) return true;
22714204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall
22724204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    // 2) an elidable trivial copy construction of an operand which is
22734204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    //    itself a constant initializer.  Note that we consider the
22744204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    //    operand on its own, *not* as a reference binding.
22754204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return CE->isElidable() &&
22764204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall           CE->getArg(0)->isConstantInitializer(Ctx, false);
2277b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  }
227859b5da6d853b4368b984700315adf7b37de05764Nate Begeman  case CompoundLiteralExprClass: {
22791f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // This handles gcc's extension that allows global initializers like
22801f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // "struct x {int x;} x = (struct x) {};".
22811f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This accepts other cases it shouldn't!
228259b5da6d853b4368b984700315adf7b37de05764Nate Begeman    const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
22834204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return Exp->isConstantInitializer(Ctx, false);
228459b5da6d853b4368b984700315adf7b37de05764Nate Begeman  }
2285e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  case InitListExprClass: {
22861f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This doesn't deal with fields with reference types correctly.
22871f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // FIXME: This incorrectly allows pointers cast to integers to be assigned
22881f4a6db271f389d6ab3cb1bc28cb5c23a7828602Eli Friedman    // to bitfields.
2289e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    const InitListExpr *Exp = cast<InitListExpr>(this);
2290e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    unsigned numInits = Exp->getNumInits();
2291e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    for (unsigned i = 0; i < numInits; i++) {
22924204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      if (!Exp->getInit(i)->isConstantInitializer(Ctx, false))
2293e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson        return false;
2294e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson    }
2295c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    return true;
2296e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  }
22973498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor  case ImplicitValueInitExprClass:
22983498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor    return true;
22993ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  case ParenExprClass:
23004204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall    return cast<ParenExpr>(this)->getSubExpr()
23014204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      ->isConstantInitializer(Ctx, IsForRef);
2302f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  case GenericSelectionExprClass:
2303f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (cast<GenericSelectionExpr>(this)->isResultDependent())
2304f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      return false;
2305f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return cast<GenericSelectionExpr>(this)->getResultExpr()
2306f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      ->isConstantInitializer(Ctx, IsForRef);
23075cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara  case ChooseExprClass:
23085cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
23095cadfab3f2e7660453211eb0e00314bd40d93014Abramo Bagnara      ->isConstantInitializer(Ctx, IsForRef);
2310c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  case UnaryOperatorClass: {
2311c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    const UnaryOperator* Exp = cast<UnaryOperator>(this);
23122de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (Exp->getOpcode() == UO_Extension)
23134204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return Exp->getSubExpr()->isConstantInitializer(Ctx, false);
2314c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    break;
2315c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  }
23163ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  case BinaryOperatorClass: {
23173ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    // Special case &&foo - &&bar.  It would be nice to generalize this somehow
23183ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    // but this handles the common case.
23193ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    const BinaryOperator *Exp = cast<BinaryOperator>(this);
23202de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    if (Exp->getOpcode() == BO_Sub &&
23213ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner        isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) &&
23223ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner        isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx)))
23233ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner      return true;
23243ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner    break;
23253ae9f48ae0d07a5aa352bf03c944f557a5ac4c95Chris Lattner  }
23264204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall  case CXXFunctionalCastExprClass:
2327b4b9b15c597a923a03ad0a33cdc49b67e5cc4450John McCall  case CXXStaticCastExprClass:
232881045d8dcd967def69d8e0945566214a9fe9ffccChris Lattner  case ImplicitCastExprClass:
2329c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  case CStyleCastExprClass:
2330c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // Handle casts with a destination that's a struct or union; this
2331c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // deals with both the gcc no-op struct cast extension and the
2332c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    // cast-to-union extension.
2333c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    if (getType()->isRecordType())
23344204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return cast<CastExpr>(this)->getSubExpr()
23354204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall        ->isConstantInitializer(Ctx, false);
2336c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2337430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    // Integer->integer casts can be handled here, which is important for
2338430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    // things like (int)(&&x-&&y).  Scary but true.
2339430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner    if (getType()->isIntegerType() &&
2340430656e1c392dcd9f17fe91a495421d69fca1bc8Chris Lattner        cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType())
23414204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall      return cast<CastExpr>(this)->getSubExpr()
23424204f07fc8bffe6d320b2de95fea274ccf37a17bJohn McCall        ->isConstantInitializer(Ctx, false);
2343c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2344c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman    break;
234503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
234603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  case MaterializeTemporaryExprClass:
234703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    return llvm::cast<MaterializeTemporaryExpr>(this)->GetTemporaryExpr()
234803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                            ->isConstantInitializer(Ctx, false);
2349e8a32b855ce4e8580a191f8d29d2f3f459834302Anders Carlsson  }
2350c39dc9a25a9d74a5302e8567a4d3fc008212024cEli Friedman  return isEvaluatable(Ctx);
235138374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff}
235238374b05791ee93300b9fbe8ceb3957f54184b37Steve Naroff
235382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth/// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null
235482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth/// pointer constant or not, as well as the specific kind of constant detected.
235582214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth/// Null pointer constants can be integer constant expressions with the
235682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth/// value zero, casts of zero to void*, nullptr (C++0X), or __null
235782214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth/// (a GNU extension).
235882214a80c0163e01e4d8dec1426023c89277dbb4Chandler CarruthExpr::NullPointerConstantKind
235982214a80c0163e01e4d8dec1426023c89277dbb4Chandler CarruthExpr::isNullPointerConstant(ASTContext &Ctx,
236082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth                            NullPointerConstantValueDependence NPC) const {
2361ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  if (isValueDependent()) {
2362ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    switch (NPC) {
2363ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_NeverValueDependent:
2364ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      assert(false && "Unexpected value dependent expression!");
2365ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor      // If the unthinkable happens, fall through to the safest alternative.
2366c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2367ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_ValueDependentIsNull:
236882214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth      if (isTypeDependent() || getType()->isIntegralType(Ctx))
236982214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth        return NPCK_ZeroInteger;
237082214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth      else
237182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth        return NPCK_NotNull;
2372c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2373ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    case NPC_ValueDependentIsNotNull:
237482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth      return NPCK_NotNull;
2375ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    }
2376ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor  }
2377f515b2268f829adfbfdb751f54d102b53ed0285cDaniel Dunbar
23780777972d38a3125efed962b045704c30ae6965cfSebastian Redl  // Strip off a cast to void*, if it exists. Except in C++.
23790835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
23806215dee86c0e715b9f2b0d401ab2a5fcf629f1afSebastian Redl    if (!Ctx.getLangOptions().CPlusPlus) {
23810777972d38a3125efed962b045704c30ae6965cfSebastian Redl      // Check that it is a cast to void*.
23826217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek      if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
23830777972d38a3125efed962b045704c30ae6965cfSebastian Redl        QualType Pointee = PT->getPointeeType();
23840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        if (!Pointee.hasQualifiers() &&
23850777972d38a3125efed962b045704c30ae6965cfSebastian Redl            Pointee->isVoidType() &&                              // to void*
23860777972d38a3125efed962b045704c30ae6965cfSebastian Redl            CE->getSubExpr()->getType()->isIntegerType())         // from int.
2387ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor          return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
23880777972d38a3125efed962b045704c30ae6965cfSebastian Redl      }
23895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2390aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
2391aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // Ignore the ImplicitCastExpr type entirely.
2392ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2393aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
2394aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // Accept ((void*)0) as a null pointer constant, as many other
2395aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff    // implementations do.
2396ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2397f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  } else if (const GenericSelectionExpr *GE =
2398f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne               dyn_cast<GenericSelectionExpr>(this)) {
2399f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  } else if (const CXXDefaultArgExpr *DefaultArg
24018123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner               = dyn_cast<CXXDefaultArgExpr>(this)) {
240204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    // See through default argument expressions
2403ce94049b69f75b44c18584fe79cd238978b6b0d5Douglas Gregor    return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
24042d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  } else if (isa<GNUNullExpr>(this)) {
24052d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor    // The GNU __null extension is always a null pointer constant.
240682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    return NPCK_GNUNull;
240703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  } else if (const MaterializeTemporaryExpr *M
240803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor                                   = dyn_cast<MaterializeTemporaryExpr>(this)) {
240903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    return M->GetTemporaryExpr()->isNullPointerConstant(Ctx, NPC);
2410aaffbf7c790a324ed114184db771aae2d2e9151cSteve Naroff  }
24112d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
24126e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  // C++0x nullptr_t is always a null pointer constant.
24136e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  if (getType()->isNullPtrType())
241482214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    return NPCK_CXX0X_nullptr;
24156e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
2416ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian  if (const RecordType *UT = getType()->getAsUnionType())
2417ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian    if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
2418ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian      if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
2419ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian        const Expr *InitExpr = CLE->getInitializer();
2420ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian        if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
2421ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian          return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
2422ff3a078d2a67db9ae6ff4cc0f799a209f85a4e91Fariborz Jahanian      }
2423aa58f00ebba5f14955001736b7aea20bb5bd91e6Steve Naroff  // This expression must be an integer type.
2424c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  if (!getType()->isIntegerType() ||
242556fc0d18caf9c829647a5e3ce35197f0d7e0feeeFariborz Jahanian      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
242682214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth    return NPCK_NotNull;
24271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
24285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If we have an integer constant expression, we need to *evaluate* it and
24295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // test for the value 0.
243009de1767990d4828bcaf0dd22033a5dddeecbe08Eli Friedman  llvm::APSInt Result;
243182214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  bool IsNull = isIntegerConstantExpr(Result, Ctx) && Result == 0;
243282214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth
243382214a80c0163e01e4d8dec1426023c89277dbb4Chandler Carruth  return (IsNull ? NPCK_ZeroInteger : NPCK_NotNull);
24345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
243531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff
2436f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// \brief If this expression is an l-value for an Objective C
2437f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall/// property, find the underlying property reference expression.
2438f6a1648197562e0b133440d612d9af297d0a86ccJohn McCallconst ObjCPropertyRefExpr *Expr::getObjCProperty() const {
2439f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  const Expr *E = this;
2440f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  while (true) {
2441f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    assert((E->getValueKind() == VK_LValue &&
2442f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall            E->getObjectKind() == OK_ObjCProperty) &&
2443f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall           "expression is not a property reference");
2444f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    E = E->IgnoreParenCasts();
2445f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
2446f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      if (BO->getOpcode() == BO_Comma) {
2447f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        E = BO->getRHS();
2448f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        continue;
2449f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall      }
2450f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    }
2451f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
2452f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    break;
2453f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  }
2454f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
2455f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall  return cast<ObjCPropertyRefExpr>(E);
2456f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall}
2457f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall
245833bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas GregorFieldDecl *Expr::getBitField() {
24596f4a69a3107e7ff1569c747f7c6bdf7cff8cbf55Douglas Gregor  Expr *E = this->IgnoreParens();
246033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
2461de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor  while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2462f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall    if (ICE->getCastKind() == CK_LValueToRValue ||
2463f6a1648197562e0b133440d612d9af297d0a86ccJohn McCall        (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp))
2464de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor      E = ICE->getSubExpr()->IgnoreParens();
2465de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor    else
2466de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor      break;
2467de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor  }
2468de4b1d86bf48bc2a84bddf6b188f6da53eaea845Douglas Gregor
246927c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor  if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
247086f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor    if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
247133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor      if (Field->isBitField())
247233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor        return Field;
247333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
24740f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis  if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E))
24750f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis    if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
24760f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis      if (Field->isBitField())
24770f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis        return Field;
24780f279e756e3df69f9e071c572805e5d3e89123a2Argyrios Kyrtzidis
247933bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
248033bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor    if (BinOp->isAssignmentOp() && BinOp->getLHS())
248133bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor      return BinOp->getLHS()->getBitField();
248233bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor
248333bbbc5ec8269bc2cde5b84f970fa49319a30267Douglas Gregor  return 0;
248427c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor}
248527c8dc06f65d7abcf6a7e7f64a7960c9a150ca01Douglas Gregor
2486093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlssonbool Expr::refersToVectorElement() const {
2487093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  const Expr *E = this->IgnoreParens();
2488c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2489093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
24905baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall    if (ICE->getValueKind() != VK_RValue &&
24912de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall        ICE->getCastKind() == CK_NoOp)
2492093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson      E = ICE->getSubExpr()->IgnoreParens();
2493093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    else
2494093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson      break;
2495093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  }
2496c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
2497093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
2498093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    return ASE->getBase()->getType()->isVectorType();
2499093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
2500093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  if (isa<ExtVectorElementExpr>(E))
2501093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson    return true;
2502093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
2503093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson  return false;
2504093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson}
2505093802675b1548f2a5f44c29938d65cce00d58bbAnders Carlsson
25062140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// isArrow - Return true if the base expression is a pointer to vector,
25072140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner/// return false if the base expression is a vector.
25082140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattnerbool ExtVectorElementExpr::isArrow() const {
25092140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner  return getBase()->getType()->isPointerType();
25102140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner}
25112140e904dbe53657339cb5b1cc13de563ca0d1fcChris Lattner
2512213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanunsigned ExtVectorElementExpr::getNumElements() const {
2513183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  if (const VectorType *VT = getType()->getAs<VectorType>())
25148a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    return VT->getNumElements();
25158a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman  return 1;
25164d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner}
25174d0ac88428b3ed7c6f3a2f4e758ea5424ecd70aeChris Lattner
25188a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// containsDuplicateElements - Return true if any element access is repeated.
2519213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanbool ExtVectorElementExpr::containsDuplicateElements() const {
2520a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar  // FIXME: Refactor this code to an accessor on the AST node which returns the
2521a2b34eb7d19d1d199a244da20afe12353e3593acDaniel Dunbar  // "type" of component access, and share with code below and in Sema.
252201eb9b9683535d8a65c704ad2c545903409e2d36Daniel Dunbar  llvm::StringRef Comp = Accessor->getName();
2523190d6a25393995b42e32086949a68285ee423fb9Nate Begeman
2524190d6a25393995b42e32086949a68285ee423fb9Nate Begeman  // Halving swizzles do not contain duplicate elements.
2525150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
2526190d6a25393995b42e32086949a68285ee423fb9Nate Begeman    return false;
25271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2528190d6a25393995b42e32086949a68285ee423fb9Nate Begeman  // Advance past s-char prefix on hex swizzles.
2529150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  if (Comp[0] == 's' || Comp[0] == 'S')
2530150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar    Comp = Comp.substr(1);
25311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2532150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar  for (unsigned i = 0, e = Comp.size(); i != e; ++i)
2533150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar    if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos)
2534fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff        return true;
2535150274299b0bc2efda45783f99bef3f9f6e807acDaniel Dunbar
2536fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff  return false;
2537fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff}
2538b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner
25398a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
25403b8d116703db8018f855cbb4733ace426422623bNate Begemanvoid ExtVectorElementExpr::getEncodedElementAccess(
25413b8d116703db8018f855cbb4733ace426422623bNate Begeman                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
25424b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  llvm::StringRef Comp = Accessor->getName();
25434b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  if (Comp[0] == 's' || Comp[0] == 'S')
25444b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar    Comp = Comp.substr(1);
25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25464b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isHi =   Comp == "hi";
25474b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isLo =   Comp == "lo";
25484b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isEven = Comp == "even";
25494b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar  bool isOdd  = Comp == "odd";
25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25518a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
25528a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    uint64_t Index;
25531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25548a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    if (isHi)
25558a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = e + i;
25568a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isLo)
25578a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = i;
25588a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isEven)
25598a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = 2 * i;
25608a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else if (isOdd)
25618a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman      Index = 2 * i + 1;
25628a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman    else
25634b55b24410a2739c589c4b9e84a364161c9a17e5Daniel Dunbar      Index = ExtVectorType::getAccessorIdx(Comp[i]);
2564b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner
25653b8d116703db8018f855cbb4733ace426422623bNate Begeman    Elts.push_back(Index);
2566b8f849da3cedee2f61ad98389115ddd04e439d60Chris Lattner  }
25678a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman}
25688a99764f9b778a54e7440b1ee06a1e48f25d76d8Nate Begeman
256904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2570f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
257104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
257204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation SuperLoc,
257304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 bool IsInstanceSuper,
257404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 QualType SuperType,
2575c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 Selector Sel,
2576f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
257704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
257804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
257904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2580f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
2581bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*TypeDependent=*/false, /*ValueDependent=*/false,
2582bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         /*ContainsUnexpandedParameterPack=*/false),
258304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
2584f85e193739c953358c865005855253af4f68a497John McCall    HasMethod(Method != 0), IsDelegateInitCall(false), SuperLoc(SuperLoc),
258504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
258604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2587f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2588c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor{
258904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(SuperType.getAsOpaquePtr());
259004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (NumArgs)
259104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
259204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
259304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
259404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2595f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
259604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
259704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 TypeSourceInfo *Receiver,
2598f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 Selector Sel,
2599f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
260004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
260104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
260204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2603f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
2604bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         T->isDependentType(), T->containsUnexpandedParameterPack()),
2605f85e193739c953358c865005855253af4f68a497John McCall    NumArgs(NumArgs), Kind(Class),
2606f85e193739c953358c865005855253af4f68a497John McCall    HasMethod(Method != 0), IsDelegateInitCall(false),
260704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
260804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2609f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
261004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{
261104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(Receiver);
2612aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **MyArgs = getArgs();
2613bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I) {
2614bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isTypeDependent())
2615bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2616bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isValueDependent())
2617bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2618bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->containsUnexpandedParameterPack())
2619bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2620bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2621bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    MyArgs[I] = Args[I];
2622bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
262304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
262404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
262504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr::ObjCMessageExpr(QualType T,
2626f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                 ExprValueKind VK,
262704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation LBracLoc,
262804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr *Receiver,
2629c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                 Selector Sel,
2630f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                 SourceLocation SelLoc,
263104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 ObjCMethodDecl *Method,
263204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 Expr **Args, unsigned NumArgs,
263304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                 SourceLocation RBracLoc)
2634f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
2635bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Receiver->isTypeDependent(),
2636bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Receiver->containsUnexpandedParameterPack()),
2637f85e193739c953358c865005855253af4f68a497John McCall    NumArgs(NumArgs), Kind(Instance),
2638f85e193739c953358c865005855253af4f68a497John McCall    HasMethod(Method != 0), IsDelegateInitCall(false),
263904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
264004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                       : Sel.getAsOpaquePtr())),
2641f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
264204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor{
264304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  setReceiverPointer(Receiver);
2644aa165f8458b51c546bebff947343e1a36f3594cbDouglas Gregor  Expr **MyArgs = getArgs();
2645bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned I = 0; I != NumArgs; ++I) {
2646bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isTypeDependent())
2647bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2648bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->isValueDependent())
2649bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2650bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (Args[I]->containsUnexpandedParameterPack())
2651bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2652bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2653bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    MyArgs[I] = Args[I];
2654bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
265504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
265604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
265704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2658f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
265904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
266004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation SuperLoc,
266104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         bool IsInstanceSuper,
266204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         QualType SuperType,
2663c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                         Selector Sel,
2664f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
266504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
266604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
266704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2668c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
266904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
267004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2671f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
2672f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   SuperType, Sel, SelLoc, Method, Args,NumArgs,
267304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                   RBracLoc);
267404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
267504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
267604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2677f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
267804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
267904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         TypeSourceInfo *Receiver,
2680c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                         Selector Sel,
2681f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
268204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
268304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
268404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2685c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
268604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
268704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2688f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2689f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   Method, Args, NumArgs, RBracLoc);
269004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
269104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
269204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2693f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                         ExprValueKind VK,
269404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation LBracLoc,
269504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr *Receiver,
2696f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         Selector Sel,
2697f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                         SourceLocation SelLoc,
269804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         ObjCMethodDecl *Method,
269904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         Expr **Args, unsigned NumArgs,
270004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                         SourceLocation RBracLoc) {
2701c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
270204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
270304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2704f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2705f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis                                   Method, Args, NumArgs, RBracLoc);
270604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
270704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
2708c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
270904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                              unsigned NumArgs) {
2710c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
271104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    NumArgs * sizeof(Expr *);
271204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
271304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
271404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
2715e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2716e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios KyrtzidisSourceRange ObjCMessageExpr::getReceiverRange() const {
2717e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  switch (getReceiverKind()) {
2718e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case Instance:
2719e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getInstanceReceiver()->getSourceRange();
2720e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2721e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case Class:
2722e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
2723e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2724e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case SuperInstance:
2725e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  case SuperClass:
2726e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis    return getSuperLoc();
2727e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  }
2728e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
2729e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis  return SourceLocation();
2730e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis}
2731e005d19456e6fb73ace33f25e02ac10e22dd063fArgyrios Kyrtzidis
273204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorSelector ObjCMessageExpr::getSelector() const {
273304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (HasMethod)
273404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
273504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor                                                               ->getSelector();
2736c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt  return Selector(SelectorOrMethod);
273704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor}
273804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
273904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas GregorObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
274004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (getReceiverKind()) {
274104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case Instance:
274204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    if (const ObjCObjectPointerType *Ptr
274304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor          = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
274404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      return Ptr->getInterfaceDecl();
274504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
27464df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek
274704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case Class:
2748c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    if (const ObjCObjectType *Ty
2749c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          = getClassReceiver()->getAs<ObjCObjectType>())
2750c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      return Ty->getInterface();
275104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
27524df728e368fa1f65ffc57572fed613dcca5b4fe8Ted Kremenek
275304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case SuperInstance:
275404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    if (const ObjCObjectPointerType *Ptr
275504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor          = getSuperType()->getAs<ObjCObjectPointerType>())
275604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      return Ptr->getInterfaceDecl();
275704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
2758c2350e553b853ad00914faf23fa731e5fc4a8a5cDouglas Gregor
275904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case SuperClass:
2760ee8a6cafe8b69c316dd4fa5f6ea4838ffe15621cArgyrios Kyrtzidis    if (const ObjCObjectType *Iface
2761ee8a6cafe8b69c316dd4fa5f6ea4838ffe15621cArgyrios Kyrtzidis          = getSuperType()->getAs<ObjCObjectType>())
2762ee8a6cafe8b69c316dd4fa5f6ea4838ffe15621cArgyrios Kyrtzidis      return Iface->getInterface();
276304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
276404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
27650389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner
276604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  return 0;
2767eb3b324800598cc3d5385fbad95ae5cff2c79113Ted Kremenek}
27680389e6bd0159bfdd08f7c50a37543b6e3adf0c33Chris Lattner
2769f85e193739c953358c865005855253af4f68a497John McCallllvm::StringRef ObjCBridgedCastExpr::getBridgeKindName() const {
2770f85e193739c953358c865005855253af4f68a497John McCall  switch (getBridgeKind()) {
2771f85e193739c953358c865005855253af4f68a497John McCall  case OBC_Bridge:
2772f85e193739c953358c865005855253af4f68a497John McCall    return "__bridge";
2773f85e193739c953358c865005855253af4f68a497John McCall  case OBC_BridgeTransfer:
2774f85e193739c953358c865005855253af4f68a497John McCall    return "__bridge_transfer";
2775f85e193739c953358c865005855253af4f68a497John McCall  case OBC_BridgeRetained:
2776f85e193739c953358c865005855253af4f68a497John McCall    return "__bridge_retained";
2777f85e193739c953358c865005855253af4f68a497John McCall  }
2778f85e193739c953358c865005855253af4f68a497John McCall
2779f85e193739c953358c865005855253af4f68a497John McCall  return "__bridge";
2780f85e193739c953358c865005855253af4f68a497John McCall}
2781f85e193739c953358c865005855253af4f68a497John McCall
27824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadbool ChooseExpr::isConditionTrue(const ASTContext &C) const {
27839a901bb63990574ff0bcc12ff851d7a71cff8ddbEli Friedman  return getCond()->EvaluateAsInt(C) != 0;
278427437caadea35f84d550cd29f024fcf3ea240eecChris Lattner}
278527437caadea35f84d550cd29f024fcf3ea240eecChris Lattner
2786bebbe0d9b7568ce43a464286bee49429489ef483Douglas GregorShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
2787bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     QualType Type, SourceLocation BLoc,
2788bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor                                     SourceLocation RP)
2789bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor   : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
2790bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          Type->isDependentType(), Type->isDependentType(),
2791bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          Type->containsUnexpandedParameterPack()),
2792bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor     BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
2793bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor{
2794bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  SubExprs = new (C) Stmt*[nexpr];
2795bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i < nexpr; i++) {
2796bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isTypeDependent())
2797bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
2798bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->isValueDependent())
2799bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
2800bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (args[i]->containsUnexpandedParameterPack())
2801bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
2802bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2803bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    SubExprs[i] = args[i];
2804bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
2805bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
2806bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2807888376a2bbcfc2f047902249f8455918e2489ae1Nate Begemanvoid ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
2808888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman                                 unsigned NumExprs) {
2809888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman  if (SubExprs) C.Deallocate(SubExprs);
2810888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman
2811888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman  SubExprs = new (C) Stmt* [NumExprs];
281294cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  this->NumExprs = NumExprs;
281394cd5d1397bb1a8bcd109602aa38dd787b164c22Douglas Gregor  memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
28141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
2815888376a2bbcfc2f047902249f8455918e2489ae1Nate Begeman
2816f111d935722ed488144600cea5ed03a6b5069e8fPeter CollingbourneGenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
2817f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               SourceLocation GenericLoc, Expr *ControllingExpr,
2818f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               TypeSourceInfo **AssocTypes, Expr **AssocExprs,
2819f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               unsigned NumAssocs, SourceLocation DefaultLoc,
2820f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               SourceLocation RParenLoc,
2821f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               bool ContainsUnexpandedParameterPack,
2822f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               unsigned ResultIndex)
2823f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  : Expr(GenericSelectionExprClass,
2824f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         AssocExprs[ResultIndex]->getType(),
2825f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         AssocExprs[ResultIndex]->getValueKind(),
2826f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         AssocExprs[ResultIndex]->getObjectKind(),
2827f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         AssocExprs[ResultIndex]->isTypeDependent(),
2828f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         AssocExprs[ResultIndex]->isValueDependent(),
2829f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         ContainsUnexpandedParameterPack),
2830f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
2831f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
2832f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    ResultIndex(ResultIndex), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
2833f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    RParenLoc(RParenLoc) {
2834f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SubExprs[CONTROLLING] = ControllingExpr;
2835f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
2836f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
2837f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
2838f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
2839f111d935722ed488144600cea5ed03a6b5069e8fPeter CollingbourneGenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
2840f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               SourceLocation GenericLoc, Expr *ControllingExpr,
2841f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               TypeSourceInfo **AssocTypes, Expr **AssocExprs,
2842f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               unsigned NumAssocs, SourceLocation DefaultLoc,
2843f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               SourceLocation RParenLoc,
2844f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne                               bool ContainsUnexpandedParameterPack)
2845f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  : Expr(GenericSelectionExprClass,
2846f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         Context.DependentTy,
2847f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         VK_RValue,
2848f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         OK_Ordinary,
2849f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         /*isTypeDependent=*/  true,
2850f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         /*isValueDependent=*/ true,
2851f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne         ContainsUnexpandedParameterPack),
2852f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
2853f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
2854f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    ResultIndex(-1U), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
2855f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    RParenLoc(RParenLoc) {
2856f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  SubExprs[CONTROLLING] = ControllingExpr;
2857f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
2858f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
2859f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
2860f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
286177ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===//
286205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//  DesignatedInitExpr
286305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===//
286405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
2865b11382497a923b0d7009e85a1d8eb7bf93ec6d0dChandler CarruthIdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const {
286605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  assert(Kind == FieldDesignator && "Only valid on a field designator");
286705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  if (Field.NameOrField & 0x01)
286805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
286905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  else
287005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    return getField()->getIdentifier();
287105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
287205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
2873c302113179a1c2b1254224ea9b6f5316ceeb375cSean HuntDesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
2874319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                                       unsigned NumDesignators,
2875ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                       const Designator *Designators,
28761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       SourceLocation EqualOrColonLoc,
2877ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                       bool GNUSyntax,
28781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                       Expr **IndexExprs,
28799ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                       unsigned NumIndexExprs,
28809ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                       Expr *Init)
28811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : Expr(DesignatedInitExprClass, Ty,
2882f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall         Init->getValueKind(), Init->getObjectKind(),
2883bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Init->isTypeDependent(), Init->isValueDependent(),
2884bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         Init->containsUnexpandedParameterPack()),
28851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
28861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
2887319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  this->Designators = new (C) Designator[NumDesignators];
28889ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
28899ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // Record the initializer itself.
28907502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall  child_range Child = children();
28919ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  *Child++ = Init;
28929ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
28939ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // Copy the designators and their subexpressions, computing
28949ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  // value-dependence along the way.
28959ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  unsigned IndexIdx = 0;
28969ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  for (unsigned I = 0; I != NumDesignators; ++I) {
2897ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    this->Designators[I] = Designators[I];
28989ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
28999ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    if (this->Designators[I].isArrayDesignator()) {
29009ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Compute type- and value-dependence.
29019ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *Index = IndexExprs[IndexIdx];
2902bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Index->isTypeDependent() || Index->isValueDependent())
2903bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
2904bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2905bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      // Propagate unexpanded parameter packs.
2906bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Index->containsUnexpandedParameterPack())
2907bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ContainsUnexpandedParameterPack = true;
29089ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
29099ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Copy the index expressions into permanent storage.
29109ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
29119ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    } else if (this->Designators[I].isArrayRangeDesignator()) {
29129ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Compute type- and value-dependence.
29139ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *Start = IndexExprs[IndexIdx];
29149ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      Expr *End = IndexExprs[IndexIdx + 1];
2915bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Start->isTypeDependent() || Start->isValueDependent() ||
2916bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          End->isTypeDependent() || End->isValueDependent())
2917bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ValueDependent = true;
2918bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
2919bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      // Propagate unexpanded parameter packs.
2920bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (Start->containsUnexpandedParameterPack() ||
2921bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor          End->containsUnexpandedParameterPack())
2922bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        ExprBits.ContainsUnexpandedParameterPack = true;
29239ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
29249ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      // Copy the start/end expressions into permanent storage.
29259ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
29269ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor      *Child++ = IndexExprs[IndexIdx++];
29279ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor    }
29289ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  }
29299ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor
29309ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
2931ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor}
2932ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
293305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorDesignatedInitExpr *
29341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
293505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           unsigned NumDesignators,
293605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           Expr **IndexExprs, unsigned NumIndexExprs,
293705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           SourceLocation ColonOrEqualLoc,
293805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor                           bool UsesColonSyntax, Expr *Init) {
2939c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2940c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2941319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
29429ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                      ColonOrEqualLoc, UsesColonSyntax,
29439ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor                                      IndexExprs, NumIndexExprs, Init);
294405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
294505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
29461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
2947d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                                                    unsigned NumIndexExprs) {
2948d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2949d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2950d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
2951d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor}
2952d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
2953319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::setDesignators(ASTContext &C,
2954319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                                        const Designator *Desigs,
2955d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor                                        unsigned NumDesigs) {
2956319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  Designators = new (C) Designator[NumDesigs];
2957d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  NumDesignators = NumDesigs;
2958d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor  for (unsigned I = 0; I != NumDesigs; ++I)
2959d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor    Designators[I] = Desigs[I];
2960d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor}
2961d077d759d0c7fceee98f4e77b6423a3f11cfc849Douglas Gregor
296224f4674e697fb53587f0e8485e9c6592f7021ef2Abramo BagnaraSourceRange DesignatedInitExpr::getDesignatorsSourceRange() const {
296324f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara  DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this);
296424f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara  if (size() == 1)
296524f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara    return DIE->getDesignator(0)->getSourceRange();
296624f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara  return SourceRange(DIE->getDesignator(0)->getStartLocation(),
296724f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara                     DIE->getDesignator(size()-1)->getEndLocation());
296824f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara}
296924f4674e697fb53587f0e8485e9c6592f7021ef2Abramo Bagnara
297005c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorSourceRange DesignatedInitExpr::getSourceRange() const {
297105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  SourceLocation StartLoc;
2972d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner  Designator &First =
2973d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    *const_cast<DesignatedInitExpr*>(this)->designators_begin();
297405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  if (First.isFieldDesignator()) {
2975eeae8f072748affce25ab4064982626361293390Douglas Gregor    if (GNUSyntax)
297605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
297705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor    else
297805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor      StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
297905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  } else
2980d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner    StartLoc =
2981d603eaa682cecac2c10771a700cb83aa301653b4Chris Lattner      SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
298205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
298305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
298405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
298505c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
298605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
298705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
298805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
298905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
299005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
299105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
299205c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
299305c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
29941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(D.Kind == Designator::ArrayRangeDesignator &&
299505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor         "Requires array range designator");
299605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
299705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
299805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
299905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
300005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
300105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
300205c13a3411782108d65aab3c77b1a231a4963bc0Douglas GregorExpr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
30031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(D.Kind == Designator::ArrayRangeDesignator &&
300405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor         "Requires array range designator");
300505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  char* Ptr = static_cast<char*>(static_cast<void *>(this));
300605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Ptr += sizeof(DesignatedInitExpr);
300705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
300805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
300905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
301005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
3011ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// \brief Replaces the designator at index @p Idx with the series
3012ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor/// of designators in [First, Last).
3013319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregorvoid DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const Designator *First,
3015ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                                          const Designator *Last) {
3016ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  unsigned NumNewDesignators = Last - First;
3017ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  if (NumNewDesignators == 0) {
3018ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    std::copy_backward(Designators + Idx + 1,
3019ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                       Designators + NumDesignators,
3020ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor                       Designators + Idx);
3021ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    --NumNewDesignators;
3022ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    return;
3023ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  } else if (NumNewDesignators == 1) {
3024ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    Designators[Idx] = *First;
3025ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor    return;
3026ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  }
3027ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
30281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Designator *NewDesignators
3029319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor    = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
3030ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(Designators, Designators + Idx, NewDesignators);
3031ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(First, Last, NewDesignators + Idx);
3032ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  std::copy(Designators + Idx + 1, Designators + NumDesignators,
3033ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor            NewDesignators + Idx + NumNewDesignators);
3034ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  Designators = NewDesignators;
3035ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor  NumDesignators = NumDesignators - 1 + NumNewDesignators;
3036ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor}
3037ffb4b6e299069139908540ce97be4462e16b53a4Douglas Gregor
30381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
30392ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman                             Expr **exprs, unsigned nexprs,
30402ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman                             SourceLocation rparenloc)
3041bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
3042bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor         false, false, false),
3043bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
30441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
30452ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  Exprs = new (C) Stmt*[nexprs];
3046bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  for (unsigned i = 0; i != nexprs; ++i) {
3047bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->isTypeDependent())
3048bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.TypeDependent = true;
3049bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->isValueDependent())
3050bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ValueDependent = true;
3051bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    if (exprs[i]->containsUnexpandedParameterPack())
3052bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      ExprBits.ContainsUnexpandedParameterPack = true;
3053bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
30542ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    Exprs[i] = exprs[i];
3055bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
30562ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
30572ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
3058e996ffd240f20a1048179d7727a6ee3227261921John McCallconst OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) {
3059e996ffd240f20a1048179d7727a6ee3227261921John McCall  if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e))
3060e996ffd240f20a1048179d7727a6ee3227261921John McCall    e = ewc->getSubExpr();
306103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  if (const MaterializeTemporaryExpr *m = dyn_cast<MaterializeTemporaryExpr>(e))
306203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    e = m->GetTemporaryExpr();
3063e996ffd240f20a1048179d7727a6ee3227261921John McCall  e = cast<CXXConstructExpr>(e)->getArg(0);
3064e996ffd240f20a1048179d7727a6ee3227261921John McCall  while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
3065e996ffd240f20a1048179d7727a6ee3227261921John McCall    e = ice->getSubExpr();
3066e996ffd240f20a1048179d7727a6ee3227261921John McCall  return cast<OpaqueValueExpr>(e);
3067e996ffd240f20a1048179d7727a6ee3227261921John McCall}
3068e996ffd240f20a1048179d7727a6ee3227261921John McCall
306905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor//===----------------------------------------------------------------------===//
3070ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//  ExprIterator.
3071ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===//
3072ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
3073ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
3074ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator*() const { return cast<Expr>(*I); }
3075ce2fc3a343ea6098a96d587071cee7299f11957aTed KremenekExpr* ExprIterator::operator->() const { return cast<Expr>(*I); }
3076ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator[](size_t idx) const {
3077ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek  return cast<Expr>(I[idx]);
3078ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek}
3079ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
3080ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenekconst Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
3081ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek
3082ce2fc3a343ea6098a96d587071cee7299f11957aTed Kremenek//===----------------------------------------------------------------------===//
308377ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//  Child Iterators for iterating over subexpressions/substatements
308477ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek//===----------------------------------------------------------------------===//
308577ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek
3086f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne// UnaryExprOrTypeTraitExpr
3087f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter CollingbourneStmt::child_range UnaryExprOrTypeTraitExpr::children() {
30880518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // If this is of a type and the type is a VLA type (and not a typedef), the
30890518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // size expression of the VLA needs to be treated as an executable expression.
30900518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  // Why isn't this weirdness documented better in StmtIterator?
30910518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (isArgumentType()) {
3092f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    if (const VariableArrayType* T = dyn_cast<VariableArrayType>(
30930518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl                                   getArgumentType().getTypePtr()))
309463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall      return child_range(child_iterator(T), child_iterator());
309563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    return child_range();
30960518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
309763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  return child_range(&Argument.Ex, &Argument.Ex + 1);
30989ac5928abeb3a47592201e1c30fe2930c20a507eTed Kremenek}
3099390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
3100563477da25f824e37c535131695dc4dc9b68c465Steve Naroff// ObjCMessageExpr
310163c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCallStmt::child_range ObjCMessageExpr::children() {
310263c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  Stmt **begin;
310304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (getReceiverKind() == Instance)
310463c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    begin = reinterpret_cast<Stmt **>(this + 1);
310563c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  else
310663c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall    begin = reinterpret_cast<Stmt **>(getArgs());
310763c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall  return child_range(begin,
310863c00d7f35fa060c0a446c9df3a4402d9c7757feJohn McCall                     reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
3109563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
3110563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
31114eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff// Blocks
31126b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallBlockDeclRefExpr::BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK,
3113a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor                                   SourceLocation l, bool ByRef,
31146b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall                                   bool constAdded)
3115d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, false, false,
3116a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor         d->isParameterPack()),
31176b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    D(d), Loc(l), IsByRef(ByRef), ConstQualAdded(constAdded)
3118a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor{
3119d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  bool TypeDependent = false;
3120d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  bool ValueDependent = false;
3121d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  computeDeclRefDependence(D, getType(), TypeDependent, ValueDependent);
3122d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  ExprBits.TypeDependent = TypeDependent;
3123d967e31ee796efff24b84b704a063634f6b55627Douglas Gregor  ExprBits.ValueDependent = ValueDependent;
3124a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor}
3125