blob: 5df2cb211d31be8b72d5996a8dce9761c9c1610f [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 Lattner5e9a8782006-11-04 06:21:51 +000015#include "clang/AST/StmtVisitor.h"
Chris Lattnere165d942006-08-24 04:40:38 +000016#include "clang/Lex/IdentifierTable.h"
Chris Lattner1b926492006-08-23 06:42:10 +000017using namespace llvm;
18using namespace clang;
19
Chris Lattner0eedafe2006-08-24 04:56:27 +000020//===----------------------------------------------------------------------===//
21// Primary Expressions.
22//===----------------------------------------------------------------------===//
23
Chris Lattnerd3e98952006-10-06 05:22:26 +000024StringExpr::StringExpr(const char *strData, unsigned byteLength, bool Wide) {
25 // OPTIMIZE: could allocate this appended to the StringExpr.
26 char *AStrData = new char[byteLength];
27 memcpy(AStrData, strData, byteLength);
28 StrData = AStrData;
29 ByteLength = byteLength;
Chris Lattner882f7882006-11-04 18:52:07 +000030 IsWide = Wide;
Chris Lattnerd3e98952006-10-06 05:22:26 +000031}
32
33StringExpr::~StringExpr() {
34 delete[] StrData;
35}
36
Chris Lattner15768702006-11-05 23:54:51 +000037bool UnaryOperator::isPostfix(Opcode Op) {
38 switch (Op) {
39 case PostInc:
40 case PostDec:
41 return true;
42 default:
43 return false;
44 }
45}
46
Chris Lattner1b926492006-08-23 06:42:10 +000047/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
48/// corresponds to, e.g. "sizeof" or "[pre]++".
49const char *UnaryOperator::getOpcodeStr(Opcode Op) {
50 switch (Op) {
Chris Lattnerc52b1182006-10-25 05:45:55 +000051 default: assert(0 && "Unknown unary operator");
Chris Lattner15768702006-11-05 23:54:51 +000052 case PostInc: return "++";
53 case PostDec: return "--";
54 case PreInc: return "++";
55 case PreDec: return "--";
Chris Lattner1b926492006-08-23 06:42:10 +000056 case AddrOf: return "&";
57 case Deref: return "*";
58 case Plus: return "+";
59 case Minus: return "-";
60 case Not: return "~";
61 case LNot: return "!";
62 case Real: return "__real";
63 case Imag: return "__imag";
Chris Lattner26115ac2006-08-24 06:10:04 +000064 case SizeOf: return "sizeof";
65 case AlignOf: return "alignof";
Chris Lattnerc52b1182006-10-25 05:45:55 +000066 case Extension: return "__extension__";
Chris Lattner1b926492006-08-23 06:42:10 +000067 }
68}
69
Chris Lattner0eedafe2006-08-24 04:56:27 +000070//===----------------------------------------------------------------------===//
71// Postfix Operators.
72//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +000073
Chris Lattnere165d942006-08-24 04:40:38 +000074CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
75 : Fn(fn), NumArgs(numargs) {
76 Args = new Expr*[numargs];
77 for (unsigned i = 0; i != numargs; ++i)
78 Args[i] = args[i];
79}
80
Chris Lattner1b926492006-08-23 06:42:10 +000081/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
82/// corresponds to, e.g. "<<=".
83const char *BinaryOperator::getOpcodeStr(Opcode Op) {
84 switch (Op) {
85 default: assert(0 && "Unknown binary operator");
86 case Mul: return "*";
87 case Div: return "/";
88 case Rem: return "%";
89 case Add: return "+";
90 case Sub: return "-";
91 case Shl: return "<<";
92 case Shr: return ">>";
93 case LT: return "<";
94 case GT: return ">";
95 case LE: return "<=";
96 case GE: return ">=";
97 case EQ: return "==";
98 case NE: return "!=";
99 case And: return "&";
100 case Xor: return "^";
101 case Or: return "|";
102 case LAnd: return "&&";
103 case LOr: return "||";
104 case Assign: return "=";
105 case MulAssign: return "*=";
106 case DivAssign: return "/=";
107 case RemAssign: return "%=";
108 case AddAssign: return "+=";
109 case SubAssign: return "-=";
110 case ShlAssign: return "<<=";
111 case ShrAssign: return ">>=";
112 case AndAssign: return "&=";
113 case XorAssign: return "^=";
114 case OrAssign: return "|=";
115 case Comma: return ",";
116 }
117}