blob: 71415b73f613d4465c3ed5bffe44a56a16fa50a8 [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
Chris Lattner0eedafe2006-08-24 04:56:27 +000030//===----------------------------------------------------------------------===//
31// Primary Expressions.
32//===----------------------------------------------------------------------===//
33
Chris Lattner879b9ad2006-08-24 04:53:44 +000034void DeclExpr::dump_impl() const {
35 std::cerr << "x";
36}
Chris Lattner1b926492006-08-23 06:42:10 +000037
38void IntegerConstant::dump_impl() const {
39 std::cerr << "1";
40}
41
42void FloatingConstant::dump_impl() const {
43 std::cerr << "1.0";
44}
45
46void ParenExpr::dump_impl() const {
47 std::cerr << "'('";
48 Val->dump();
49 std::cerr << "')'";
50}
51
52/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
53/// corresponds to, e.g. "sizeof" or "[pre]++".
54const char *UnaryOperator::getOpcodeStr(Opcode Op) {
55 switch (Op) {
56 default: assert(0 && "Unknown binary operator");
57 case PostInc: return "[post]++";
58 case PostDec: return "[post]--";
59 case PreInc: return "[pre]++";
60 case PreDec: return "[pre]--";
61 case AddrOf: return "&";
62 case Deref: return "*";
63 case Plus: return "+";
64 case Minus: return "-";
65 case Not: return "~";
66 case LNot: return "!";
67 case Real: return "__real";
68 case Imag: return "__imag";
69 }
70}
71
72void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000073 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000074 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000075}
76
Chris Lattner0eedafe2006-08-24 04:56:27 +000077//===----------------------------------------------------------------------===//
78// Postfix Operators.
79//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +000080
81void ArraySubscriptExpr::dump_impl() const {
82 Base->dump();
83 std::cerr << "[";
84 Idx->dump();
85 std::cerr << "]";
86}
87
88CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
89 : Fn(fn), NumArgs(numargs) {
90 Args = new Expr*[numargs];
91 for (unsigned i = 0; i != numargs; ++i)
92 Args[i] = args[i];
93}
94
95void CallExpr::dump_impl() const {
96 Fn->dump();
97 std::cerr << "(";
98 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
99 if (i) std::cerr << ", ";
100 getArg(i)->dump();
101 }
Chris Lattner1b926492006-08-23 06:42:10 +0000102 std::cerr << ")";
103}
104
Chris Lattnere165d942006-08-24 04:40:38 +0000105CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
106 unsigned NumArgs, SourceLocation *commalocs,
107 SourceLocation rparenloc)
108 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
109 unsigned NumCommas = getNumCommas();
110 if (NumCommas)
111 CommaLocs = new SourceLocation[NumCommas];
112 else
113 CommaLocs = 0;
114
115 for (unsigned i = 0; i != NumCommas; ++i)
116 CommaLocs[i] = commalocs[i];
117}
118
119
120void MemberExpr::dump_impl() const {
121 Base->dump();
Chris Lattner6f3a1172006-08-24 05:19:28 +0000122 std::cerr << (isArrow ? "->" : ".");
123
124 if (MemberDecl)
125 /*TODO: Print MemberDecl*/;
126 std::cerr << "member";
Chris Lattnere165d942006-08-24 04:40:38 +0000127}
128
Chris Lattner1b926492006-08-23 06:42:10 +0000129/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
130/// corresponds to, e.g. "<<=".
131const char *BinaryOperator::getOpcodeStr(Opcode Op) {
132 switch (Op) {
133 default: assert(0 && "Unknown binary operator");
134 case Mul: return "*";
135 case Div: return "/";
136 case Rem: return "%";
137 case Add: return "+";
138 case Sub: return "-";
139 case Shl: return "<<";
140 case Shr: return ">>";
141 case LT: return "<";
142 case GT: return ">";
143 case LE: return "<=";
144 case GE: return ">=";
145 case EQ: return "==";
146 case NE: return "!=";
147 case And: return "&";
148 case Xor: return "^";
149 case Or: return "|";
150 case LAnd: return "&&";
151 case LOr: return "||";
152 case Assign: return "=";
153 case MulAssign: return "*=";
154 case DivAssign: return "/=";
155 case RemAssign: return "%=";
156 case AddAssign: return "+=";
157 case SubAssign: return "-=";
158 case ShlAssign: return "<<=";
159 case ShrAssign: return ">>=";
160 case AndAssign: return "&=";
161 case XorAssign: return "^=";
162 case OrAssign: return "|=";
163 case Comma: return ",";
164 }
165}
166
167void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000168 LHS->dump();
169 std::cerr << " " << getOpcodeStr(Opc) << " ";
170 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000171}
172
173void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000174 Cond->dump();
175 std::cerr << " ? ";
176 LHS->dump();
177 std::cerr << " : ";
178 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000179}