blob: 20f5a0c9d53dae386ed0aa8e511ae2e2d47d105f [file] [log] [blame]
Chris Lattner1b926492006-08-23 06:42:10 +00001//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr class and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Expr.h"
Chris Lattnere165d942006-08-24 04:40:38 +000015#include "clang/Lex/IdentifierTable.h"
Chris Lattner1b926492006-08-23 06:42:10 +000016#include <iostream>
17using namespace llvm;
18using namespace clang;
19
20void Expr::dump() const {
Chris Lattnere165d942006-08-24 04:40:38 +000021 if (this == 0) {
Chris Lattner1b926492006-08-23 06:42:10 +000022 std::cerr << "<null expr>";
Chris Lattnere165d942006-08-24 04:40:38 +000023 return;
24 }
25 std::cerr << "(";
26 dump_impl();
27 std::cerr << ")";
Chris Lattner1b926492006-08-23 06:42:10 +000028}
29
30
31void IntegerConstant::dump_impl() const {
32 std::cerr << "1";
33}
34
35void FloatingConstant::dump_impl() const {
36 std::cerr << "1.0";
37}
38
39void ParenExpr::dump_impl() const {
40 std::cerr << "'('";
41 Val->dump();
42 std::cerr << "')'";
43}
44
45/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
46/// corresponds to, e.g. "sizeof" or "[pre]++".
47const char *UnaryOperator::getOpcodeStr(Opcode Op) {
48 switch (Op) {
49 default: assert(0 && "Unknown binary operator");
50 case PostInc: return "[post]++";
51 case PostDec: return "[post]--";
52 case PreInc: return "[pre]++";
53 case PreDec: return "[pre]--";
54 case AddrOf: return "&";
55 case Deref: return "*";
56 case Plus: return "+";
57 case Minus: return "-";
58 case Not: return "~";
59 case LNot: return "!";
60 case Real: return "__real";
61 case Imag: return "__imag";
62 }
63}
64
65void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000066 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000067 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000068}
69
70
71void ArraySubscriptExpr::dump_impl() const {
72 Base->dump();
73 std::cerr << "[";
74 Idx->dump();
75 std::cerr << "]";
76}
77
78CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
79 : Fn(fn), NumArgs(numargs) {
80 Args = new Expr*[numargs];
81 for (unsigned i = 0; i != numargs; ++i)
82 Args[i] = args[i];
83}
84
85void CallExpr::dump_impl() const {
86 Fn->dump();
87 std::cerr << "(";
88 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
89 if (i) std::cerr << ", ";
90 getArg(i)->dump();
91 }
Chris Lattner1b926492006-08-23 06:42:10 +000092 std::cerr << ")";
93}
94
Chris Lattnere165d942006-08-24 04:40:38 +000095CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
96 unsigned NumArgs, SourceLocation *commalocs,
97 SourceLocation rparenloc)
98 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
99 unsigned NumCommas = getNumCommas();
100 if (NumCommas)
101 CommaLocs = new SourceLocation[NumCommas];
102 else
103 CommaLocs = 0;
104
105 for (unsigned i = 0; i != NumCommas; ++i)
106 CommaLocs[i] = commalocs[i];
107}
108
109
110void MemberExpr::dump_impl() const {
111 Base->dump();
112 std::cerr << (isArrow ? "->" : ".") << MemberII->getName();
113}
114
Chris Lattner1b926492006-08-23 06:42:10 +0000115/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
116/// corresponds to, e.g. "<<=".
117const char *BinaryOperator::getOpcodeStr(Opcode Op) {
118 switch (Op) {
119 default: assert(0 && "Unknown binary operator");
120 case Mul: return "*";
121 case Div: return "/";
122 case Rem: return "%";
123 case Add: return "+";
124 case Sub: return "-";
125 case Shl: return "<<";
126 case Shr: return ">>";
127 case LT: return "<";
128 case GT: return ">";
129 case LE: return "<=";
130 case GE: return ">=";
131 case EQ: return "==";
132 case NE: return "!=";
133 case And: return "&";
134 case Xor: return "^";
135 case Or: return "|";
136 case LAnd: return "&&";
137 case LOr: return "||";
138 case Assign: return "=";
139 case MulAssign: return "*=";
140 case DivAssign: return "/=";
141 case RemAssign: return "%=";
142 case AddAssign: return "+=";
143 case SubAssign: return "-=";
144 case ShlAssign: return "<<=";
145 case ShrAssign: return ">>=";
146 case AndAssign: return "&=";
147 case XorAssign: return "^=";
148 case OrAssign: return "|=";
149 case Comma: return ",";
150 }
151}
152
153void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000154 LHS->dump();
155 std::cerr << " " << getOpcodeStr(Opc) << " ";
156 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000157}
158
159void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000160 Cond->dump();
161 std::cerr << " ? ";
162 LHS->dump();
163 std::cerr << " : ";
164 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000165}