Expr.cpp revision 3e8dc2ac8926dfbebd8f2f6b74ceba4befccd4d2
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//                     The LLVM Compiler Infrastructure
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// License. See LICENSE.TXT for details.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file implements the Expr class and subclasses.
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/Expr.h"
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/ExprCXX.h"
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/APValue.h"
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/ASTContext.h"
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclObjC.h"
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclCXX.h"
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/DeclTemplate.h"
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/RecordLayout.h"
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/StmtVisitor.h"
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Lex/LiteralSupport.h"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Lex/Lexer.h"
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/Builtins.h"
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/SourceManager.h"
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/Basic/TargetInfo.h"
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/Support/ErrorHandling.h"
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/Support/raw_ostream.h"
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <algorithm>
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectusing namespace clang;
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// isKnownToHaveBooleanValue - Return true if this is an integer expression
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// that is known to return 0 or 1.  This happens for _Bool/bool expressions
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// but also int expressions which are produced by things like comparisons in
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// C.
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isKnownToHaveBooleanValue() const {
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const Expr *E = IgnoreParens();
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // If this value has _Bool type, it is obvious 0/1.
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (E->getType()->isBooleanType()) return true;
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // If this is a non-scalar-integer type, we don't care enough to try.
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (!E->getType()->isIntegralOrEnumerationType()) return false;
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    switch (UO->getOpcode()) {
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case UO_Plus:
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return UO->getSubExpr()->isKnownToHaveBooleanValue();
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    default:
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return false;
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Only look through implicit casts.  If the user writes
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // '(int) (a && b)' treat it as an arbitrary int.
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return CE->getSubExpr()->isKnownToHaveBooleanValue();
58221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    switch (BO->getOpcode()) {
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    default: return false;
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_LT:   // Relational operators.
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_GT:
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_LE:
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_GE:
66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_EQ:   // Equality operators.
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_NE:
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_LAnd: // AND operator.
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_LOr:  // Logical OR operator.
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return true;
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_And:  // Bitwise AND operator.
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_Xor:  // Bitwise XOR operator.
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_Or:   // Bitwise OR operator.
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      // Handle things like (x==2)|(y==12).
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return BO->getLHS()->isKnownToHaveBooleanValue() &&
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom             BO->getRHS()->isKnownToHaveBooleanValue();
78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_Comma:
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    case BO_Assign:
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return BO->getRHS()->isKnownToHaveBooleanValue();
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E))
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom           CO->getFalseExpr()->isKnownToHaveBooleanValue();
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return false;
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// Amusing macro metaprogramming hack: check whether a class provides
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// a more specific implementation of getExprLoc().
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromnamespace {
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// This implementation is used when a class provides a custom
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// implementation of getExprLoc.
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  template <class E, class T>
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SourceLocation getExprLocImpl(const Expr *expr,
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                SourceLocation (T::*v)() const) {
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return static_cast<const E*>(expr)->getExprLoc();
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// This implementation is used when a class doesn't provide
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// a custom implementation of getExprLoc.  Overload resolution
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// should pick it over the implementation above because it's
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  /// more specialized according to function template partial ordering.
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  template <class E>
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SourceLocation getExprLocImpl(const Expr *expr,
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                SourceLocation (Expr::*v)() const) {
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return static_cast<const E*>(expr)->getSourceRange().getBegin();
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSourceLocation Expr::getExprLoc() const {
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  switch (getStmtClass()) {
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case Stmt::NoStmtClass: llvm_unreachable("statement without class");
117392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define ABSTRACT_STMT(type)
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define STMT(type, base) \
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define EXPR(type, base) \
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "clang/AST/StmtNodes.inc"
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  llvm_unreachable("unknown statement kind");
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return SourceLocation();
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Primary Expressions.
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ExplicitTemplateArgumentList::initializeFrom(
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      const TemplateArgumentListInfo &Info) {
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  LAngleLoc = Info.getLAngleLoc();
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  RAngleLoc = Info.getRAngleLoc();
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  NumTemplateArgs = Info.size();
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  for (unsigned i = 0; i != NumTemplateArgs; ++i)
140392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid ExplicitTemplateArgumentList::initializeFrom(
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                   const TemplateArgumentListInfo &Info,
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                   bool &Dependent,
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                   bool &ContainsUnexpandedParameterPack) {
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  LAngleLoc = Info.getLAngleLoc();
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  RAngleLoc = Info.getRAngleLoc();
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  NumTemplateArgs = Info.size();
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Dependent = Dependent || Info[i].getArgument().isDependent();
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ContainsUnexpandedParameterPack
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      = ContainsUnexpandedParameterPack ||
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Info[i].getArgument().containsUnexpandedParameterPack();
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid ExplicitTemplateArgumentList::copyInto(
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                      TemplateArgumentListInfo &Info) const {
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Info.setLAngleLoc(LAngleLoc);
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  Info.setRAngleLoc(RAngleLoc);
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  for (unsigned I = 0; I != NumTemplateArgs; ++I)
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Info.addArgument(getTemplateArgs()[I]);
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstd::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) {
171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return sizeof(ExplicitTemplateArgumentList) +
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstd::size_t ExplicitTemplateArgumentList::sizeFor(
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                      const TemplateArgumentListInfo &Info) {
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return sizeFor(Info.size());
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// \brief Compute the type- and value-dependence of a declaration reference
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// based on the declaration being referenced.
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void computeDeclRefDependence(NamedDecl *D, QualType T,
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                     bool &TypeDependent,
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                     bool &ValueDependent) {
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  TypeDependent = false;
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  ValueDependent = false;
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // (TD) C++ [temp.dep.expr]p3:
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //   An id-expression is type-dependent if it contains:
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // and
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // (VD) C++ [temp.dep.constexpr]p2:
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //  An identifier is value-dependent if it is:
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //  (TD)  - an identifier that was declared with dependent type
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //  (VD)  - a name declared with a dependent type,
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (T->isDependentType()) {
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    TypeDependent = true;
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    ValueDependent = true;
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return;
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
204392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
205392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  //  (TD)  - a conversion-function-id that specifies a dependent type
206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (D->getDeclName().getNameKind()
207392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom           == DeclarationName::CXXConversionFunctionName &&
208392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom           D->getDeclName().getCXXNameType()->isDependentType()) {
209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    TypeDependent = true;
210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    ValueDependent = true;
211392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return;
212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  //  (VD)  - the name of a non-type template parameter,
214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (isa<NonTypeTemplateParmDecl>(D)) {
215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    ValueDependent = true;
216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return;
217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  //  (VD) - a constant with integral or enumeration type and is
220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  //         initialized with an expression that is value-dependent.
221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
222392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Var->getType()->isIntegralOrEnumerationType() &&
223392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        Var->getType().getCVRQualifiers() == Qualifiers::Const) {
224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (const Expr *Init = Var->getAnyInitializer())
225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        if (Init->isValueDependent())
226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          ValueDependent = true;
227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // (VD) - FIXME: Missing from the standard:
230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    //      -  a member function or a static data member of the current
231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    //         instantiation
232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else if (Var->isStaticDataMember() &&
233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom             Var->getDeclContext()->isDependentContext())
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      ValueDependent = true;
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return;
237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // (VD) - FIXME: Missing from the standard:
240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //      -  a member function or a static data member of the current
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  //         instantiation
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) {
243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    ValueDependent = true;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return;
245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid DeclRefExpr::computeDependence() {
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  bool TypeDependent = false;
250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  bool ValueDependent = false;
251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  computeDeclRefDependence(getDecl(), getType(), TypeDependent, ValueDependent);
252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // (TD) C++ [temp.dep.expr]p3:
254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //   An id-expression is type-dependent if it contains:
255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //
256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // and
257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //
258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // (VD) C++ [temp.dep.constexpr]p2:
259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //  An identifier is value-dependent if it is:
260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!TypeDependent && !ValueDependent &&
261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      hasExplicitTemplateArgs() &&
262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      TemplateSpecializationType::anyDependentTemplateArguments(
263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                                            getTemplateArgs(),
264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                                       getNumTemplateArgs())) {
265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    TypeDependent = true;
266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    ValueDependent = true;
267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  ExprBits.TypeDependent = TypeDependent;
270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  ExprBits.ValueDependent = ValueDependent;
271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // Is the declaration a parameter pack?
273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (getDecl()->isParameterPack())
274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    ExprBits.ContainsUnexpandedParameterPack = true;
275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         ValueDecl *D, SourceLocation NameLoc,
279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         const TemplateArgumentListInfo *TemplateArgs,
280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         QualType T, ExprValueKind VK)
281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    DecoratedD(D,
283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom               (QualifierLoc? HasQualifierFlag : 0) |
284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    Loc(NameLoc) {
286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (QualifierLoc) {
287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    NameQualifier *NQ = getNameQualifier();
288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    NQ->QualifierLoc = QualifierLoc;
289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (TemplateArgs)
292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  computeDependence();
295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDeclRefExpr::DeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         ValueDecl *D, const DeclarationNameInfo &NameInfo,
299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         const TemplateArgumentListInfo *TemplateArgs,
300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         QualType T, ExprValueKind VK)
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    DecoratedD(D,
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project               (QualifierLoc? HasQualifierFlag : 0) |
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (QualifierLoc) {
307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NameQualifier *NQ = getNameQualifier();
308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NQ->QualifierLoc = QualifierLoc;
309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (TemplateArgs)
312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  computeDependence();
315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 NestedNameSpecifierLoc QualifierLoc,
319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ValueDecl *D,
320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation NameLoc,
321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 QualType T,
322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ExprValueKind VK,
323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 const TemplateArgumentListInfo *TemplateArgs) {
324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return Create(Context, QualifierLoc, D,
325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                DeclarationNameInfo(D->getDeclName(), NameLoc),
326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                T, VK, TemplateArgs);
327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 NestedNameSpecifierLoc QualifierLoc,
331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ValueDecl *D,
332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 const DeclarationNameInfo &NameInfo,
333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 QualType T,
334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ExprValueKind VK,
335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 const TemplateArgumentListInfo *TemplateArgs) {
336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  std::size_t Size = sizeof(DeclRefExpr);
337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (QualifierLoc != 0)
338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Size += sizeof(NameQualifier);
339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (TemplateArgs)
341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return new (Mem) DeclRefExpr(QualifierLoc, D, NameInfo, TemplateArgs, T, VK);
345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromDeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context,
348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                      bool HasQualifier,
349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                      bool HasExplicitTemplateArgs,
350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                      unsigned NumTemplateArgs) {
351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  std::size_t Size = sizeof(DeclRefExpr);
352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (HasQualifier)
353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Size += sizeof(NameQualifier);
354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (HasExplicitTemplateArgs)
356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return new (Mem) DeclRefExpr(EmptyShell());
360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange DeclRefExpr::getSourceRange() const {
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SourceRange R = getNameInfo().getSourceRange();
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (hasQualifier())
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    R.setBegin(getQualifierLoc().getBeginLoc());
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (hasExplicitTemplateArgs())
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    R.setEnd(getRAngleLoc());
36898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  return R;
36998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
37098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
37198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// FIXME: Maybe this should use DeclPrinter with a special "print predefined
37298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// expr" policy instead.
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstd::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASTContext &Context = CurrentDecl->getASTContext();
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return FD->getNameAsString();
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    llvm::SmallString<256> Name;
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    llvm::raw_svector_ostream Out(Name);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Out << "virtual ";
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (MD->isStatic())
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Out << "static ";
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    PrintingPolicy Policy(Context.getLangOptions());
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    std::string Proto = FD->getQualifiedNameAsString(Policy);
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const FunctionType *AFT = FD->getType()->getAs<FunctionType>();
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const FunctionProtoType *FT = 0;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (FD->hasWrittenPrototype())
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FT = dyn_cast<FunctionProtoType>(AFT);
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Proto += "(";
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (FT) {
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      llvm::raw_string_ostream POut(Proto);
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (i) POut << ", ";
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        std::string Param;
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy);
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        POut << Param;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
40998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      if (FT->isVariadic()) {
410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        if (FD->getNumParams()) POut << ", ";
41198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom        POut << "...";
41298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      }
41398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    }
41498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    Proto += ")";
41598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
41698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
41798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
41898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      if (ThisQuals.hasConst())
41998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom        Proto += " const";
42098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      if (ThisQuals.hasVolatile())
42198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom        Proto += " volatile";
42298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    }
42398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
42498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
42598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      AFT->getResultType().getAsStringInternal(Proto, Policy);
42698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
42798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    Out << Proto;
42898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
42998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    Out.flush();
43098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    return Name.str().str();
43198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
43298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
43398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    llvm::SmallString<256> Name;
434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    llvm::raw_svector_ostream Out(Name);
435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out << (MD->isInstanceMethod() ? '-' : '+');
436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out << '[';
437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // a null check to avoid a crash.
440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Out << ID;
442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const ObjCCategoryImplDecl *CID =
444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Out << '(' << CID << ')';
446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out <<  ' ';
448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out << MD->getSelector().getAsString();
449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out <<  ']';
450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Out.flush();
452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return Name.str().str();
453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "top level";
457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return "";
459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) {
462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (hasAllocation())
463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    C.Deallocate(pVal);
464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  BitWidth = Val.getBitWidth();
466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  unsigned NumWords = Val.getNumWords();
467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  const uint64_t* Words = Val.getRawData();
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (NumWords > 1) {
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    pVal = new (C) uint64_t[NumWords];
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    std::copy(Words, Words + NumWords, pVal);
471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  } else if (NumWords == 1)
472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    VAL = Words[0];
473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  else
474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    VAL = 0;
475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral *
478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral::Create(ASTContext &C, const llvm::APInt &V,
479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                       QualType type, SourceLocation l) {
480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (C) IntegerLiteral(C, V, type, l);
481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral *
484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromIntegerLiteral::Create(ASTContext &C, EmptyShell Empty) {
485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (C) IntegerLiteral(Empty);
486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral *
489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V,
490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                        bool isexact, QualType Type, SourceLocation L) {
491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (C) FloatingLiteral(C, V, isexact, Type, L);
492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral *
495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromFloatingLiteral::Create(ASTContext &C, EmptyShell Empty) {
496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (C) FloatingLiteral(Empty);
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// getValueAsApproximateDouble - This returns the value as an inaccurate
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// double.  Note that this may cause loss of precision, but is useful for
501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// debugging dumps, etc.
502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromdouble FloatingLiteral::getValueAsApproximateDouble() const {
503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  llvm::APFloat V = getValue();
504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  bool ignored;
505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom            &ignored);
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return V.convertToDouble();
508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromStringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                     unsigned ByteLength, bool Wide,
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                     bool Pascal, QualType Ty,
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                     const SourceLocation *Loc,
51498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom                                     unsigned NumStrs) {
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Allocate enough space for the StringLiteral plus an array of locations for
516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // any concatenated string tokens.
517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  void *Mem = C.Allocate(sizeof(StringLiteral)+
518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         sizeof(SourceLocation)*(NumStrs-1),
519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                         llvm::alignOf<StringLiteral>());
520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  StringLiteral *SL = new (Mem) StringLiteral(Ty);
521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // OPTIMIZE: could allocate this appended to the StringLiteral.
523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  char *AStrData = new (C, 1) char[ByteLength];
524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  memcpy(AStrData, StrData, ByteLength);
525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SL->StrData = AStrData;
526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SL->ByteLength = ByteLength;
527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SL->IsWide = Wide;
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SL->IsPascal = Pascal;
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SL->TokLocs[0] = Loc[0];
530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SL->NumConcatenated = NumStrs;
531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (NumStrs != 1)
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return SL;
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectStringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  void *Mem = C.Allocate(sizeof(StringLiteral)+
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         sizeof(SourceLocation)*(NumStrs-1),
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         llvm::alignOf<StringLiteral>());
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  StringLiteral *SL = new (Mem) StringLiteral(QualType());
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SL->StrData = 0;
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SL->ByteLength = 0;
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SL->NumConcatenated = NumStrs;
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return SL;
546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
547ed2ff7a80ea0924de67b50fde0f0b3272e2f89a8Brian Carlstrom
548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid StringLiteral::setString(ASTContext &C, llvm::StringRef Str) {
549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  char *AStrData = new (C, 1) char[Str.size()];
550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  memcpy(AStrData, Str.data(), Str.size());
551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  StrData = AStrData;
552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  ByteLength = Str.size();
553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// getLocationOfByte - Return a source location that points to the specified
556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// byte of this string literal.
557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom///
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// Strings are amazingly complex.  They can be formed from multiple tokens and
559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// can have escape sequences in them in addition to the usual trigraph and
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// escaped newline business.  This routine handles this complexity.
561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom///
562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromSourceLocation StringLiteral::
563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromgetLocationOfByte(unsigned ByteNo, const SourceManager &SM,
564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                  const LangOptions &Features, const TargetInfo &Target) const {
565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  assert(!isWide() && "This doesn't work for wide strings yet");
566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // Loop over all of the tokens in this string until we find the one that
568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // contains the byte we're looking for.
569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  unsigned TokNo = 0;
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  while (1) {
571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    assert(TokNo < getNumConcatenated() && "Invalid byte number!");
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // Get the spelling of the string so that we can get the data that makes up
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // the string literal, not the identifier for the macro it is potentially
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // expanded through.
57798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
57898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Re-lex the token to get its length and original spelling.
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc);
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool Invalid = false;
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (Invalid)
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return StrTokSpellingLoc;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const char *StrData = Buffer.data()+LocInfo.second;
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Create a langops struct and enable trigraphs.  This is sufficient for
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // relexing tokens.
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LangOptions LangOpts;
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LangOpts.Trigraphs = true;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Create a lexer starting at the beginning of this token.
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData,
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                   Buffer.end());
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Token TheTok;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    TheLexer.LexFromRawLexer(TheTok);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Use the StringLiteralParser to compute the length of the string in bytes.
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    StringLiteralParser SLP(&TheTok, 1, SM, Features, Target);
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned TokNumBytes = SLP.GetStringLength();
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // If the byte is in this token, return the location of the byte.
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ByteNo < TokNumBytes ||
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) {
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Now that we know the offset of the token in the spelling, use the
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // preprocessor to get the offset in the original source.
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Move to the next string token.
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ++TokNo;
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ByteNo -= TokNumBytes;
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// corresponds to, e.g. "sizeof" or "[pre]++".
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *UnaryOperator::getOpcodeStr(Opcode Op) {
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  switch (Op) {
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  default: assert(0 && "Unknown unary operator");
626392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PostInc: return "++";
627392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PostDec: return "--";
628392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PreInc:  return "++";
629392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PreDec:  return "--";
630392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_AddrOf:  return "&";
631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Deref:   return "*";
632392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Plus:    return "+";
633392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Minus:   return "-";
634392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Not:     return "~";
635392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_LNot:    return "!";
636392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Real:    return "__real";
637392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Imag:    return "__imag";
638392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Extension: return "__extension__";
639392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
640bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen}
641bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
642bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenUnaryOperatorKind
643bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenUnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
644bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  switch (OO) {
645bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  default: assert(false && "No unary operator for overloaded function");
646bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_PlusPlus:   return Postfix ? UO_PostInc : UO_PreInc;
647bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
648bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_Amp:        return UO_AddrOf;
649bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_Star:       return UO_Deref;
650bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_Plus:       return UO_Plus;
651bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case OO_Minus:      return UO_Minus;
652392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case OO_Tilde:      return UO_Not;
653392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case OO_Exclaim:    return UO_LNot;
654392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
655392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
656392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromOverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
658392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  switch (Opc) {
659392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
660392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
661392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_AddrOf: return OO_Amp;
662392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Deref: return OO_Star;
663392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Plus: return OO_Plus;
664392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Minus: return OO_Minus;
665392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_Not: return OO_Tilde;
666392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case UO_LNot: return OO_Exclaim;
667392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  default: return OO_None;
668392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
669392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
670392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Postfix Operators.
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                   Expr **args, unsigned numargs, QualType t, ExprValueKind VK,
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                   SourceLocation rparenloc)
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  : Expr(SC, t, VK, OK_Ordinary,
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         fn->isTypeDependent(),
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         fn->isValueDependent(),
682bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen         fn->containsUnexpandedParameterPack()),
683bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    NumArgs(numargs) {
684bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SubExprs = new (C) Stmt*[numargs+PREARGS_START+NumPreArgs];
68698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  SubExprs[FN] = fn;
68798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  for (unsigned i = 0; i != numargs; ++i) {
68898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (args[i]->isTypeDependent())
68998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      ExprBits.TypeDependent = true;
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (args[i]->isValueDependent())
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.ValueDependent = true;
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (args[i]->containsUnexpandedParameterPack())
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.ContainsUnexpandedParameterPack = true;
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    SubExprs[i+PREARGS_START+NumPreArgs] = args[i];
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  CallExprBits.NumPreArgs = NumPreArgs;
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  RParenLoc = rparenloc;
70098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
70198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
70298d58bb80c64b02a33662f0ea80351d4a1535267Brian CarlstromCallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
70398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom                   QualType t, ExprValueKind VK, SourceLocation rparenloc)
70498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  : Expr(CallExprClass, t, VK, OK_Ordinary,
70598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom         fn->isTypeDependent(),
70698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom         fn->isValueDependent(),
70798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom         fn->containsUnexpandedParameterPack()),
70898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    NumArgs(numargs) {
70998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
71098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  SubExprs = new (C) Stmt*[numargs+PREARGS_START];
71198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  SubExprs[FN] = fn;
71298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  for (unsigned i = 0; i != numargs; ++i) {
71398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (args[i]->isTypeDependent())
71498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      ExprBits.TypeDependent = true;
71598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (args[i]->isValueDependent())
71698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      ExprBits.ValueDependent = true;
71798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (args[i]->containsUnexpandedParameterPack())
71898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      ExprBits.ContainsUnexpandedParameterPack = true;
71998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
72098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    SubExprs[i+PREARGS_START] = args[i];
72198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
72298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
72398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  CallExprBits.NumPreArgs = 0;
724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  RParenLoc = rparenloc;
725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // FIXME: Why do we allocate this?
730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SubExprs = new (C) Stmt*[PREARGS_START];
731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  CallExprBits.NumPreArgs = 0;
732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCallExpr::CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs,
735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                   EmptyShell Empty)
736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // FIXME: Why do we allocate this?
738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  SubExprs = new (C) Stmt*[PREARGS_START+NumPreArgs];
739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  CallExprBits.NumPreArgs = NumPreArgs;
740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDecl *CallExpr::getCalleeDecl() {
743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Expr *CEE = getCallee()->IgnoreParenCasts();
744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // If we're calling a dereference, look at the pointer instead.
745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (BO->isPtrMemOp())
747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      CEE = BO->getRHS()->IgnoreParenCasts();
748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (UO->getOpcode() == UO_Deref)
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CEE = UO->getSubExpr()->IgnoreParenCasts();
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return DRE->getDecl();
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return ME->getMemberDecl();
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return 0;
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectFunctionDecl *CallExpr::getDirectCallee() {
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// setNumArgs - This changes the number of arguments present in this call.
765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// Any orphaned expressions are deleted by this, and any new operands are set
766221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// to null.
767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // No change, just return.
769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (NumArgs == getNumArgs()) return;
770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // If shrinking # arguments, just delete the extras and forgot them.
772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (NumArgs < getNumArgs()) {
773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    this->NumArgs = NumArgs;
774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return;
775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // Otherwise, we are growing the # arguments.  New an bigger argument array.
778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  unsigned NumPreArgs = getNumPreArgs();
779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Stmt **NewSubExprs = new (C) Stmt*[NumArgs+PREARGS_START+NumPreArgs];
780221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // Copy over args.
781221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  for (unsigned i = 0; i != getNumArgs()+PREARGS_START+NumPreArgs; ++i)
782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    NewSubExprs[i] = SubExprs[i];
783392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Null out new args.
784392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned i = getNumArgs()+PREARGS_START+NumPreArgs;
785392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom       i != NumArgs+PREARGS_START+NumPreArgs; ++i)
786392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NewSubExprs[i] = 0;
787392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
788392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (SubExprs) C.Deallocate(SubExprs);
789392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  SubExprs = NewSubExprs;
790392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  this->NumArgs = NumArgs;
791392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
792392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
793392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
794392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// not, return 0.
795392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromunsigned CallExpr::isBuiltinCall(const ASTContext &Context) const {
796392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // All simple function calls (e.g. func()) are implicitly cast to pointer to
797392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // function. As a result, we try and obtain the DeclRefExpr from the
798392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // ImplicitCastExpr.
799392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
800392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
801392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return 0;
802392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
804221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!DRE)
805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return 0;
806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
808221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!FDecl)
809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return 0;
810221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!FDecl->getIdentifier())
812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return 0;
813221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return FDecl->getBuiltinID();
815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromQualType CallExpr::getCallReturnType() const {
818392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  QualType CalleeType = getCallee()->getType();
819392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
820392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    CalleeType = FnTypePtr->getPointeeType();
821392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
822392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    CalleeType = BPT->getPointeeType();
823392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  else if (const MemberPointerType *MPT
824392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                      = CalleeType->getAs<MemberPointerType>())
825392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    CalleeType = MPT->getPointeeType();
826392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
827392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const FunctionType *FnType = CalleeType->getAs<FunctionType>();
828392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return FnType->getResultType();
829392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
830392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
831392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange CallExpr::getSourceRange() const {
832392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (isa<CXXOperatorCallExpr>(this))
833392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return cast<CXXOperatorCallExpr>(this)->getSourceRange();
834392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
835392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  SourceLocation begin = getCallee()->getLocStart();
836bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  if (begin.isInvalid() && getNumArgs() > 0)
837bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    begin = getArg(0)->getLocStart();
838bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  SourceLocation end = getRParenLoc();
839bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  if (end.isInvalid() && getNumArgs() > 0)
840bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    end = getArg(getNumArgs() - 1)->getLocEnd();
841bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  return SourceRange(begin, end);
842bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen}
843bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
844bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian MonsenOffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
845bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                   SourceLocation OperatorLoc,
846bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                   TypeSourceInfo *tsi,
847bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                   OffsetOfNode* compsPtr, unsigned numComps,
848bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                   Expr** exprsPtr, unsigned numExprs,
849bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                   SourceLocation RParenLoc) {
850bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
851bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                         sizeof(OffsetOfNode) * numComps +
852bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                         sizeof(Expr*) * numExprs);
853bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
854bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
855bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                exprsPtr, numExprs, RParenLoc);
856bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen}
857bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        unsigned numComps, unsigned numExprs) {
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         sizeof(OffsetOfNode) * numComps +
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         sizeof(Expr*) * numExprs);
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return new (Mem) OffsetOfExpr(numComps, numExprs);
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           SourceLocation OperatorLoc, TypeSourceInfo *tsi,
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           OffsetOfNode* compsPtr, unsigned numComps,
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           Expr** exprsPtr, unsigned numExprs,
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           SourceLocation RParenLoc)
87198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
872392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         /*TypeDependent=*/false,
87398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom         /*ValueDependent=*/tsi->getType()->isDependentType(),
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         tsi->getType()->containsUnexpandedParameterPack()),
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
876392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NumComps(numComps), NumExprs(numExprs)
877392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{
878392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for(unsigned i = 0; i < numComps; ++i) {
879392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    setComponent(i, compsPtr[i]);
880392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
881392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
882392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for(unsigned i = 0; i < numExprs; ++i) {
883392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent())
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.ValueDependent = true;
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (exprsPtr[i]->containsUnexpandedParameterPack())
88698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      ExprBits.ContainsUnexpandedParameterPack = true;
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    setIndexExpr(i, exprsPtr[i]);
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
89098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  assert(getKind() == Field || getKind() == Identifier);
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (getKind() == Field)
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return getField()->getIdentifier();
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
89898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
899221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromMemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                               NestedNameSpecifierLoc QualifierLoc,
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               ValueDecl *memberdecl,
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               DeclAccessPair founddecl,
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               DeclarationNameInfo nameinfo,
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               const TemplateArgumentListInfo *targs,
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               QualType ty,
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               ExprValueKind vk,
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                               ExprObjectKind ok) {
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  std::size_t Size = sizeof(MemberExpr);
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  bool hasQualOrFound = (QualifierLoc ||
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         founddecl.getDecl() != memberdecl ||
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         founddecl.getAccess() != memberdecl->getAccess());
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (hasQualOrFound)
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Size += sizeof(MemberNameQualifier);
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (targs)
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Size += ExplicitTemplateArgumentList::sizeFor(*targs);
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                       ty, vk, ok);
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (hasQualOrFound) {
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // FIXME: Wrong. We should be looking at the member declaration we found.
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) {
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E->setValueDependent(true);
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E->setTypeDependent(true);
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    E->HasQualifierOrFoundDecl = true;
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MemberNameQualifier *NQ = E->getMemberQualifier();
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NQ->QualifierLoc = QualifierLoc;
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NQ->FoundDecl = founddecl;
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (targs) {
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    E->HasExplicitTemplateArgumentList = true;
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    E->getExplicitTemplateArgs().initializeFrom(*targs);
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return E;
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSourceRange MemberExpr::getSourceRange() const {
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SourceLocation StartLoc;
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (isImplicitAccess()) {
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (hasQualifier())
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      StartLoc = getQualifierLoc().getBeginLoc();
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      StartLoc = MemberLoc;
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  } else {
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // FIXME: We don't want this to happen. Rather, we should be able to
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // detect all kinds of implicit accesses more cleanly.
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    StartLoc = getBase()->getLocStart();
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (StartLoc.isInvalid())
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      StartLoc = MemberLoc;
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  SourceLocation EndLoc =
961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    HasExplicitTemplateArgumentList? getRAngleLoc()
962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                   : getMemberNameInfo().getEndLoc();
96343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return SourceRange(StartLoc, EndLoc);
96543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
96643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
96743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstromconst char *CastExpr::getCastKindName() const {
96843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  switch (getCastKind()) {
96943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_Dependent:
97043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "Dependent";
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_BitCast:
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "BitCast";
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_LValueBitCast:
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "LValueBitCast";
97543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_LValueToRValue:
97643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "LValueToRValue";
97743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_GetObjCProperty:
97843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "GetObjCProperty";
97943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_NoOp:
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "NoOp";
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_BaseToDerived:
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "BaseToDerived";
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_DerivedToBase:
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "DerivedToBase";
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_UncheckedDerivedToBase:
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "UncheckedDerivedToBase";
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_Dynamic:
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "Dynamic";
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_ToUnion:
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "ToUnion";
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_ArrayToPointerDecay:
99243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "ArrayToPointerDecay";
99343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_FunctionToPointerDecay:
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "FunctionToPointerDecay";
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_NullToMemberPointer:
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "NullToMemberPointer";
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_NullToPointer:
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "NullToPointer";
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_BaseToDerivedMemberPointer:
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "BaseToDerivedMemberPointer";
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_DerivedToBaseMemberPointer:
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "DerivedToBaseMemberPointer";
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_UserDefinedConversion:
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "UserDefinedConversion";
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_ConstructorConversion:
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "ConstructorConversion";
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_IntegralToPointer:
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "IntegralToPointer";
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CK_PointerToIntegral:
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return "PointerToIntegral";
1011392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_PointerToBoolean:
1012392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "PointerToBoolean";
1013392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_ToVoid:
1014392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "ToVoid";
1015392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_VectorSplat:
1016392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "VectorSplat";
1017392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_IntegralCast:
1018392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "IntegralCast";
1019392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_IntegralToBoolean:
1020392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "IntegralToBoolean";
1021392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_IntegralToFloating:
1022392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "IntegralToFloating";
1023392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_FloatingToIntegral:
1024392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "FloatingToIntegral";
1025392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_FloatingCast:
1026392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "FloatingCast";
1027392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_FloatingToBoolean:
1028392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "FloatingToBoolean";
1029392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_MemberPointerToBoolean:
1030392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "MemberPointerToBoolean";
1031392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_AnyPointerToObjCPointerCast:
1032392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "AnyPointerToObjCPointerCast";
1033392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_AnyPointerToBlockPointerCast:
1034392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return "AnyPointerToBlockPointerCast";
1035392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CK_ObjCObjectLValueCast:
1036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "ObjCObjectLValueCast";
1037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_FloatingRealToComplex:
1038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "FloatingRealToComplex";
1039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_FloatingComplexToReal:
1040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "FloatingComplexToReal";
1041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_FloatingComplexToBoolean:
1042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "FloatingComplexToBoolean";
1043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_FloatingComplexCast:
1044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "FloatingComplexCast";
1045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_FloatingComplexToIntegralComplex:
1046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "FloatingComplexToIntegralComplex";
1047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CK_IntegralRealToComplex:
1048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "IntegralRealToComplex";
104943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_IntegralComplexToReal:
1050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return "IntegralComplexToReal";
105143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_IntegralComplexToBoolean:
105243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "IntegralComplexToBoolean";
1053976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom  case CK_IntegralComplexCast:
1054976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom    return "IntegralComplexCast";
105543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case CK_IntegralComplexToFloatingComplex:
105643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return "IntegralComplexToFloatingComplex";
105743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  }
105843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
105943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  llvm_unreachable("Unhandled cast kind!");
106043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  return 0;
106143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
106243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
106343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromExpr *CastExpr::getSubExprAsWritten() {
1064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Expr *SubExpr = 0;
1065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  CastExpr *E = this;
1066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  do {
1067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    SubExpr = E->getSubExpr();
1068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // Skip any temporary bindings; they're implicit.
1070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
1071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      SubExpr = Binder->getSubExpr();
1072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // Conversions by constructor and conversion functions have a
1074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // subexpression describing the call; strip it off.
1075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (E->getCastKind() == CK_ConstructorConversion)
1076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
1077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    else if (E->getCastKind() == CK_UserDefinedConversion)
1078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
1079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // If the subexpression we're left with is an implicit cast, look
1081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // through that, too.
1082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
1083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return SubExpr;
108543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
1086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
108743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian CarlstromCXXBaseSpecifier **CastExpr::path_buffer() {
108843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  switch (getStmtClass()) {
108943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define ABSTRACT_STMT(x)
109043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define CASTEXPR(Type, Base) \
109143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case Stmt::Type##Class: \
109243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
109343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#define STMT(Type, Base)
109443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom#include "clang/AST/StmtNodes.inc"
109543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  default:
109643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    llvm_unreachable("non-cast expressions not possible here");
109743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return 0;
109843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  }
109943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom}
1100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid CastExpr::setCastPath(const CXXCastPath &Path) {
1102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  assert(Path.size() == path_size());
1103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
1104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T,
1107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                           CastKind Kind, Expr *Operand,
1108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                           const CXXCastPath *BasePath,
1109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                           ExprValueKind VK) {
1110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  void *Buffer =
1112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  ImplicitCastExpr *E =
1114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
1115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (PathSize) E->setCastPath(*BasePath);
1116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return E;
1117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C,
1120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                                unsigned PathSize) {
1121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  void *Buffer =
1122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
1124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T,
1128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                       ExprValueKind VK, CastKind K, Expr *Op,
1129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                       const CXXCastPath *BasePath,
1130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                       TypeSourceInfo *WrittenTy,
1131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                       SourceLocation L, SourceLocation R) {
1132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  void *Buffer =
1134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  CStyleCastExpr *E =
1136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
1137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (PathSize) E->setCastPath(*BasePath);
1138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return E;
1139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromCStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
1142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  void *Buffer =
1143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
1145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
1148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// corresponds to, e.g. "<<=".
1149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst char *BinaryOperator::getOpcodeStr(Opcode Op) {
115098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  switch (Op) {
115198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_PtrMemD:   return ".*";
115298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_PtrMemI:   return "->*";
115398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_Mul:       return "*";
115498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_Div:       return "/";
115598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_Rem:       return "%";
1156392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Add:       return "+";
1157392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Sub:       return "-";
1158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Shl:       return "<<";
1159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Shr:       return ">>";
1160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_LT:        return "<";
1161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_GT:        return ">";
1162392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_LE:        return "<=";
1163392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_GE:        return ">=";
1164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_EQ:        return "==";
1165392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_NE:        return "!=";
1166392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_And:       return "&";
1167392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Xor:       return "^";
1168392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Or:        return "|";
1169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_LAnd:      return "&&";
1170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_LOr:       return "||";
1171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_Assign:    return "=";
1172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_MulAssign: return "*=";
1173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_DivAssign: return "/=";
1174392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_RemAssign: return "%=";
1175392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_AddAssign: return "+=";
1176392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_SubAssign: return "-=";
1177392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BO_ShlAssign: return "<<=";
117898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_ShrAssign: return ">>=";
117998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case BO_AndAssign: return "&=";
1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case BO_XorAssign: return "^=";
1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case BO_OrAssign:  return "|=";
1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case BO_Comma:     return ",";
1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return "";
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBinaryOperatorKind
1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  switch (OO) {
1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  default: assert(false && "Not an overloadable binary operator");
1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Plus: return BO_Add;
1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Minus: return BO_Sub;
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Star: return BO_Mul;
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Slash: return BO_Div;
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Percent: return BO_Rem;
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Caret: return BO_Xor;
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Amp: return BO_And;
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Pipe: return BO_Or;
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Equal: return BO_Assign;
1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Less: return BO_LT;
1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Greater: return BO_GT;
1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_PlusEqual: return BO_AddAssign;
1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_MinusEqual: return BO_SubAssign;
1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_StarEqual: return BO_MulAssign;
1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_SlashEqual: return BO_DivAssign;
1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_PercentEqual: return BO_RemAssign;
1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_CaretEqual: return BO_XorAssign;
1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_AmpEqual: return BO_AndAssign;
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_PipeEqual: return BO_OrAssign;
1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_LessLess: return BO_Shl;
1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_GreaterGreater: return BO_Shr;
121381c4de7869b646592127e952cda763abf8305069Brian Carlstrom  case OO_LessLessEqual: return BO_ShlAssign;
1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_GreaterGreaterEqual: return BO_ShrAssign;
1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_EqualEqual: return BO_EQ;
1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_ExclaimEqual: return BO_NE;
1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_LessEqual: return BO_LE;
1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_GreaterEqual: return BO_GE;
1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_AmpAmp: return BO_LAnd;
1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_PipePipe: return BO_LOr;
1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_Comma: return BO_Comma;
1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case OO_ArrowStar: return BO_PtrMemI;
1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  static const OverloadedOperatorKind OverOps[] = {
1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Star, OO_Slash, OO_Percent,
1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Plus, OO_Minus,
1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_LessLess, OO_GreaterGreater,
1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_EqualEqual, OO_ExclaimEqual,
1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Amp,
1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Caret,
1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Pipe,
1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_AmpAmp,
1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_PipePipe,
1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Equal, OO_StarEqual,
1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_SlashEqual, OO_PercentEqual,
1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_PlusEqual, OO_MinusEqual,
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_LessLessEqual, OO_GreaterGreaterEqual,
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_AmpEqual, OO_CaretEqual,
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_PipeEqual,
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OO_Comma
1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  };
1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return OverOps[Opc];
1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectInitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           Expr **initExprs, unsigned numInits,
125281c4de7869b646592127e952cda763abf8305069Brian Carlstrom                           SourceLocation rbraceloc)
125381c4de7869b646592127e952cda763abf8305069Brian Carlstrom  : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
125481c4de7869b646592127e952cda763abf8305069Brian Carlstrom         false),
125581c4de7869b646592127e952cda763abf8305069Brian Carlstrom    InitExprs(C, numInits),
125681c4de7869b646592127e952cda763abf8305069Brian Carlstrom    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    HadArrayRangeDesignator(false)
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
125981c4de7869b646592127e952cda763abf8305069Brian Carlstrom  for (unsigned I = 0; I != numInits; ++I) {
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (initExprs[I]->isTypeDependent())
1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.TypeDependent = true;
1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (initExprs[I]->isValueDependent())
1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.ValueDependent = true;
1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (initExprs[I]->containsUnexpandedParameterPack())
1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExprBits.ContainsUnexpandedParameterPack = true;
1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
12677b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
12687b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom  InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
12697b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom}
12707b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom
12717b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstromvoid InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
12727b476c43f6a45574eb34697244b592e7b09f05a3Brian Carlstrom  if (NumInits > InitExprs.size())
1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    InitExprs.reserve(C, NumInits);
1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  InitExprs.resize(C, NumInits, 0);
1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (Init >= InitExprs.size()) {
1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    InitExprs.back() = expr;
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 0;
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  InitExprs[Init] = expr;
1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return Result;
1290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
1291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid InitListExpr::setArrayFiller(Expr *filler) {
1293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  ArrayFillerOrUnionFieldInit = filler;
1294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Fill out any "holes" in the array due to designated initializers.
1295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  Expr **inits = getInits();
1296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned i = 0, e = getNumInits(); i != e; ++i)
1297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (inits[i] == 0)
1298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      inits[i] = filler;
1299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
1300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceRange InitListExpr::getSourceRange() const {
1302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (SyntacticForm)
1303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return SyntacticForm->getSourceRange();
1304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  SourceLocation Beg = LBraceLoc, End = RBraceLoc;
1305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (Beg.isInvalid()) {
1306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Find the first non-null initializer.
1307bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    for (InitExprsTy::const_iterator I = InitExprs.begin(),
1308bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                     E = InitExprs.end();
1309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      I != E; ++I) {
1310bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      if (Stmt *S = *I) {
1311bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        Beg = S->getLocStart();
1312bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        break;
1313bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      }
1314bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    }
1315bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  }
1316bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  if (End.isInvalid()) {
1317bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    // Find the first non-null initializer from the end.
1318bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(),
1319bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen                                             E = InitExprs.rend();
1320bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      I != E; ++I) {
1321bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      if (Stmt *S = *I) {
1322bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        End = S->getSourceRange().getEnd();
1323bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        break;
1324bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      }
1325bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    }
1326bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  }
1327bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  return SourceRange(Beg, End);
1328bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen}
132998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// getFunctionType - Return the underlying function type for this block.
1331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom///
1332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromconst FunctionType *BlockExpr::getFunctionType() const {
1333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return getType()->getAs<BlockPointerType>()->
1334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                    getPointeeType()->getAs<FunctionType>();
1335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
1336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromSourceLocation BlockExpr::getCaretLocation() const {
1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return TheBlock->getCaretLocation();
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst Stmt *BlockExpr::getBody() const {
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return TheBlock->getBody();
134298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
134398d58bb80c64b02a33662f0ea80351d4a1535267Brian CarlstromStmt *BlockExpr::getBody() {
134498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  return TheBlock->getBody();
134598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
134698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
134898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom//===----------------------------------------------------------------------===//
134998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom// Generic Expression Routines
135098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom//===----------------------------------------------------------------------===//
135198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
135298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// isUnusedResultAWarning - Return true if this immediate expression should
135398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// be warned about if the result is unused.  If so, fill in Loc and Ranges
135498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// with location to warn on and the source range[s] to report with the
135598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom/// warning.
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  SourceRange &R2, ASTContext &Ctx) const {
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Don't warn if the expr is type dependent. The type could end up
1359bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  // instantiating to void.
1360bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  if (isTypeDependent())
1361bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return false;
1362bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1363392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  switch (getStmtClass()) {
1364bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  default:
1365bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (getType()->isVoidType())
1366bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      return false;
1367bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    Loc = getExprLoc();
1368bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    R1 = getSourceRange();
1369bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return true;
1370bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case ParenExprClass:
1371bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return cast<ParenExpr>(this)->getSubExpr()->
1372bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      isUnusedResultAWarning(Loc, R1, R2, Ctx);
1373bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case GenericSelectionExprClass:
1374bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return cast<GenericSelectionExpr>(this)->getResultExpr()->
1375bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      isUnusedResultAWarning(Loc, R1, R2, Ctx);
1376bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case UnaryOperatorClass: {
1377bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    const UnaryOperator *UO = cast<UnaryOperator>(this);
1378bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    switch (UO->getOpcode()) {
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    default: break;
138143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    case UO_PostInc:
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case UO_PostDec:
1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case UO_PreInc:
1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case UO_PreDec:                 // ++/--
1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return false;  // Not a warning.
138698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    case UO_Deref:
1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Dereferencing a volatile pointer is a side-effect.
1388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return false;
1390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      break;
1391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    case UO_Real:
1392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    case UO_Imag:
1393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      // accessing a piece of a volatile complex is a side-effect.
1394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
1395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          .isVolatileQualified())
1396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return false;
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      break;
139898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    case UO_Extension:
1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
140043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    }
140143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    Loc = UO->getOperatorLoc();
140243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    R1 = UO->getSubExpr()->getSourceRange();
140343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom    return true;
140443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  }
140543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom  case BinaryOperatorClass: {
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const BinaryOperator *BO = cast<BinaryOperator>(this);
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    switch (BO->getOpcode()) {
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      default:
1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        break;
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Consider the RHS of comma for side effects. LHS was checked by
1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Sema::CheckCommaOperands.
1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      case BO_Comma:
141398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom        // ((foo = <blah>), 0) is an idiom for hiding the result (and
1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        // lvalue-ness) of an assignment written in a macro.
1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (IntegerLiteral *IE =
1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project              dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          if (IE->getValue() == 0)
1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            return false;
1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Consider '||', '&&' to have side effects if the LHS or RHS does.
1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      case BO_LAnd:
1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      case BO_LOr:
1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          return false;
1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        break;
1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (BO->isAssignmentOp())
1429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return false;
1430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    Loc = BO->getOperatorLoc();
1431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    R1 = BO->getLHS()->getSourceRange();
1432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    R2 = BO->getRHS()->getSourceRange();
1433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return true;
1434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CompoundAssignOperatorClass:
1436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case VAArgExprClass:
1437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return false;
1438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case ConditionalOperatorClass: {
1440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // If only one of the LHS or RHS is a warning, the operator might
1441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // be being used for control flow. Only warn if both the LHS and
1442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // RHS are warnings.
1443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
1444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (!Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return false;
1446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (!Exp->getLHS())
1447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return true;
1448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case MemberExprClass:
1452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // If the base pointer or element is to a volatile pointer/field, accessing
1453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // it is a side effect.
1454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return false;
1456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    Loc = cast<MemberExpr>(this)->getMemberLoc();
1457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    R1 = SourceRange(Loc, Loc);
1458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return true;
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ArraySubscriptExprClass:
1462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // If the base pointer or element is to a volatile pointer/field, accessing
1463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // it is a side effect.
1464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return false;
1466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CallExprClass:
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXOperatorCallExprClass:
1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXMemberCallExprClass: {
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // If this is a direct call, get the callee.
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const CallExpr *CE = cast<CallExpr>(this);
1476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (const Decl *FD = CE->getCalleeDecl()) {
1477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      // If the callee has attribute pure, const, or warn_unused_result, warn
1478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      // about it. void foo() { strlen("bar"); } should warn.
1479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      //
1480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      // updated to match for QoI.
1482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (FD->getAttr<WarnUnusedResultAttr>() ||
1483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom          FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        Loc = CE->getCallee()->getLocStart();
1485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        R1 = CE->getCallee()->getSourceRange();
1486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        if (unsigned NumArgs = CE->getNumArgs())
1488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom          R2 = SourceRange(CE->getArg(0)->getLocStart(),
1489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                           CE->getArg(NumArgs-1)->getLocEnd());
1490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        return true;
1491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return false;
1494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXTemporaryObjectExprClass:
1497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXConstructExprClass:
1498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return false;
1499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case ObjCMessageExprClass: {
1501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    const ObjCMethodDecl *MD = ME->getMethodDecl();
1503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      Loc = getExprLoc();
1505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return true;
1506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return false;
150898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
150998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCPropertyRefExprClass:
1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Loc = getExprLoc();
1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    R1 = getSourceRange();
1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case StmtExprClass: {
1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Statement exprs don't logically have side effects themselves, but are
1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // sometimes used in macros in ways that give them a type that is unused.
1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // however, if the result of the stmt expr is dead, we don't want to emit a
1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // warning.
1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1522bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (!CS->body_empty()) {
1523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1525bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
1526bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
1527bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen          return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1528bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    }
1529bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1530bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (getType()->isVoidType())
1531bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      return false;
1532bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    Loc = cast<StmtExpr>(this)->getLParenLoc();
1533bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    R1 = getSourceRange();
1534bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return true;
1535bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  }
1536bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case CStyleCastExprClass:
1537bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    // If this is an explicit cast to void, allow it.  People do this when they
1538bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    // think they know what they're doing :).
1539bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (getType()->isVoidType())
1540bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      return false;
1541bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    Loc = cast<CStyleCastExpr>(this)->getLParenLoc();
1542bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
1543bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    return true;
1544bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen  case CXXFunctionalCastExprClass: {
1545bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (getType()->isVoidType())
1546bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      return false;
1547bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    const CastExpr *CE = cast<CastExpr>(this);
1548bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen
1549bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    // If this is a cast to void or a constructor conversion, check the operand.
1550bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    // Otherwise, the result of the cast is unused.
1551bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    if (CE->getCastKind() == CK_ToVoid ||
1552bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen        CE->getCastKind() == CK_ConstructorConversion)
1553bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen      return (cast<CastExpr>(this)->getSubExpr()
1554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom              ->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1555bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc();
1556bf9ac266e34f910ace31880ea92b8deaf6212aa6Kristian Monsen    R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange();
155798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    return true;
155898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
155998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
156098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  case ImplicitCastExprClass:
156198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    // Check the operand, since implicit casts are inserted by Sema
156298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    return (cast<ImplicitCastExpr>(this)
1563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXDefaultArgExprClass:
1566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return (cast<CXXDefaultArgExpr>(this)
1567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXNewExprClass:
1570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // FIXME: In theory, there might be new expressions that don't have side
1571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // effects (e.g. a placement new with an uninitialized POD).
1572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXDeleteExprClass:
1573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return false;
1574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXBindTemporaryExprClass:
1575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return (cast<CXXBindTemporaryExpr>(this)
1576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case ExprWithCleanupsClass:
1578392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return (cast<ExprWithCleanups>(this)
1579392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1580392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
1581392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
1582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1583392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isOBJCGCCandidate - Check if an expression is objc gc'able.
1584392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// returns true, if it is; false otherwise.
1585392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
1586392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const Expr *E = IgnoreParens();
1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  switch (E->getStmtClass()) {
1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  default:
1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return false;
1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCIvarRefExprClass:
1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case Expr::UnaryOperatorClass:
1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ImplicitCastExprClass:
1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CStyleCastExprClass:
1597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case DeclRefExprClass: {
1599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const Decl *D = cast<DeclRefExpr>(E)->getDecl();
1600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (VD->hasGlobalStorage())
1602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return true;
1603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      QualType T = VD->getType();
1604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // dereferencing to a  pointer is always a gc'able candidate,
1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // unless it is __weak.
1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return T->isPointerType() &&
1607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project             (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return false;
1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case MemberExprClass: {
1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const MemberExpr *M = cast<MemberExpr>(E);
1613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return M->getBase()->isOBJCGCCandidate(Ctx);
1614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ArraySubscriptExprClass:
1616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx);
1617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
161898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
161998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
162098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrombool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
162198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  if (isTypeDependent())
162298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    return false;
162398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
162498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
162598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
162698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromstatic Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1,
162798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom                                          Expr::CanThrowResult CT2) {
162898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  // CanThrowResult constants are ordered so that the maximum is the correct
162998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  // merge result.
163098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  return CT1 > CT2 ? CT1 : CT2;
163198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom}
163298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
163398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstromstatic Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) {
163498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  Expr *E = const_cast<Expr*>(CE);
163598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  Expr::CanThrowResult R = Expr::CT_Cannot;
163698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  for (Expr::child_range I = E->children(); I && R != Expr::CT_Can; ++I) {
163798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C));
1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return R;
1640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanCalleeThrow(ASTContext &Ctx, const Decl *D,
1643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                           bool NullThrows = true) {
1644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!D)
1645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return NullThrows ? Expr::CT_Can : Expr::CT_Cannot;
1646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // See if we can get a function type from the decl somehow.
1648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  const ValueDecl *VD = dyn_cast<ValueDecl>(D);
1649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!VD) // If we have no clue what we're calling, assume the worst.
1650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Can;
1651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // As an extension, we assume that __attribute__((nothrow)) functions don't
1653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // throw.
1654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
1655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  QualType T = VD->getType();
1658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  const FunctionProtoType *FT;
1659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if ((FT = T->getAs<FunctionProtoType>())) {
1660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  } else if (const PointerType *PT = T->getAs<PointerType>())
1661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    FT = PT->getPointeeType()->getAs<FunctionProtoType>();
1662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
1663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    FT = RT->getPointeeType()->getAs<FunctionProtoType>();
1664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  else if (const MemberPointerType *MT = T->getAs<MemberPointerType>())
1665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    FT = MT->getPointeeType()->getAs<FunctionProtoType>();
1666392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  else if (const BlockPointerType *BT = T->getAs<BlockPointerType>())
1667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    FT = BT->getPointeeType()->getAs<FunctionProtoType>();
1668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!FT)
1670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Can;
1671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return FT->isNothrow(Ctx) ? Expr::CT_Cannot : Expr::CT_Can;
1673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) {
1676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (DC->isTypeDependent())
1677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Dependent;
1678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!DC->getTypeAsWritten()->isReferenceType())
1680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1682392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot;
1683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic Expr::CanThrowResult CanTypeidThrow(ASTContext &C,
1686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                           const CXXTypeidExpr *DC) {
1687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (DC->isTypeOperand())
1688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1689392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1690392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  Expr *Op = DC->getExprOperand();
1691392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (Op->isTypeDependent())
1692392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return Expr::CT_Dependent;
1693392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
1694392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const RecordType *RT = Op->getType()->getAs<RecordType>();
1695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!RT)
1696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic())
1699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  if (Op->Classify(C).isPRValue())
1702221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Expr::CT_Cannot;
1703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return Expr::CT_Can;
1705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
1708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  // C++ [expr.unary.noexcept]p3:
1709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //   [Can throw] if in a potentially-evaluated context the expression would
1710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  //   contain:
1711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  switch (getStmtClass()) {
1712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXThrowExprClass:
1713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //   - a potentially evaluated throw-expression
1714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CT_Can;
1715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1716221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXDynamicCastExprClass: {
1717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //   - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //     where T is a reference type, that requires a run-time check
1719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this));
1720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CT == CT_Can)
1721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT;
1722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXTypeidExprClass:
1726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //   - a potentially evaluated typeid expression applied to a glvalue
1727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //     expression whose type is a polymorphic class type
1728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CanTypeidThrow(C, cast<CXXTypeidExpr>(this));
1729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //   - a potentially evaluated call to a function, member function, function
1731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //     pointer, or member function pointer that does not have a non-throwing
1732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    //     exception-specification
1733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CallExprClass:
1734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXOperatorCallExprClass:
1735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXMemberCallExprClass: {
1736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = CanCalleeThrow(C,cast<CallExpr>(this)->getCalleeDecl());
1737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CT == CT_Can)
1738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT;
1739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXConstructExprClass:
1743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXTemporaryObjectExprClass: {
1744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = CanCalleeThrow(C,
1745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        cast<CXXConstructExpr>(this)->getConstructor());
1746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CT == CT_Can)
1747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT;
1748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1751221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXNewExprClass: {
1752221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = MergeCanThrow(
1753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        CanCalleeThrow(C, cast<CXXNewExpr>(this)->getOperatorNew()),
1754221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        CanCalleeThrow(C, cast<CXXNewExpr>(this)->getConstructor(),
1755221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                       /*NullThrows*/false));
1756221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CT == CT_Can)
1757221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT;
1758221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1759221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXDeleteExprClass: {
1762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = CanCalleeThrow(C,
1763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        cast<CXXDeleteExpr>(this)->getOperatorDelete());
1764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (CT == CT_Can)
1765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT;
1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const Expr *Arg = cast<CXXDeleteExpr>(this)->getArgument();
1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Unwrap exactly one implicit cast, which converts all pointers to void*.
1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (const ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg))
1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      Arg = Cast->getSubExpr();
1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (const PointerType *PT = Arg->getType()->getAs<PointerType>()) {
1771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) {
1772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        CanThrowResult CT2 = CanCalleeThrow(C,
1773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom            cast<CXXRecordDecl>(RT->getDecl())->getDestructor());
1774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        if (CT2 == CT_Can)
1775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom          return CT2;
1776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        CT = MergeCanThrow(CT, CT2);
1777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXBindTemporaryExprClass: {
1783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // The bound temporary has to be destroyed again, which might throw.
1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    CanThrowResult CT = CanCalleeThrow(C,
1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor());
1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (CT == CT_Can)
1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return CT;
1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1789221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // ObjC message sends are like function calls, but never have exception
1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // specs.
1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCMessageExprClass:
1794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCPropertyRefExprClass:
1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return CT_Can;
1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Many other things have subexpressions, so we have to test those.
1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Some are simple:
1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ParenExprClass:
1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case MemberExprClass:
1801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXReinterpretCastExprClass:
1802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXConstCastExprClass:
1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ConditionalOperatorClass:
1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CompoundLiteralExprClass:
1805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ExtVectorElementExprClass:
1806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case InitListExprClass:
1807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case DesignatedInitExprClass:
1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ParenListExprClass:
1809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case VAArgExprClass:
1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXDefaultArgExprClass:
1811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ExprWithCleanupsClass:
1812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCIvarRefExprClass:
1813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCIsaExprClass:
1814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ShuffleVectorExprClass:
1815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CanSubExprsThrow(C, this);
1816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // Some might be dependent for other reasons.
1818221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case UnaryOperatorClass:
1819221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case ArraySubscriptExprClass:
1820221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case ImplicitCastExprClass:
1821221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CStyleCastExprClass:
1822221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXStaticCastExprClass:
1823221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXFunctionalCastExprClass:
1824221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case BinaryOperatorClass:
1825221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CompoundAssignOperatorClass: {
1826221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot;
1827221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1828221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1829221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1830221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms.
1831221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case StmtExprClass:
1832221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CT_Can;
1833221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1834221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case ChooseExprClass:
1835221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (isTypeDependent() || isValueDependent())
1836221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT_Dependent;
1837221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C);
1838221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1839221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case GenericSelectionExprClass:
1840221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (cast<GenericSelectionExpr>(this)->isResultDependent())
1841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      return CT_Dependent;
1842221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return cast<GenericSelectionExpr>(this)->getResultExpr()->CanThrow(C);
1843221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1844221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // Some expressions are always dependent.
1845221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case DependentScopeDeclRefExprClass:
1846221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXUnresolvedConstructExprClass:
1847221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case CXXDependentScopeMemberExprClass:
1848221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CT_Dependent;
1849221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1850221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  default:
1851221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // All other expressions don't have subexpressions, or else they are
1852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // unevaluated.
1853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return CT_Cannot;
1854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1857221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr* Expr::IgnoreParens() {
1858221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Expr* E = this;
1859221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  while (true) {
1860221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      E = P->getSubExpr();
1862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      continue;
1863221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1864221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1865221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (P->getOpcode() == UO_Extension) {
1866221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getSubExpr();
1867221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1868221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1869221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1870221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (!P->isResultDependent()) {
1872221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getResultExpr();
1873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
1875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return E;
1877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
1881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// or CastExprs or ImplicitCastExprs, returning their operand.
1882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *Expr::IgnoreParenCasts() {
1883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  Expr *E = this;
1884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  while (true) {
1885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E = P->getSubExpr();
1887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      continue;
1888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E = P->getSubExpr();
1891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      continue;
1892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (P->getOpcode() == UO_Extension) {
1895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = P->getSubExpr();
1896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1897976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom      }
1898976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom    }
1899976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (!P->isResultDependent()) {
1901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getResultExpr();
1902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1904976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom    }
1905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return E;
1906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue
1910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// casts.  This is intended purely as a temporary workaround for code
1911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// that hasn't yet been rewritten to do the right thing about those
1912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/// casts, and may disappear along with the last internal use.
1913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr *Expr::IgnoreParenLValueCasts() {
1914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Expr *E = this;
1915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  while (true) {
1916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      E = P->getSubExpr();
1918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      continue;
1919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    } else if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1920221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (P->getCastKind() == CK_LValueToRValue) {
1921221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getSubExpr();
1922221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1923221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1924221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (P->getOpcode() == UO_Extension) {
1926221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getSubExpr();
1927221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1928221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } else if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (!P->isResultDependent()) {
1931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = P->getResultExpr();
1932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        continue;
1933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
1934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    break;
1936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
1937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  return E;
1938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
1939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromExpr *Expr::IgnoreParenImpCasts() {
1941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  Expr *E = this;
1942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  while (true) {
1943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      E = P->getSubExpr();
1945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      continue;
1946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) {
1948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      E = P->getSubExpr();
1949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      continue;
1950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      if (P->getOpcode() == UO_Extension) {
1953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        E = P->getSubExpr();
1954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        continue;
1955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
1957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
1958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (!P->isResultDependent()) {
1959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = P->getResultExpr();
1960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        continue;
1961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      }
1962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return E;
1964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
1965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
1966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
1968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// value (including ptr->int casts of the same size).  Strip off any
1969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// ParenExpr or CastExprs, returning their operand.
1970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectExpr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
1971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  Expr *E = this;
1972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  while (true) {
1973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E = P->getSubExpr();
1975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      continue;
1976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // We ignore integer <-> casts that are of the same width, ptr<->ptr and
1980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // ptr<->int casts of the same width.  We also ignore all identity casts.
1981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      Expr *SE = P->getSubExpr();
1982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
1984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = SE;
1985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        continue;
1986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
1987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if ((E->getType()->isPointerType() ||
1989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project           E->getType()->isIntegralType(Ctx)) &&
1990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          (SE->getType()->isPointerType() ||
1991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project           SE->getType()->isIntegralType(Ctx)) &&
1992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
1993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = SE;
1994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        continue;
1995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
1996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
1997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (P->getOpcode() == UO_Extension) {
2000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        E = P->getSubExpr();
2001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        continue;
2002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
2003392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2004392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2005392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2006392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (!P->isResultDependent()) {
2007392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        E = P->getResultExpr();
2008392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        continue;
2009392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2010392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2011392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2012392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return E;
2013392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2014392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2015392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2016392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::isDefaultArgument() const {
2017392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const Expr *E = this;
2018392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
2019392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    E = ICE->getSubExprAsWritten();
2020392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2021392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return isa<CXXDefaultArgExpr>(E);
2022392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2023392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2024392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// \brief Skip over any no-op casts and any temporary-binding
2025392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// expressions.
2026392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromstatic const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
2027392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2028392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (ICE->getCastKind() == CK_NoOp)
2029392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      E = ICE->getSubExpr();
2030392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else
2031392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      break;
2032392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2033392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2034392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
2035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    E = BE->getSubExpr();
2036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2037392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ICE->getCastKind() == CK_NoOp)
2039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E = ICE->getSubExpr();
2040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else
2041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      break;
2042e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu  }
2043392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2044392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return E->IgnoreParens();
2045392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2046e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
2047392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isTemporaryObject - Determines if this expression produces a
2048392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// temporary of the given class type.
2049e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugubool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
2050392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
2051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return false;
2052392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
2054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  // Temporaries are by definition pr-values of class type.
205698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  if (!E->Classify(C).isPRValue()) {
205798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    // In this context, property reference is a message call and is pr-value.
205898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (!isa<ObjCPropertyRefExpr>(E))
205998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom      return false;
206098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
206198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
206298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  // Black-list a few cases which yield pr-values of class type that don't
2063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // refer to temporaries of that type:
2064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // - implicit derived-to-base conversions
2066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (isa<ImplicitCastExpr>(E)) {
2067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
2068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case CK_DerivedToBase:
2069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    case CK_UncheckedDerivedToBase:
2070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return false;
2071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    default:
2072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      break;
2073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
2074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
2075392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // - member expressions (all)
2077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (isa<MemberExpr>(E))
2078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return false;
2079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // - opaque values (all)
2081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (isa<OpaqueValueExpr>(E))
2082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return false;
2083392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return true;
2085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
2086392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isImplicitCXXThis() const {
2088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const Expr *E = this;
2089392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2090392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Strip away parentheses and casts we don't care about.
2091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  while (true) {
2092392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) {
2093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      E = Paren->getSubExpr();
2094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom      continue;
2095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    }
2096392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2097392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2098392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (ICE->getCastKind() == CK_NoOp ||
2099392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          ICE->getCastKind() == CK_LValueToRValue ||
2100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          ICE->getCastKind() == CK_DerivedToBase ||
2101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          ICE->getCastKind() == CK_UncheckedDerivedToBase) {
2102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        E = ICE->getSubExpr();
2103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        continue;
2104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
2108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (UnOp->getOpcode() == UO_Extension) {
2109392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        E = UnOp->getSubExpr();
2110392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        continue;
2111392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2112392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2113392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2114392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    break;
2115392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
2117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E))
2118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return This->isImplicit();
2119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return false;
2121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
2122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// hasAnyTypeDependentArguments - Determines if any of the expressions
2124392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// in Exprs is type-dependent.
2125392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) {
2126392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned I = 0; I < NumExprs; ++I)
2127392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Exprs[I]->isTypeDependent())
2128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return true;
2129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return false;
2131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// hasAnyValueDependentArguments - Determines if any of the expressions
2134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// in Exprs is value-dependent.
2135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
2136392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned I = 0; I < NumExprs; ++I)
2137392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Exprs[I]->isValueDependent())
2138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return true;
2139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return false;
2141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
2142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectbool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
2144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // This function is attempting whether an expression is an initializer
2145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // which can be evaluated at compile-time.  isEvaluatable handles most
2146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // of the cases, but it can't deal with some initializer-specific
2147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // expressions, and it can't deal with aggregates; we deal with those here,
2148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // and fall back to isEvaluatable for the other cases.
214998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
2150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // If we ever capture reference-binding directly in the AST, we can
2151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // kill the second parameter.
2152392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (IsForRef) {
2154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    EvalResult Result;
2155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects;
215698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  }
2157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  switch (getStmtClass()) {
215998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom  default: break;
2160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case StringLiteralClass:
2161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCStringLiteralClass:
2162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ObjCEncodeExprClass:
2163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
2164392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXTemporaryObjectExprClass:
2165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case CXXConstructExprClass: {
2166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
2167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
2168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Only if it's
2169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // 1) an application of the trivial default constructor or
2170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (!CE->getConstructor()->isTrivial()) return false;
217198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    if (!CE->getNumArgs()) return true;
2172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
217398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    // 2) an elidable trivial copy construction of an operand which is
2174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //    itself a constant initializer.  Note that we consider the
2175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //    operand on its own, *not* as a reference binding.
217698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom    return CE->isElidable() &&
2177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project           CE->getArg(0)->isConstantInitializer(Ctx, false);
2178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
2179392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CompoundLiteralExprClass: {
2180392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // This handles gcc's extension that allows global initializers like
2181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // "struct x {int x;} x = (struct x) {};".
2182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    // FIXME: This accepts other cases it shouldn't!
2183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
2184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    return Exp->isConstantInitializer(Ctx, false);
2185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  }
2186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom  case InitListExprClass: {
2187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // FIXME: This doesn't deal with fields with reference types correctly.
2188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // FIXME: This incorrectly allows pointers cast to integers to be assigned
2189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // to bitfields.
2190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const InitListExpr *Exp = cast<InitListExpr>(this);
2191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned numInits = Exp->getNumInits();
2192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    for (unsigned i = 0; i < numInits; i++) {
2193392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (!Exp->getInit(i)->isConstantInitializer(Ctx, false))
2194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return false;
2195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
2196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
2197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
2198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ImplicitValueInitExprClass:
2199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return true;
2200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ParenExprClass:
2201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<ParenExpr>(this)->getSubExpr()
2202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ->isConstantInitializer(Ctx, IsForRef);
2203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case GenericSelectionExprClass:
2204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (cast<GenericSelectionExpr>(this)->isResultDependent())
2205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return false;
2206392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return cast<GenericSelectionExpr>(this)->getResultExpr()
2207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ->isConstantInitializer(Ctx, IsForRef);
2208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case ChooseExprClass:
2209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
2210392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ->isConstantInitializer(Ctx, IsForRef);
2211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  case UnaryOperatorClass: {
2212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const UnaryOperator* Exp = cast<UnaryOperator>(this);
2213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (Exp->getOpcode() == UO_Extension)
2214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      return Exp->getSubExpr()->isConstantInitializer(Ctx, false);
2215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    break;
2216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case BinaryOperatorClass: {
2218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Special case &&foo - &&bar.  It would be nice to generalize this somehow
2219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // but this handles the common case.
2220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const BinaryOperator *Exp = cast<BinaryOperator>(this);
2221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (Exp->getOpcode() == BO_Sub &&
2222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) &&
2223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx)))
2224392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return true;
2225392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    break;
2226392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2227392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXFunctionalCastExprClass:
2228392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CXXStaticCastExprClass:
2229392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case ImplicitCastExprClass:
2230392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  case CStyleCastExprClass:
2231392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Handle casts with a destination that's a struct or union; this
2232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // deals with both the gcc no-op struct cast extension and the
2233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // cast-to-union extension.
2234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (getType()->isRecordType())
2235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return cast<CastExpr>(this)->getSubExpr()
2236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        ->isConstantInitializer(Ctx, false);
2237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2238392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Integer->integer casts can be handled here, which is important for
2239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // things like (int)(&&x-&&y).  Scary but true.
2240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (getType()->isIntegerType() &&
2241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType())
2242392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return cast<CastExpr>(this)->getSubExpr()
2243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        ->isConstantInitializer(Ctx, false);
2244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2245392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    break;
2246392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2247392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return isEvaluatable(Ctx);
2248392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2249392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2250392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null
2251392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// pointer constant or not, as well as the specific kind of constant detected.
2252392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// Null pointer constants can be integer constant expressions with the
2253392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// value zero, casts of zero to void*, nullptr (C++0X), or __null
2254392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// (a GNU extension).
2255392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromExpr::NullPointerConstantKind
2256392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromExpr::isNullPointerConstant(ASTContext &Ctx,
2257392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                            NullPointerConstantValueDependence NPC) const {
2258392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (isValueDependent()) {
2259392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    switch (NPC) {
2260392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    case NPC_NeverValueDependent:
2261392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      assert(false && "Unexpected value dependent expression!");
2262392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      // If the unthinkable happens, fall through to the safest alternative.
2263392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2264392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    case NPC_ValueDependentIsNull:
2265392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (isTypeDependent() || getType()->isIntegralType(Ctx))
2266392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return NPCK_ZeroInteger;
2267392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      else
2268392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return NPCK_NotNull;
2269392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2270392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    case NPC_ValueDependentIsNotNull:
2271392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return NPCK_NotNull;
2272392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2273392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2274392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2275392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Strip off a cast to void*, if it exists. Except in C++.
2276392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
2277392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (!Ctx.getLangOptions().CPlusPlus) {
2278392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      // Check that it is a cast to void*.
2279392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
2280392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        QualType Pointee = PT->getPointeeType();
2281392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        if (!Pointee.hasQualifiers() &&
2282392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            Pointee->isVoidType() &&                              // to void*
2283392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            CE->getSubExpr()->getType()->isIntegerType())         // from int.
2284392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2285392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2287392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
2288392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Ignore the ImplicitCastExpr type entirely.
2289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
2291392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // Accept ((void*)0) as a null pointer constant, as many other
2292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // implementations do.
2293392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2294392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  } else if (const GenericSelectionExpr *GE =
2295392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom               dyn_cast<GenericSelectionExpr>(this)) {
2296392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
2297392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  } else if (const CXXDefaultArgExpr *DefaultArg
2298392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom               = dyn_cast<CXXDefaultArgExpr>(this)) {
2299392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // See through default argument expressions
2300392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
2301392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  } else if (isa<GNUNullExpr>(this)) {
2302392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    // The GNU __null extension is always a null pointer constant.
2303392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return NPCK_GNUNull;
2304392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2305392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2306392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // C++0x nullptr_t is always a null pointer constant.
2307392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (getType()->isNullPtrType())
2308392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return NPCK_CXX0X_nullptr;
2309392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2310392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (const RecordType *UT = getType()->getAsUnionType())
2311392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
2312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
2313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        const Expr *InitExpr = CLE->getInitializer();
2314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
2315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom          return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
2316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // This expression must be an integer type.
2318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (!getType()->isIntegerType() ||
2319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
2320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return NPCK_NotNull;
2321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2322392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // If we have an integer constant expression, we need to *evaluate* it and
2323392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // test for the value 0.
2324392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  llvm::APSInt Result;
2325392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  bool IsNull = isIntegerConstantExpr(Result, Ctx) && Result == 0;
2326392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2327392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return (IsNull ? NPCK_ZeroInteger : NPCK_NotNull);
2328392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2329392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// \brief If this expression is an l-value for an Objective C
2331392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// property, find the underlying property reference expression.
2332392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromconst ObjCPropertyRefExpr *Expr::getObjCProperty() const {
2333392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const Expr *E = this;
2334392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (true) {
2335392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    assert((E->getValueKind() == VK_LValue &&
2336392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom            E->getObjectKind() == OK_ObjCProperty) &&
2337392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom           "expression is not a property reference");
2338392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    E = E->IgnoreParenCasts();
2339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
2340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (BO->getOpcode() == BO_Comma) {
2341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        E = BO->getRHS();
2342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        continue;
2343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      }
2344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    }
2345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2346392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    break;
2347392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2348392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2349392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return cast<ObjCPropertyRefExpr>(E);
2350392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2351392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2352392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromFieldDecl *Expr::getBitField() {
2353392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  Expr *E = this->IgnoreParens();
2354392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2355392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2356392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (ICE->getCastKind() == CK_LValueToRValue ||
2357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp))
2358392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      E = ICE->getSubExpr()->IgnoreParens();
2359392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else
2360392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      break;
2361392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2362392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
2364392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
2365392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (Field->isBitField())
2366392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return Field;
2367392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2368392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E))
2369392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
2370392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      if (Field->isBitField())
2371392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return Field;
2372392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2373392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
2374392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (BinOp->isAssignmentOp() && BinOp->getLHS())
2375392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      return BinOp->getLHS()->getBitField();
2376392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2377392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return 0;
2378392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2379392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2380392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool Expr::refersToVectorElement() const {
2381392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  const Expr *E = this->IgnoreParens();
2382392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2383392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2384392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (ICE->getValueKind() != VK_RValue &&
2385392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        ICE->getCastKind() == CK_NoOp)
2386392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      E = ICE->getSubExpr()->IgnoreParens();
2387392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else
2388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      break;
2389392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2390392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2391392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
2392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return ASE->getBase()->getType()->isVectorType();
2393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (isa<ExtVectorElementExpr>(E))
2395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return true;
2396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return false;
2398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// isArrow - Return true if the base expression is a pointer to vector,
2401392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// return false if the base expression is a vector.
2402392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool ExtVectorElementExpr::isArrow() const {
2403392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return getBase()->getType()->isPointerType();
2404392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2405392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2406392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromunsigned ExtVectorElementExpr::getNumElements() const {
2407392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (const VectorType *VT = getType()->getAs<VectorType>())
2408392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return VT->getNumElements();
2409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return 1;
2410392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2411392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2412392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// containsDuplicateElements - Return true if any element access is repeated.
2413392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrombool ExtVectorElementExpr::containsDuplicateElements() const {
2414392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // FIXME: Refactor this code to an accessor on the AST node which returns the
2415392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // "type" of component access, and share with code below and in Sema.
2416392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  llvm::StringRef Comp = Accessor->getName();
2417392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2418392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Halving swizzles do not contain duplicate elements.
2419392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
2420392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    return false;
2421392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2422392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  // Advance past s-char prefix on hex swizzles.
2423392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (Comp[0] == 's' || Comp[0] == 'S')
2424392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Comp = Comp.substr(1);
2425392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2426392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned i = 0, e = Comp.size(); i != e; ++i)
2427392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos)
2428392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom        return true;
2429392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2430392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return false;
2431392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2432392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2433392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
2434392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid ExtVectorElementExpr::getEncodedElementAccess(
2435392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
2436392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  llvm::StringRef Comp = Accessor->getName();
2437392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (Comp[0] == 's' || Comp[0] == 'S')
2438392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Comp = Comp.substr(1);
2439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  bool isHi =   Comp == "hi";
2441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  bool isLo =   Comp == "lo";
2442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  bool isEven = Comp == "even";
2443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  bool isOdd  = Comp == "odd";
2444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
2446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    uint64_t Index;
2447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (isHi)
2449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Index = e + i;
2450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else if (isLo)
2451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Index = i;
2452392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else if (isEven)
2453392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Index = 2 * i;
2454392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else if (isOdd)
2455392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Index = 2 * i + 1;
2456392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    else
2457392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      Index = ExtVectorType::getAccessorIdx(Comp[i]);
2458392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2459392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    Elts.push_back(Index);
2460392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2461392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2462392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2463392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T,
2464392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ExprValueKind VK,
2465392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation LBracLoc,
2466392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation SuperLoc,
2467392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 bool IsInstanceSuper,
2468392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 QualType SuperType,
2469392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Selector Sel,
2470392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation SelLoc,
2471392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ObjCMethodDecl *Method,
2472392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Expr **Args, unsigned NumArgs,
2473392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation RBracLoc)
2474392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
2475392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         /*TypeDependent=*/false, /*ValueDependent=*/false,
2476392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         /*ContainsUnexpandedParameterPack=*/false),
2477392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
2478392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    HasMethod(Method != 0), SuperLoc(SuperLoc),
2479392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2480392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                                       : Sel.getAsOpaquePtr())),
2481392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2482392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{
2483392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  setReceiverPointer(SuperType.getAsOpaquePtr());
2484392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  if (NumArgs)
2485392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
2486392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2487392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2488392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T,
2489392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ExprValueKind VK,
2490392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation LBracLoc,
2491392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 TypeSourceInfo *Receiver,
2492392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Selector Sel,
2493392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation SelLoc,
2494392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ObjCMethodDecl *Method,
2495392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Expr **Args, unsigned NumArgs,
2496392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation RBracLoc)
2497392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
2498392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         T->isDependentType(), T->containsUnexpandedParameterPack()),
2499392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0),
2500392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2501392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                                       : Sel.getAsOpaquePtr())),
2502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
2504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  setReceiverPointer(Receiver);
2505392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  Expr **MyArgs = getArgs();
2506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned I = 0; I != NumArgs; ++I) {
2507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->isTypeDependent())
2508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.TypeDependent = true;
2509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->isValueDependent())
2510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.ValueDependent = true;
2511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->containsUnexpandedParameterPack())
2512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.ContainsUnexpandedParameterPack = true;
2513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    MyArgs[I] = Args[I];
2515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2517392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2518392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr::ObjCMessageExpr(QualType T,
2519392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ExprValueKind VK,
2520392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation LBracLoc,
2521392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Expr *Receiver,
2522392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Selector Sel,
2523392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation SelLoc,
2524392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 ObjCMethodDecl *Method,
2525392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 Expr **Args, unsigned NumArgs,
2526392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                 SourceLocation RBracLoc)
2527392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
2528392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         Receiver->isTypeDependent(),
2529392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom         Receiver->containsUnexpandedParameterPack()),
2530392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0),
2531392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2532392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                                       : Sel.getAsOpaquePtr())),
2533392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2534392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom{
2535392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  setReceiverPointer(Receiver);
2536392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  Expr **MyArgs = getArgs();
2537392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  for (unsigned I = 0; I != NumArgs; ++I) {
2538392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->isTypeDependent())
2539392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.TypeDependent = true;
2540392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->isValueDependent())
2541392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.ValueDependent = true;
2542392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    if (Args[I]->containsUnexpandedParameterPack())
2543392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom      ExprBits.ContainsUnexpandedParameterPack = true;
2544392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2545392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    MyArgs[I] = Args[I];
2546392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  }
2547392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2548392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2549392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2550392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         ExprValueKind VK,
2551392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation LBracLoc,
2552392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation SuperLoc,
2553392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         bool IsInstanceSuper,
2554392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         QualType SuperType,
2555392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         Selector Sel,
2556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation SelLoc,
2557392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         ObjCMethodDecl *Method,
2558392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         Expr **Args, unsigned NumArgs,
2559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation RBracLoc) {
2560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2561392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom    NumArgs * sizeof(Expr *);
2562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2563392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
2564392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                   SuperType, Sel, SelLoc, Method, Args,NumArgs,
2565392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                   RBracLoc);
2566392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom}
2567392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
2568392aa7cc7d2b122614c5393c3e357da07fd07af3Brian CarlstromObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2569392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         ExprValueKind VK,
2570392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation LBracLoc,
2571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         TypeSourceInfo *Receiver,
2572392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         Selector Sel,
2573392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation SelLoc,
2574392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         ObjCMethodDecl *Method,
2575392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         Expr **Args, unsigned NumArgs,
2576392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom                                         SourceLocation RBracLoc) {
2577392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NumArgs * sizeof(Expr *);
2579  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2580  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2581                                   Method, Args, NumArgs, RBracLoc);
2582}
2583
2584ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2585                                         ExprValueKind VK,
2586                                         SourceLocation LBracLoc,
2587                                         Expr *Receiver,
2588                                         Selector Sel,
2589                                         SourceLocation SelLoc,
2590                                         ObjCMethodDecl *Method,
2591                                         Expr **Args, unsigned NumArgs,
2592                                         SourceLocation RBracLoc) {
2593  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2594    NumArgs * sizeof(Expr *);
2595  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2596  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2597                                   Method, Args, NumArgs, RBracLoc);
2598}
2599
2600ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
2601                                              unsigned NumArgs) {
2602  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2603    NumArgs * sizeof(Expr *);
2604  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2605  return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
2606}
2607
2608SourceRange ObjCMessageExpr::getReceiverRange() const {
2609  switch (getReceiverKind()) {
2610  case Instance:
2611    return getInstanceReceiver()->getSourceRange();
2612
2613  case Class:
2614    return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
2615
2616  case SuperInstance:
2617  case SuperClass:
2618    return getSuperLoc();
2619  }
2620
2621  return SourceLocation();
2622}
2623
2624Selector ObjCMessageExpr::getSelector() const {
2625  if (HasMethod)
2626    return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
2627                                                               ->getSelector();
2628  return Selector(SelectorOrMethod);
2629}
2630
2631ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
2632  switch (getReceiverKind()) {
2633  case Instance:
2634    if (const ObjCObjectPointerType *Ptr
2635          = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
2636      return Ptr->getInterfaceDecl();
2637    break;
2638
2639  case Class:
2640    if (const ObjCObjectType *Ty
2641          = getClassReceiver()->getAs<ObjCObjectType>())
2642      return Ty->getInterface();
2643    break;
2644
2645  case SuperInstance:
2646    if (const ObjCObjectPointerType *Ptr
2647          = getSuperType()->getAs<ObjCObjectPointerType>())
2648      return Ptr->getInterfaceDecl();
2649    break;
2650
2651  case SuperClass:
2652    if (const ObjCObjectType *Iface
2653          = getSuperType()->getAs<ObjCObjectType>())
2654      return Iface->getInterface();
2655    break;
2656  }
2657
2658  return 0;
2659}
2660
2661bool ChooseExpr::isConditionTrue(const ASTContext &C) const {
2662  return getCond()->EvaluateAsInt(C) != 0;
2663}
2664
2665ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
2666                                     QualType Type, SourceLocation BLoc,
2667                                     SourceLocation RP)
2668   : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
2669          Type->isDependentType(), Type->isDependentType(),
2670          Type->containsUnexpandedParameterPack()),
2671     BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
2672{
2673  SubExprs = new (C) Stmt*[nexpr];
2674  for (unsigned i = 0; i < nexpr; i++) {
2675    if (args[i]->isTypeDependent())
2676      ExprBits.TypeDependent = true;
2677    if (args[i]->isValueDependent())
2678      ExprBits.ValueDependent = true;
2679    if (args[i]->containsUnexpandedParameterPack())
2680      ExprBits.ContainsUnexpandedParameterPack = true;
2681
2682    SubExprs[i] = args[i];
2683  }
2684}
2685
2686void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
2687                                 unsigned NumExprs) {
2688  if (SubExprs) C.Deallocate(SubExprs);
2689
2690  SubExprs = new (C) Stmt* [NumExprs];
2691  this->NumExprs = NumExprs;
2692  memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
2693}
2694
2695GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
2696                               SourceLocation GenericLoc, Expr *ControllingExpr,
2697                               TypeSourceInfo **AssocTypes, Expr **AssocExprs,
2698                               unsigned NumAssocs, SourceLocation DefaultLoc,
2699                               SourceLocation RParenLoc,
2700                               bool ContainsUnexpandedParameterPack,
2701                               unsigned ResultIndex)
2702  : Expr(GenericSelectionExprClass,
2703         AssocExprs[ResultIndex]->getType(),
2704         AssocExprs[ResultIndex]->getValueKind(),
2705         AssocExprs[ResultIndex]->getObjectKind(),
2706         AssocExprs[ResultIndex]->isTypeDependent(),
2707         AssocExprs[ResultIndex]->isValueDependent(),
2708         ContainsUnexpandedParameterPack),
2709    AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
2710    SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
2711    ResultIndex(ResultIndex), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
2712    RParenLoc(RParenLoc) {
2713  SubExprs[CONTROLLING] = ControllingExpr;
2714  std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
2715  std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
2716}
2717
2718GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
2719                               SourceLocation GenericLoc, Expr *ControllingExpr,
2720                               TypeSourceInfo **AssocTypes, Expr **AssocExprs,
2721                               unsigned NumAssocs, SourceLocation DefaultLoc,
2722                               SourceLocation RParenLoc,
2723                               bool ContainsUnexpandedParameterPack)
2724  : Expr(GenericSelectionExprClass,
2725         Context.DependentTy,
2726         VK_RValue,
2727         OK_Ordinary,
2728         /*isTypeDependent=*/  true,
2729         /*isValueDependent=*/ true,
2730         ContainsUnexpandedParameterPack),
2731    AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
2732    SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
2733    ResultIndex(-1U), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
2734    RParenLoc(RParenLoc) {
2735  SubExprs[CONTROLLING] = ControllingExpr;
2736  std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
2737  std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
2738}
2739
2740//===----------------------------------------------------------------------===//
2741//  DesignatedInitExpr
2742//===----------------------------------------------------------------------===//
2743
2744IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() {
2745  assert(Kind == FieldDesignator && "Only valid on a field designator");
2746  if (Field.NameOrField & 0x01)
2747    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
2748  else
2749    return getField()->getIdentifier();
2750}
2751
2752DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
2753                                       unsigned NumDesignators,
2754                                       const Designator *Designators,
2755                                       SourceLocation EqualOrColonLoc,
2756                                       bool GNUSyntax,
2757                                       Expr **IndexExprs,
2758                                       unsigned NumIndexExprs,
2759                                       Expr *Init)
2760  : Expr(DesignatedInitExprClass, Ty,
2761         Init->getValueKind(), Init->getObjectKind(),
2762         Init->isTypeDependent(), Init->isValueDependent(),
2763         Init->containsUnexpandedParameterPack()),
2764    EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
2765    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
2766  this->Designators = new (C) Designator[NumDesignators];
2767
2768  // Record the initializer itself.
2769  child_range Child = children();
2770  *Child++ = Init;
2771
2772  // Copy the designators and their subexpressions, computing
2773  // value-dependence along the way.
2774  unsigned IndexIdx = 0;
2775  for (unsigned I = 0; I != NumDesignators; ++I) {
2776    this->Designators[I] = Designators[I];
2777
2778    if (this->Designators[I].isArrayDesignator()) {
2779      // Compute type- and value-dependence.
2780      Expr *Index = IndexExprs[IndexIdx];
2781      if (Index->isTypeDependent() || Index->isValueDependent())
2782        ExprBits.ValueDependent = true;
2783
2784      // Propagate unexpanded parameter packs.
2785      if (Index->containsUnexpandedParameterPack())
2786        ExprBits.ContainsUnexpandedParameterPack = true;
2787
2788      // Copy the index expressions into permanent storage.
2789      *Child++ = IndexExprs[IndexIdx++];
2790    } else if (this->Designators[I].isArrayRangeDesignator()) {
2791      // Compute type- and value-dependence.
2792      Expr *Start = IndexExprs[IndexIdx];
2793      Expr *End = IndexExprs[IndexIdx + 1];
2794      if (Start->isTypeDependent() || Start->isValueDependent() ||
2795          End->isTypeDependent() || End->isValueDependent())
2796        ExprBits.ValueDependent = true;
2797
2798      // Propagate unexpanded parameter packs.
2799      if (Start->containsUnexpandedParameterPack() ||
2800          End->containsUnexpandedParameterPack())
2801        ExprBits.ContainsUnexpandedParameterPack = true;
2802
2803      // Copy the start/end expressions into permanent storage.
2804      *Child++ = IndexExprs[IndexIdx++];
2805      *Child++ = IndexExprs[IndexIdx++];
2806    }
2807  }
2808
2809  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
2810}
2811
2812DesignatedInitExpr *
2813DesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
2814                           unsigned NumDesignators,
2815                           Expr **IndexExprs, unsigned NumIndexExprs,
2816                           SourceLocation ColonOrEqualLoc,
2817                           bool UsesColonSyntax, Expr *Init) {
2818  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2819                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2820  return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
2821                                      ColonOrEqualLoc, UsesColonSyntax,
2822                                      IndexExprs, NumIndexExprs, Init);
2823}
2824
2825DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
2826                                                    unsigned NumIndexExprs) {
2827  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2828                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2829  return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
2830}
2831
2832void DesignatedInitExpr::setDesignators(ASTContext &C,
2833                                        const Designator *Desigs,
2834                                        unsigned NumDesigs) {
2835  Designators = new (C) Designator[NumDesigs];
2836  NumDesignators = NumDesigs;
2837  for (unsigned I = 0; I != NumDesigs; ++I)
2838    Designators[I] = Desigs[I];
2839}
2840
2841SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const {
2842  DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this);
2843  if (size() == 1)
2844    return DIE->getDesignator(0)->getSourceRange();
2845  return SourceRange(DIE->getDesignator(0)->getStartLocation(),
2846                     DIE->getDesignator(size()-1)->getEndLocation());
2847}
2848
2849SourceRange DesignatedInitExpr::getSourceRange() const {
2850  SourceLocation StartLoc;
2851  Designator &First =
2852    *const_cast<DesignatedInitExpr*>(this)->designators_begin();
2853  if (First.isFieldDesignator()) {
2854    if (GNUSyntax)
2855      StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
2856    else
2857      StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
2858  } else
2859    StartLoc =
2860      SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
2861  return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
2862}
2863
2864Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
2865  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
2866  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2867  Ptr += sizeof(DesignatedInitExpr);
2868  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2869  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2870}
2871
2872Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
2873  assert(D.Kind == Designator::ArrayRangeDesignator &&
2874         "Requires array range designator");
2875  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2876  Ptr += sizeof(DesignatedInitExpr);
2877  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2878  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2879}
2880
2881Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
2882  assert(D.Kind == Designator::ArrayRangeDesignator &&
2883         "Requires array range designator");
2884  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2885  Ptr += sizeof(DesignatedInitExpr);
2886  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2887  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
2888}
2889
2890/// \brief Replaces the designator at index @p Idx with the series
2891/// of designators in [First, Last).
2892void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
2893                                          const Designator *First,
2894                                          const Designator *Last) {
2895  unsigned NumNewDesignators = Last - First;
2896  if (NumNewDesignators == 0) {
2897    std::copy_backward(Designators + Idx + 1,
2898                       Designators + NumDesignators,
2899                       Designators + Idx);
2900    --NumNewDesignators;
2901    return;
2902  } else if (NumNewDesignators == 1) {
2903    Designators[Idx] = *First;
2904    return;
2905  }
2906
2907  Designator *NewDesignators
2908    = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
2909  std::copy(Designators, Designators + Idx, NewDesignators);
2910  std::copy(First, Last, NewDesignators + Idx);
2911  std::copy(Designators + Idx + 1, Designators + NumDesignators,
2912            NewDesignators + Idx + NumNewDesignators);
2913  Designators = NewDesignators;
2914  NumDesignators = NumDesignators - 1 + NumNewDesignators;
2915}
2916
2917ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
2918                             Expr **exprs, unsigned nexprs,
2919                             SourceLocation rparenloc)
2920  : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
2921         false, false, false),
2922    NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
2923
2924  Exprs = new (C) Stmt*[nexprs];
2925  for (unsigned i = 0; i != nexprs; ++i) {
2926    if (exprs[i]->isTypeDependent())
2927      ExprBits.TypeDependent = true;
2928    if (exprs[i]->isValueDependent())
2929      ExprBits.ValueDependent = true;
2930    if (exprs[i]->containsUnexpandedParameterPack())
2931      ExprBits.ContainsUnexpandedParameterPack = true;
2932
2933    Exprs[i] = exprs[i];
2934  }
2935}
2936
2937const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) {
2938  if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e))
2939    e = ewc->getSubExpr();
2940  e = cast<CXXConstructExpr>(e)->getArg(0);
2941  while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
2942    e = ice->getSubExpr();
2943  return cast<OpaqueValueExpr>(e);
2944}
2945
2946//===----------------------------------------------------------------------===//
2947//  ExprIterator.
2948//===----------------------------------------------------------------------===//
2949
2950Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
2951Expr* ExprIterator::operator*() const { return cast<Expr>(*I); }
2952Expr* ExprIterator::operator->() const { return cast<Expr>(*I); }
2953const Expr* ConstExprIterator::operator[](size_t idx) const {
2954  return cast<Expr>(I[idx]);
2955}
2956const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
2957const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
2958
2959//===----------------------------------------------------------------------===//
2960//  Child Iterators for iterating over subexpressions/substatements
2961//===----------------------------------------------------------------------===//
2962
2963// UnaryExprOrTypeTraitExpr
2964Stmt::child_range UnaryExprOrTypeTraitExpr::children() {
2965  // If this is of a type and the type is a VLA type (and not a typedef), the
2966  // size expression of the VLA needs to be treated as an executable expression.
2967  // Why isn't this weirdness documented better in StmtIterator?
2968  if (isArgumentType()) {
2969    if (const VariableArrayType* T = dyn_cast<VariableArrayType>(
2970                                   getArgumentType().getTypePtr()))
2971      return child_range(child_iterator(T), child_iterator());
2972    return child_range();
2973  }
2974  return child_range(&Argument.Ex, &Argument.Ex + 1);
2975}
2976
2977// ObjCMessageExpr
2978Stmt::child_range ObjCMessageExpr::children() {
2979  Stmt **begin;
2980  if (getReceiverKind() == Instance)
2981    begin = reinterpret_cast<Stmt **>(this + 1);
2982  else
2983    begin = reinterpret_cast<Stmt **>(getArgs());
2984  return child_range(begin,
2985                     reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
2986}
2987
2988// Blocks
2989BlockDeclRefExpr::BlockDeclRefExpr(VarDecl *d, QualType t, ExprValueKind VK,
2990                                   SourceLocation l, bool ByRef,
2991                                   bool constAdded)
2992  : Expr(BlockDeclRefExprClass, t, VK, OK_Ordinary, false, false,
2993         d->isParameterPack()),
2994    D(d), Loc(l), IsByRef(ByRef), ConstQualAdded(constAdded)
2995{
2996  bool TypeDependent = false;
2997  bool ValueDependent = false;
2998  computeDeclRefDependence(D, getType(), TypeDependent, ValueDependent);
2999  ExprBits.TypeDependent = TypeDependent;
3000  ExprBits.ValueDependent = ValueDependent;
3001}
3002
3003