blob: a296a0d7a32830a20e0dbb7141b2f3b3f9a9cb9a [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";
Chris Lattner26115ac2006-08-24 06:10:04 +000069 case SizeOf: return "sizeof";
70 case AlignOf: return "alignof";
Chris Lattner1b926492006-08-23 06:42:10 +000071 }
72}
73
74void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000075 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000076 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000077}
78
Chris Lattner0eedafe2006-08-24 04:56:27 +000079//===----------------------------------------------------------------------===//
80// Postfix Operators.
81//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +000082
83void ArraySubscriptExpr::dump_impl() const {
84 Base->dump();
85 std::cerr << "[";
86 Idx->dump();
87 std::cerr << "]";
88}
89
90CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
91 : Fn(fn), NumArgs(numargs) {
92 Args = new Expr*[numargs];
93 for (unsigned i = 0; i != numargs; ++i)
94 Args[i] = args[i];
95}
96
97void CallExpr::dump_impl() const {
98 Fn->dump();
99 std::cerr << "(";
100 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
101 if (i) std::cerr << ", ";
102 getArg(i)->dump();
103 }
Chris Lattner1b926492006-08-23 06:42:10 +0000104 std::cerr << ")";
105}
106
Chris Lattnere165d942006-08-24 04:40:38 +0000107CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
108 unsigned NumArgs, SourceLocation *commalocs,
109 SourceLocation rparenloc)
110 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
111 unsigned NumCommas = getNumCommas();
112 if (NumCommas)
113 CommaLocs = new SourceLocation[NumCommas];
114 else
115 CommaLocs = 0;
116
117 for (unsigned i = 0; i != NumCommas; ++i)
118 CommaLocs[i] = commalocs[i];
119}
120
121
122void MemberExpr::dump_impl() const {
123 Base->dump();
Chris Lattner6f3a1172006-08-24 05:19:28 +0000124 std::cerr << (isArrow ? "->" : ".");
125
126 if (MemberDecl)
127 /*TODO: Print MemberDecl*/;
128 std::cerr << "member";
Chris Lattnere165d942006-08-24 04:40:38 +0000129}
130
Chris Lattner1b926492006-08-23 06:42:10 +0000131/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
132/// corresponds to, e.g. "<<=".
133const char *BinaryOperator::getOpcodeStr(Opcode Op) {
134 switch (Op) {
135 default: assert(0 && "Unknown binary operator");
136 case Mul: return "*";
137 case Div: return "/";
138 case Rem: return "%";
139 case Add: return "+";
140 case Sub: return "-";
141 case Shl: return "<<";
142 case Shr: return ">>";
143 case LT: return "<";
144 case GT: return ">";
145 case LE: return "<=";
146 case GE: return ">=";
147 case EQ: return "==";
148 case NE: return "!=";
149 case And: return "&";
150 case Xor: return "^";
151 case Or: return "|";
152 case LAnd: return "&&";
153 case LOr: return "||";
154 case Assign: return "=";
155 case MulAssign: return "*=";
156 case DivAssign: return "/=";
157 case RemAssign: return "%=";
158 case AddAssign: return "+=";
159 case SubAssign: return "-=";
160 case ShlAssign: return "<<=";
161 case ShrAssign: return ">>=";
162 case AndAssign: return "&=";
163 case XorAssign: return "^=";
164 case OrAssign: return "|=";
165 case Comma: return ",";
166 }
167}
168
169void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000170 LHS->dump();
171 std::cerr << " " << getOpcodeStr(Opc) << " ";
172 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000173}
174
175void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000176 Cond->dump();
177 std::cerr << " ? ";
178 LHS->dump();
179 std::cerr << " : ";
180 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000181}