blob: 83ddc2a2fbb6f5acb5ec1dbf3a01c2db8af0f7ac [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 Lattner879b9ad2006-08-24 04:53:44 +000030void DeclExpr::dump_impl() const {
31 std::cerr << "x";
32}
Chris Lattner1b926492006-08-23 06:42:10 +000033
34void IntegerConstant::dump_impl() const {
35 std::cerr << "1";
36}
37
38void FloatingConstant::dump_impl() const {
39 std::cerr << "1.0";
40}
41
42void ParenExpr::dump_impl() const {
43 std::cerr << "'('";
44 Val->dump();
45 std::cerr << "')'";
46}
47
48/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
49/// corresponds to, e.g. "sizeof" or "[pre]++".
50const char *UnaryOperator::getOpcodeStr(Opcode Op) {
51 switch (Op) {
52 default: assert(0 && "Unknown binary operator");
53 case PostInc: return "[post]++";
54 case PostDec: return "[post]--";
55 case PreInc: return "[pre]++";
56 case PreDec: return "[pre]--";
57 case AddrOf: return "&";
58 case Deref: return "*";
59 case Plus: return "+";
60 case Minus: return "-";
61 case Not: return "~";
62 case LNot: return "!";
63 case Real: return "__real";
64 case Imag: return "__imag";
65 }
66}
67
68void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000069 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000070 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000071}
72
73
74void ArraySubscriptExpr::dump_impl() const {
75 Base->dump();
76 std::cerr << "[";
77 Idx->dump();
78 std::cerr << "]";
79}
80
81CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
82 : Fn(fn), NumArgs(numargs) {
83 Args = new Expr*[numargs];
84 for (unsigned i = 0; i != numargs; ++i)
85 Args[i] = args[i];
86}
87
88void CallExpr::dump_impl() const {
89 Fn->dump();
90 std::cerr << "(";
91 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
92 if (i) std::cerr << ", ";
93 getArg(i)->dump();
94 }
Chris Lattner1b926492006-08-23 06:42:10 +000095 std::cerr << ")";
96}
97
Chris Lattnere165d942006-08-24 04:40:38 +000098CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
99 unsigned NumArgs, SourceLocation *commalocs,
100 SourceLocation rparenloc)
101 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
102 unsigned NumCommas = getNumCommas();
103 if (NumCommas)
104 CommaLocs = new SourceLocation[NumCommas];
105 else
106 CommaLocs = 0;
107
108 for (unsigned i = 0; i != NumCommas; ++i)
109 CommaLocs[i] = commalocs[i];
110}
111
112
113void MemberExpr::dump_impl() const {
114 Base->dump();
115 std::cerr << (isArrow ? "->" : ".") << MemberII->getName();
116}
117
Chris Lattner1b926492006-08-23 06:42:10 +0000118/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
119/// corresponds to, e.g. "<<=".
120const char *BinaryOperator::getOpcodeStr(Opcode Op) {
121 switch (Op) {
122 default: assert(0 && "Unknown binary operator");
123 case Mul: return "*";
124 case Div: return "/";
125 case Rem: return "%";
126 case Add: return "+";
127 case Sub: return "-";
128 case Shl: return "<<";
129 case Shr: return ">>";
130 case LT: return "<";
131 case GT: return ">";
132 case LE: return "<=";
133 case GE: return ">=";
134 case EQ: return "==";
135 case NE: return "!=";
136 case And: return "&";
137 case Xor: return "^";
138 case Or: return "|";
139 case LAnd: return "&&";
140 case LOr: return "||";
141 case Assign: return "=";
142 case MulAssign: return "*=";
143 case DivAssign: return "/=";
144 case RemAssign: return "%=";
145 case AddAssign: return "+=";
146 case SubAssign: return "-=";
147 case ShlAssign: return "<<=";
148 case ShrAssign: return ">>=";
149 case AndAssign: return "&=";
150 case XorAssign: return "^=";
151 case OrAssign: return "|=";
152 case Comma: return ",";
153 }
154}
155
156void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000157 LHS->dump();
158 std::cerr << " " << getOpcodeStr(Opc) << " ";
159 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000160}
161
162void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000163 Cond->dump();
164 std::cerr << " ? ";
165 LHS->dump();
166 std::cerr << " : ";
167 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000168}