blob: 4685468eddf5c905d6352ed1a884ecb2adb55a2f [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- SemaExpr.cpp - Semantic Analysis for Expressions -----------------===//
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 semantic analysis for expressions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Sema.h"
15#include "clang/AST/ASTContext.h"
16#include "clang/AST/Decl.h"
17#include "clang/AST/Expr.h"
18#include "clang/Lex/Preprocessor.h"
19#include "clang/Lex/LiteralSupport.h"
20#include "clang/Basic/SourceManager.h"
21#include "clang/Basic/Diagnostic.h"
22#include "clang/Basic/LangOptions.h"
23#include "clang/Basic/TargetInfo.h"
24#include "llvm/ADT/SmallString.h"
25using namespace clang;
26
27/// ParseStringLiteral - The specified tokens were lexed as pasted string
28/// fragments (e.g. "foo" "bar" L"baz"). The result string has to handle string
29/// concatenation ([C99 5.1.1.2, translation phase #6]), so it may come from
30/// multiple tokens. However, the common case is that StringToks points to one
31/// string.
32///
33Action::ExprResult
34Sema::ParseStringLiteral(const LexerToken *StringToks, unsigned NumStringToks) {
35 assert(NumStringToks && "Must have at least one string!");
36
37 StringLiteralParser Literal(StringToks, NumStringToks, PP, Context.Target);
38 if (Literal.hadError)
39 return ExprResult(true);
40
41 llvm::SmallVector<SourceLocation, 4> StringTokLocs;
42 for (unsigned i = 0; i != NumStringToks; ++i)
43 StringTokLocs.push_back(StringToks[i].getLocation());
44
45 // FIXME: handle wchar_t
46 QualType t = Context.getPointerType(Context.CharTy);
47
48 // Pass &StringTokLocs[0], StringTokLocs.size() to factory!
49 return new StringLiteral(Literal.GetString(), Literal.GetStringLength(),
50 Literal.AnyWide, t, StringToks[0].getLocation(),
51 StringToks[NumStringToks-1].getLocation());
52}
53
54
55/// ParseIdentifierExpr - The parser read an identifier in expression context,
56/// validate it per-C99 6.5.1. HasTrailingLParen indicates whether this
57/// identifier is used in an function call context.
58Sema::ExprResult Sema::ParseIdentifierExpr(Scope *S, SourceLocation Loc,
59 IdentifierInfo &II,
60 bool HasTrailingLParen) {
61 // Could be enum-constant or decl.
62 Decl *D = LookupScopedDecl(&II, Decl::IDNS_Ordinary, Loc, S);
63 if (D == 0) {
64 // Otherwise, this could be an implicitly declared function reference (legal
65 // in C90, extension in C99).
66 if (HasTrailingLParen &&
67 // Not in C++.
68 !getLangOptions().CPlusPlus)
69 D = ImplicitlyDefineFunction(Loc, II, S);
70 else {
71 // If this name wasn't predeclared and if this is not a function call,
72 // diagnose the problem.
73 return Diag(Loc, diag::err_undeclared_var_use, II.getName());
74 }
75 }
76
77 if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
78 return new DeclRefExpr(VD, VD->getType(), Loc);
79 if (isa<TypedefDecl>(D))
80 return Diag(Loc, diag::err_unexpected_typedef, II.getName());
81
82 assert(0 && "Invalid decl");
83}
84
85Sema::ExprResult Sema::ParseSimplePrimaryExpr(SourceLocation Loc,
86 tok::TokenKind Kind) {
87 switch (Kind) {
88 default:
89 assert(0 && "Unknown simple primary expr!");
90 // TODO: MOVE this to be some other callback.
91 case tok::kw___func__: // primary-expression: __func__ [C99 6.4.2.2]
92 case tok::kw___FUNCTION__: // primary-expression: __FUNCTION__ [GNU]
93 case tok::kw___PRETTY_FUNCTION__: // primary-expression: __P..Y_F..N__ [GNU]
94 return 0;
95 }
96}
97
98Sema::ExprResult Sema::ParseCharacterConstant(const LexerToken &Tok) {
99 llvm::SmallString<16> CharBuffer;
100 CharBuffer.resize(Tok.getLength());
101 const char *ThisTokBegin = &CharBuffer[0];
102 unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin);
103
104 CharLiteralParser Literal(ThisTokBegin, ThisTokBegin+ActualLength,
105 Tok.getLocation(), PP);
106 if (Literal.hadError())
107 return ExprResult(true);
108 return new CharacterLiteral(Literal.getValue(), Context.IntTy,
109 Tok.getLocation());
110}
111
112Action::ExprResult Sema::ParseNumericConstant(const LexerToken &Tok) {
113 // fast path for a single digit (which is quite common). A single digit
114 // cannot have a trigraph, escaped newline, radix prefix, or type suffix.
115 if (Tok.getLength() == 1) {
116 const char *t = PP.getSourceManager().getCharacterData(Tok.getLocation());
117
118 unsigned IntSize = Context.Target.getIntWidth(Tok.getLocation());
119 return ExprResult(new IntegerLiteral(llvm::APInt(IntSize, *t-'0'),
120 Context.IntTy,
121 Tok.getLocation()));
122 }
123 llvm::SmallString<512> IntegerBuffer;
124 IntegerBuffer.resize(Tok.getLength());
125 const char *ThisTokBegin = &IntegerBuffer[0];
126
127 // Get the spelling of the token, which eliminates trigraphs, etc.
128 unsigned ActualLength = PP.getSpelling(Tok, ThisTokBegin);
129 NumericLiteralParser Literal(ThisTokBegin, ThisTokBegin+ActualLength,
130 Tok.getLocation(), PP);
131 if (Literal.hadError)
132 return ExprResult(true);
133
134 if (Literal.isIntegerLiteral()) {
135 QualType t;
136
137 // Get the value in the widest-possible width.
138 llvm::APInt ResultVal(Context.Target.getIntMaxTWidth(Tok.getLocation()), 0);
139
140 if (Literal.GetIntegerValue(ResultVal)) {
141 // If this value didn't fit into uintmax_t, warn and force to ull.
142 Diag(Tok.getLocation(), diag::warn_integer_too_large);
143 t = Context.UnsignedLongLongTy;
144 assert(Context.getIntegerBitwidth(t, Tok.getLocation()) ==
145 ResultVal.getBitWidth() && "long long is not intmax_t?");
146 } else {
147 // If this value fits into a ULL, try to figure out what else it fits into
148 // according to the rules of C99 6.4.4.1p5.
149
150 // Octal, Hexadecimal, and integers with a U suffix are allowed to
151 // be an unsigned int.
152 bool AllowUnsigned = Literal.isUnsigned || Literal.getRadix() != 10;
153
154 // Check from smallest to largest, picking the smallest type we can.
155 if (!Literal.isLong) { // Are int/unsigned possibilities?
156 unsigned IntSize = Context.Target.getIntWidth(Tok.getLocation());
157 // Does it fit in a unsigned int?
158 if (ResultVal.isIntN(IntSize)) {
159 // Does it fit in a signed int?
160 if (!Literal.isUnsigned && ResultVal[IntSize-1] == 0)
161 t = Context.IntTy;
162 else if (AllowUnsigned)
163 t = Context.UnsignedIntTy;
164 }
165
166 if (!t.isNull())
167 ResultVal.trunc(IntSize);
168 }
169
170 // Are long/unsigned long possibilities?
171 if (t.isNull() && !Literal.isLongLong) {
172 unsigned LongSize = Context.Target.getLongWidth(Tok.getLocation());
173
174 // Does it fit in a unsigned long?
175 if (ResultVal.isIntN(LongSize)) {
176 // Does it fit in a signed long?
177 if (!Literal.isUnsigned && ResultVal[LongSize-1] == 0)
178 t = Context.LongTy;
179 else if (AllowUnsigned)
180 t = Context.UnsignedLongTy;
181 }
182 if (!t.isNull())
183 ResultVal.trunc(LongSize);
184 }
185
186 // Finally, check long long if needed.
187 if (t.isNull()) {
188 unsigned LongLongSize =
189 Context.Target.getLongLongWidth(Tok.getLocation());
190
191 // Does it fit in a unsigned long long?
192 if (ResultVal.isIntN(LongLongSize)) {
193 // Does it fit in a signed long long?
194 if (!Literal.isUnsigned && ResultVal[LongLongSize-1] == 0)
195 t = Context.LongLongTy;
196 else if (AllowUnsigned)
197 t = Context.UnsignedLongLongTy;
198 }
199 }
200
201 // If we still couldn't decide a type, we probably have something that
202 // does not fit in a signed long long, but has no U suffix.
203 if (t.isNull()) {
204 Diag(Tok.getLocation(), diag::warn_integer_too_large_for_signed);
205 t = Context.UnsignedLongLongTy;
206 }
207 }
208
209 return new IntegerLiteral(ResultVal, t, Tok.getLocation());
210 } else if (Literal.isFloatingLiteral()) {
211 // FIXME: handle float values > 32 (including compute the real type...).
212 return new FloatingLiteral(Literal.GetFloatValue(), Context.FloatTy,
213 Tok.getLocation());
214 }
215 return ExprResult(true);
216}
217
218Action::ExprResult Sema::ParseParenExpr(SourceLocation L, SourceLocation R,
219 ExprTy *Val) {
220 Expr *e = (Expr *)Val;
221 assert((e != 0) && "ParseParenExpr() missing expr");
222 return new ParenExpr(L, R, e);
223}
224
225/// The UsualUnaryConversions() function is *not* called by this routine.
226/// See C99 6.3.2.1p[2-4] for more details.
227QualType Sema::CheckSizeOfAlignOfOperand(QualType exprType,
228 SourceLocation OpLoc, bool isSizeof) {
229 // C99 6.5.3.4p1:
230 if (isa<FunctionType>(exprType) && isSizeof)
231 // alignof(function) is allowed.
232 Diag(OpLoc, diag::ext_sizeof_function_type);
233 else if (exprType->isVoidType())
234 Diag(OpLoc, diag::ext_sizeof_void_type, isSizeof ? "sizeof" : "__alignof");
235 else if (exprType->isIncompleteType()) {
236 Diag(OpLoc, isSizeof ? diag::err_sizeof_incomplete_type :
237 diag::err_alignof_incomplete_type,
238 exprType.getAsString());
239 return QualType(); // error
240 }
241 // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
242 return Context.getSizeType();
243}
244
245Action::ExprResult Sema::
246ParseSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof,
247 SourceLocation LPLoc, TypeTy *Ty,
248 SourceLocation RPLoc) {
249 // If error parsing type, ignore.
250 if (Ty == 0) return true;
251
252 // Verify that this is a valid expression.
253 QualType ArgTy = QualType::getFromOpaquePtr(Ty);
254
255 QualType resultType = CheckSizeOfAlignOfOperand(ArgTy, OpLoc, isSizeof);
256
257 if (resultType.isNull())
258 return true;
259 return new SizeOfAlignOfTypeExpr(isSizeof, ArgTy, resultType, OpLoc, RPLoc);
260}
261
262
263Action::ExprResult Sema::ParsePostfixUnaryOp(SourceLocation OpLoc,
264 tok::TokenKind Kind,
265 ExprTy *Input) {
266 UnaryOperator::Opcode Opc;
267 switch (Kind) {
268 default: assert(0 && "Unknown unary op!");
269 case tok::plusplus: Opc = UnaryOperator::PostInc; break;
270 case tok::minusminus: Opc = UnaryOperator::PostDec; break;
271 }
272 QualType result = CheckIncrementDecrementOperand((Expr *)Input, OpLoc);
273 if (result.isNull())
274 return true;
275 return new UnaryOperator((Expr *)Input, Opc, result, OpLoc);
276}
277
278Action::ExprResult Sema::
279ParseArraySubscriptExpr(ExprTy *Base, SourceLocation LLoc,
280 ExprTy *Idx, SourceLocation RLoc) {
281 QualType t1 = ((Expr *)Base)->getType();
282 QualType t2 = ((Expr *)Idx)->getType();
283
284 assert(!t1.isNull() && "no type for array base expression");
285 assert(!t2.isNull() && "no type for array index expression");
286
287 QualType canonT1 = DefaultFunctionArrayConversion(t1).getCanonicalType();
288 QualType canonT2 = DefaultFunctionArrayConversion(t2).getCanonicalType();
289
290 // C99 6.5.2.1p2: the expression e1[e2] is by definition precisely equivalent
291 // to the expression *((e1)+(e2)). This means the array "Base" may actually be
292 // in the subscript position. As a result, we need to derive the array base
293 // and index from the expression types.
294
295 Expr *baseExpr, *indexExpr;
296 QualType baseType, indexType;
297 if (isa<PointerType>(canonT1) || isa<VectorType>(canonT1)) {
298 baseType = canonT1;
299 indexType = canonT2;
300 baseExpr = static_cast<Expr *>(Base);
301 indexExpr = static_cast<Expr *>(Idx);
302 } else if (isa<PointerType>(canonT2)) { // uncommon
303 baseType = canonT2;
304 indexType = canonT1;
305 baseExpr = static_cast<Expr *>(Idx);
306 indexExpr = static_cast<Expr *>(Base);
307 } else {
308 return Diag(static_cast<Expr *>(Base)->getLocStart(),
309 diag::err_typecheck_subscript_value,
310 static_cast<Expr *>(Base)->getSourceRange());
311 }
312 // C99 6.5.2.1p1
313 if (!indexType->isIntegerType()) {
314 return Diag(indexExpr->getLocStart(), diag::err_typecheck_subscript,
315 indexExpr->getSourceRange());
316 }
317 QualType resultType;
318 if (PointerType *ary = dyn_cast<PointerType>(baseType)) {
319 // FIXME: need to deal with const...
320 resultType = ary->getPointeeType();
321 // in practice, the following check catches trying to index a pointer
322 // to a function (e.g. void (*)(int)). Functions are not objects in c99.
323 if (!resultType->isObjectType()) {
324 return Diag(baseExpr->getLocStart(),
325 diag::err_typecheck_subscript_not_object,
326 baseType.getAsString(), baseExpr->getSourceRange());
327 }
328 } else if (VectorType *vec = dyn_cast<VectorType>(baseType))
329 resultType = vec->getElementType();
330
331 return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx, resultType, RLoc);
332}
333
334Action::ExprResult Sema::
335ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
336 tok::TokenKind OpKind, SourceLocation MemberLoc,
337 IdentifierInfo &Member) {
338 QualType qualifiedType = ((Expr *)Base)->getType();
339
340 assert(!qualifiedType.isNull() && "no type for member expression");
341
342 QualType canonType = qualifiedType.getCanonicalType();
343
344 if (OpKind == tok::arrow) {
345 if (PointerType *PT = dyn_cast<PointerType>(canonType)) {
346 qualifiedType = PT->getPointeeType();
347 canonType = qualifiedType.getCanonicalType();
348 } else
349 return Diag(OpLoc, diag::err_typecheck_member_reference_arrow);
350 }
351 if (!isa<RecordType>(canonType))
352 return Diag(OpLoc, diag::err_typecheck_member_reference_structUnion);
353
354 // get the struct/union definition from the type.
355 RecordDecl *RD = cast<RecordType>(canonType)->getDecl();
356
357 if (canonType->isIncompleteType())
358 return Diag(OpLoc, diag::err_typecheck_incomplete_tag, RD->getName());
359
360 FieldDecl *MemberDecl = RD->getMember(&Member);
361 if (!MemberDecl)
362 return Diag(OpLoc, diag::err_typecheck_no_member, Member.getName());
363
364 return new MemberExpr((Expr*)Base, OpKind == tok::arrow,
365 MemberDecl, MemberLoc);
366}
367
368/// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
369/// This provides the location of the left/right parens and a list of comma
370/// locations.
371Action::ExprResult Sema::
372ParseCallExpr(ExprTy *Fn, SourceLocation LParenLoc,
373 ExprTy **Args, unsigned NumArgsInCall,
374 SourceLocation *CommaLocs, SourceLocation RParenLoc) {
375 Expr *funcExpr = (Expr *)Fn;
376 assert(funcExpr && "no function call expression");
377
378 QualType qType = UsualUnaryConversions(funcExpr->getType());
379 assert(!qType.isNull() && "no type for function call expression");
380
381 // C99 6.5.2.2p1 - "The expression that denotes the called function shall have
382 // type pointer to function".
383 const PointerType *PT = dyn_cast<PointerType>(qType);
384 if (PT == 0) PT = dyn_cast<PointerType>(qType.getCanonicalType());
385
386 if (PT == 0)
387 return Diag(funcExpr->getLocStart(), diag::err_typecheck_call_not_function,
388 SourceRange(funcExpr->getLocStart(), RParenLoc));
389
390 const FunctionType *funcT = dyn_cast<FunctionType>(PT->getPointeeType());
391 if (funcT == 0)
392 funcT = dyn_cast<FunctionType>(PT->getPointeeType().getCanonicalType());
393
394 if (funcT == 0)
395 return Diag(funcExpr->getLocStart(), diag::err_typecheck_call_not_function,
396 SourceRange(funcExpr->getLocStart(), RParenLoc));
397
398 // If a prototype isn't declared, the parser implicitly defines a func decl
399 QualType resultType = funcT->getResultType();
400
401 if (const FunctionTypeProto *proto = dyn_cast<FunctionTypeProto>(funcT)) {
402 // C99 6.5.2.2p7 - the arguments are implicitly converted, as if by
403 // assignment, to the types of the corresponding parameter, ...
404
405 unsigned NumArgsInProto = proto->getNumArgs();
406 unsigned NumArgsToCheck = NumArgsInCall;
407
408 if (NumArgsInCall < NumArgsInProto)
409 Diag(RParenLoc, diag::err_typecheck_call_too_few_args,
410 funcExpr->getSourceRange());
411 else if (NumArgsInCall > NumArgsInProto) {
412 if (!proto->isVariadic()) {
413 Diag(((Expr **)Args)[NumArgsInProto+1]->getLocStart(),
414 diag::err_typecheck_call_too_many_args, funcExpr->getSourceRange(),
415 ((Expr **)Args)[NumArgsInProto+1]->getSourceRange());
416 }
417 NumArgsToCheck = NumArgsInProto;
418 }
419 // Continue to check argument types (even if we have too few/many args).
420 for (unsigned i = 0; i < NumArgsToCheck; i++) {
421 Expr *argExpr = ((Expr **)Args)[i];
422 assert(argExpr && "ParseCallExpr(): missing argument expression");
423
424 QualType lhsType = proto->getArgType(i);
425 QualType rhsType = argExpr->getType();
426
427 if (lhsType == rhsType) // common case, fast path...
428 continue;
429
430 AssignmentCheckResult result = CheckAssignmentConstraints(lhsType,
431 rhsType);
432 SourceLocation l = argExpr->getLocStart();
433
434 // decode the result (notice that AST's are still created for extensions).
435 switch (result) {
436 case Compatible:
437 break;
438 case PointerFromInt:
439 // check for null pointer constant (C99 6.3.2.3p3)
440 if (!argExpr->isNullPointerConstant()) {
441 Diag(l, diag::ext_typecheck_passing_pointer_int,
442 lhsType.getAsString(), rhsType.getAsString(),
443 funcExpr->getSourceRange(), argExpr->getSourceRange());
444 }
445 break;
446 case IntFromPointer:
447 Diag(l, diag::ext_typecheck_passing_pointer_int,
448 lhsType.getAsString(), rhsType.getAsString(),
449 funcExpr->getSourceRange(), argExpr->getSourceRange());
450 break;
451 case IncompatiblePointer:
452 Diag(l, diag::ext_typecheck_passing_incompatible_pointer,
453 rhsType.getAsString(), lhsType.getAsString(),
454 funcExpr->getSourceRange(), argExpr->getSourceRange());
455 break;
456 case CompatiblePointerDiscardsQualifiers:
457 Diag(l, diag::ext_typecheck_passing_discards_qualifiers,
458 rhsType.getAsString(), lhsType.getAsString(),
459 funcExpr->getSourceRange(), argExpr->getSourceRange());
460 break;
461 case Incompatible:
462 return Diag(l, diag::err_typecheck_passing_incompatible,
463 rhsType.getAsString(), lhsType.getAsString(),
464 funcExpr->getSourceRange(), argExpr->getSourceRange());
465 }
466 }
467 // Even if the types checked, bail if we had the wrong number of arguments.
468 if ((NumArgsInCall != NumArgsInProto) && !proto->isVariadic())
469 return true;
470 }
471 return new CallExpr((Expr*)Fn, (Expr**)Args, NumArgsInCall, resultType,
472 RParenLoc);
473}
474
475Action::ExprResult Sema::
476ParseCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
477 SourceLocation RParenLoc, ExprTy *Op) {
478 // If error parsing type, ignore.
479 assert((Ty != 0) && "ParseCastExpr(): missing type");
480 // FIXME: Sema for cast is completely missing.
481 return new CastExpr(QualType::getFromOpaquePtr(Ty), (Expr*)Op, LParenLoc);
482}
483
484inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
485 Expr *Cond, Expr *LHS, Expr *RHS, SourceLocation questionLoc) {
486 QualType cond = Cond->getType();
487 QualType lhs = LHS->getType();
488 QualType rhs = RHS->getType();
489
490 assert(!cond.isNull() && "ParseConditionalOp(): no conditional type");
491 assert(!lhs.isNull() && "ParseConditionalOp(): no lhs type");
492 assert(!rhs.isNull() && "ParseConditionalOp(): no rhs type");
493
494 cond = UsualUnaryConversions(cond);
495 lhs = UsualUnaryConversions(lhs);
496 rhs = UsualUnaryConversions(rhs);
497
498 // first, check the condition.
499 if (!cond->isScalarType()) { // C99 6.5.15p2
500 Diag(Cond->getLocStart(), diag::err_typecheck_cond_expect_scalar,
501 cond.getAsString());
502 return QualType();
503 }
504 // now check the two expressions.
505 if (lhs->isArithmeticType() && rhs->isArithmeticType()) // C99 6.5.15p3,5
506 return UsualArithmeticConversions(lhs, rhs);
507
508 if ((lhs->isStructureType() && rhs->isStructureType()) || // C99 6.5.15p3
509 (lhs->isUnionType() && rhs->isUnionType())) {
510 TagType *lTag = cast<TagType>(lhs.getCanonicalType());
511 TagType *rTag = cast<TagType>(rhs.getCanonicalType());
512
513 if (lTag->getDecl()->getIdentifier() == rTag->getDecl()->getIdentifier())
514 return lhs;
515 else {
516 Diag(questionLoc, diag::err_typecheck_cond_incompatible_operands,
517 lhs.getAsString(), rhs.getAsString(),
518 LHS->getSourceRange(), RHS->getSourceRange());
519 return QualType();
520 }
521 }
522 if (lhs->isPointerType() && RHS->isNullPointerConstant()) // C99 6.5.15p3
523 return lhs;
524 if (rhs->isPointerType() && LHS->isNullPointerConstant())
525 return rhs;
526
527 if (lhs->isPointerType() && rhs->isPointerType()) { // C99 6.5.15p3,6
528 QualType lhptee, rhptee;
529
530 // get the "pointed to" type
531 lhptee = cast<PointerType>(lhs.getCanonicalType())->getPointeeType();
532 rhptee = cast<PointerType>(rhs.getCanonicalType())->getPointeeType();
533
534 // ignore qualifiers on void (C99 6.5.15p3, clause 6)
535 if (lhptee.getUnqualifiedType()->isVoidType() &&
536 (rhptee->isObjectType() || rhptee->isIncompleteType()))
537 return lhs;
538 if (rhptee.getUnqualifiedType()->isVoidType() &&
539 (lhptee->isObjectType() || lhptee->isIncompleteType()))
540 return rhs;
541
542 // FIXME: C99 6.5.15p6: If both operands are pointers to compatible types
543 // *or* to differently qualified versions of compatible types, the result
544 // type is a pointer to an appropriately qualified version of the
545 // *composite* type.
546 if (!Type::typesAreCompatible(lhptee.getUnqualifiedType(),
547 rhptee.getUnqualifiedType())) {
548 Diag(questionLoc, diag::ext_typecheck_cond_incompatible_pointers,
549 lhs.getAsString(), rhs.getAsString(),
550 LHS->getSourceRange(), RHS->getSourceRange());
551 return lhs; // FIXME: this is an _ext - is this return o.k?
552 }
553 }
554 if (lhs->isVoidType() && rhs->isVoidType()) // C99 6.5.15p3
555 return lhs;
556
557 Diag(questionLoc, diag::err_typecheck_cond_incompatible_operands,
558 lhs.getAsString(), rhs.getAsString(),
559 LHS->getSourceRange(), RHS->getSourceRange());
560 return QualType();
561}
562
563/// ParseConditionalOp - Parse a ?: operation. Note that 'LHS' may be null
564/// in the case of a the GNU conditional expr extension.
565Action::ExprResult Sema::ParseConditionalOp(SourceLocation QuestionLoc,
566 SourceLocation ColonLoc,
567 ExprTy *Cond, ExprTy *LHS,
568 ExprTy *RHS) {
569 QualType result = CheckConditionalOperands((Expr *)Cond, (Expr *)LHS,
570 (Expr *)RHS, QuestionLoc);
571 if (result.isNull())
572 return true;
573 return new ConditionalOperator((Expr*)Cond, (Expr*)LHS, (Expr*)RHS, result);
574}
575
Chris Lattner1c2a65b2007-07-11 21:50:45 +0000576QualType Sema::DefaultFunctionArrayConversion(QualType t) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000577 if (t->isFunctionType()) // C99 6.3.2.1p4
578 return Context.getPointerType(t);
579 if (const ArrayType *ary = dyn_cast<ArrayType>(t.getCanonicalType()))
580 return Context.getPointerType(ary->getElementType()); // C99 6.3.2.1p3
581 return t;
582}
583
584/// UsualUnaryConversion - Performs various conversions that are common to most
585/// operators (C99 6.3). The conversions of array and function types are
586/// sometimes surpressed. For example, the array->pointer conversion doesn't
587/// apply if the array is an argument to the sizeof or address (&) operators.
588/// In these instances, this routine should *not* be called.
589QualType Sema::UsualUnaryConversions(QualType t) {
590 assert(!t.isNull() && "UsualUnaryConversions - missing type");
591
592 if (t->isPromotableIntegerType()) // C99 6.3.1.1p2
593 return Context.IntTy;
594 return DefaultFunctionArrayConversion(t);
595}
596
597/// UsualArithmeticConversions - Performs various conversions that are common to
598/// binary operators (C99 6.3.1.8). If both operands aren't arithmetic, this
599/// routine returns the first non-arithmetic type found. The client is
600/// responsible for emitting appropriate error diagnostics.
601QualType Sema::UsualArithmeticConversions(QualType &lhs, QualType &rhs) {
602 lhs = UsualUnaryConversions(lhs);
603 rhs = UsualUnaryConversions(rhs);
604
605 // If both types are identical, no conversion is needed.
606 if (lhs == rhs)
607 return lhs;
608
609 // If either side is a non-arithmetic type (e.g. a pointer), we are done.
610 // The caller can deal with this (e.g. pointer + int).
611 if (!lhs->isArithmeticType())
612 return lhs;
613 if (!rhs->isArithmeticType())
614 return rhs;
615
616 // At this point, we have two different arithmetic types.
617
618 // Handle complex types first (C99 6.3.1.8p1).
619 if (lhs->isComplexType() || rhs->isComplexType()) {
620 // if we have an integer operand, the result is the complex type.
621 if (rhs->isIntegerType())
622 return lhs;
623 if (lhs->isIntegerType())
624 return rhs;
625
626 return Context.maxComplexType(lhs, rhs);
627 }
628
629 // Now handle "real" floating types (i.e. float, double, long double).
630 if (lhs->isRealFloatingType() || rhs->isRealFloatingType()) {
631 // if we have an integer operand, the result is the real floating type.
632 if (rhs->isIntegerType())
633 return lhs;
634 if (lhs->isIntegerType())
635 return rhs;
636
637 // we have two real floating types, float/complex combos were handled above.
638 return Context.maxFloatingType(lhs, rhs);
639 }
640 return Context.maxIntegerType(lhs, rhs);
641}
642
643// CheckPointerTypesForAssignment - This is a very tricky routine (despite
644// being closely modeled after the C99 spec:-). The odd characteristic of this
645// routine is it effectively iqnores the qualifiers on the top level pointee.
646// This circumvents the usual type rules specified in 6.2.7p1 & 6.7.5.[1-3].
647// FIXME: add a couple examples in this comment.
648Sema::AssignmentCheckResult
649Sema::CheckPointerTypesForAssignment(QualType lhsType, QualType rhsType) {
650 QualType lhptee, rhptee;
651
652 // get the "pointed to" type (ignoring qualifiers at the top level)
653 lhptee = cast<PointerType>(lhsType.getCanonicalType())->getPointeeType();
654 rhptee = cast<PointerType>(rhsType.getCanonicalType())->getPointeeType();
655
656 // make sure we operate on the canonical type
657 lhptee = lhptee.getCanonicalType();
658 rhptee = rhptee.getCanonicalType();
659
660 AssignmentCheckResult r = Compatible;
661
662 // C99 6.5.16.1p1: This following citation is common to constraints
663 // 3 & 4 (below). ...and the type *pointed to* by the left has all the
664 // qualifiers of the type *pointed to* by the right;
665 if ((lhptee.getQualifiers() & rhptee.getQualifiers()) !=
666 rhptee.getQualifiers())
667 r = CompatiblePointerDiscardsQualifiers;
668
669 // C99 6.5.16.1p1 (constraint 4): If one operand is a pointer to an object or
670 // incomplete type and the other is a pointer to a qualified or unqualified
671 // version of void...
672 if (lhptee.getUnqualifiedType()->isVoidType() &&
673 (rhptee->isObjectType() || rhptee->isIncompleteType()))
674 ;
675 else if (rhptee.getUnqualifiedType()->isVoidType() &&
676 (lhptee->isObjectType() || lhptee->isIncompleteType()))
677 ;
678 // C99 6.5.16.1p1 (constraint 3): both operands are pointers to qualified or
679 // unqualified versions of compatible types, ...
680 else if (!Type::typesAreCompatible(lhptee.getUnqualifiedType(),
681 rhptee.getUnqualifiedType()))
682 r = IncompatiblePointer; // this "trumps" PointerAssignDiscardsQualifiers
683 return r;
684}
685
686/// CheckAssignmentConstraints (C99 6.5.16) - This routine currently
687/// has code to accommodate several GCC extensions when type checking
688/// pointers. Here are some objectionable examples that GCC considers warnings:
689///
690/// int a, *pint;
691/// short *pshort;
692/// struct foo *pfoo;
693///
694/// pint = pshort; // warning: assignment from incompatible pointer type
695/// a = pint; // warning: assignment makes integer from pointer without a cast
696/// pint = a; // warning: assignment makes pointer from integer without a cast
697/// pint = pfoo; // warning: assignment from incompatible pointer type
698///
699/// As a result, the code for dealing with pointers is more complex than the
700/// C99 spec dictates.
701/// Note: the warning above turn into errors when -pedantic-errors is enabled.
702///
703Sema::AssignmentCheckResult
704Sema::CheckAssignmentConstraints(QualType lhsType, QualType rhsType) {
705 // This check seems unnatural, however it is necessary to insure the proper
706 // conversion of functions/arrays. If the conversion were done for all
707 // DeclExpr's (created by ParseIdentifierExpr), it would mess up the unary
708 // expressions that surpress this implicit conversion (&, sizeof).
709 rhsType = DefaultFunctionArrayConversion(rhsType);
710
711 if (lhsType->isArithmeticType() && rhsType->isArithmeticType()) {
712 if (lhsType->isVectorType() || rhsType->isVectorType()) {
713 if (lhsType.getCanonicalType() != rhsType.getCanonicalType())
714 return Incompatible;
715 }
716 return Compatible;
717 } else if (lhsType->isPointerType()) {
718 if (rhsType->isIntegerType())
719 return PointerFromInt;
720
721 if (rhsType->isPointerType())
722 return CheckPointerTypesForAssignment(lhsType, rhsType);
723 } else if (rhsType->isPointerType()) {
724 // C99 6.5.16.1p1: the left operand is _Bool and the right is a pointer.
725 if ((lhsType->isIntegerType()) && (lhsType != Context.BoolTy))
726 return IntFromPointer;
727
728 if (lhsType->isPointerType())
729 return CheckPointerTypesForAssignment(lhsType, rhsType);
730 } else if (isa<TagType>(lhsType) && isa<TagType>(rhsType)) {
731 if (Type::tagTypesAreCompatible(lhsType, rhsType))
732 return Compatible;
733 } else if (lhsType->isReferenceType() || rhsType->isReferenceType()) {
734 if (Type::referenceTypesAreCompatible(lhsType, rhsType))
735 return Compatible;
736 }
737 return Incompatible;
738}
739
740inline void Sema::InvalidOperands(SourceLocation loc, Expr *lex, Expr *rex) {
741 Diag(loc, diag::err_typecheck_invalid_operands,
742 lex->getType().getAsString(), rex->getType().getAsString(),
743 lex->getSourceRange(), rex->getSourceRange());
744}
745
746inline QualType Sema::CheckVectorOperands(SourceLocation loc, Expr *lex,
747 Expr *rex) {
748 QualType lhsType = lex->getType(), rhsType = rex->getType();
749
750 // make sure the vector types are identical.
751 if (lhsType == rhsType)
752 return lhsType;
753 // You cannot convert between vector values of different size.
754 Diag(loc, diag::err_typecheck_vector_not_convertable,
755 lex->getType().getAsString(), rex->getType().getAsString(),
756 lex->getSourceRange(), rex->getSourceRange());
757 return QualType();
758}
759
760inline QualType Sema::CheckMultiplyDivideOperands(
761 Expr *lex, Expr *rex, SourceLocation loc)
762{
763 QualType lhsType = lex->getType(), rhsType = rex->getType();
764
765 if (lhsType->isVectorType() || rhsType->isVectorType())
766 return CheckVectorOperands(loc, lex, rex);
767 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
768
769 if (resType->isArithmeticType())
770 return resType;
771 InvalidOperands(loc, lex, rex);
772 return QualType();
773}
774
775inline QualType Sema::CheckRemainderOperands(
776 Expr *lex, Expr *rex, SourceLocation loc)
777{
778 QualType lhsType = lex->getType(), rhsType = rex->getType();
779 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
780
781 if (resType->isIntegerType())
782 return resType;
783 InvalidOperands(loc, lex, rex);
784 return QualType();
785}
786
787inline QualType Sema::CheckAdditionOperands( // C99 6.5.6
788 Expr *lex, Expr *rex, SourceLocation loc)
789{
790 QualType lhsType = lex->getType(), rhsType = rex->getType();
791
792 if (lhsType->isVectorType() || rhsType->isVectorType())
793 return CheckVectorOperands(loc, lex, rex);
794 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
795
796 // handle the common case first (both operands are arithmetic).
797 if (resType->isArithmeticType())
798 return resType;
799
800 if ((lhsType->isPointerType() && rhsType->isIntegerType()) ||
801 (lhsType->isIntegerType() && rhsType->isPointerType()))
802 return resType;
803 InvalidOperands(loc, lex, rex);
804 return QualType();
805}
806
807inline QualType Sema::CheckSubtractionOperands( // C99 6.5.6
808 Expr *lex, Expr *rex, SourceLocation loc)
809{
810 QualType lhsType = lex->getType(), rhsType = rex->getType();
811
812 if (lhsType->isVectorType() || rhsType->isVectorType())
813 return CheckVectorOperands(loc, lex, rex);
814 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
815
816 // handle the common case first (both operands are arithmetic).
817 if (resType->isArithmeticType())
818 return resType;
819 if ((lhsType->isPointerType() && rhsType->isIntegerType()) ||
820 (lhsType->isPointerType() && rhsType->isPointerType()))
821 return resType;
822 InvalidOperands(loc, lex, rex);
823 return QualType();
824}
825
826inline QualType Sema::CheckShiftOperands( // C99 6.5.7
827 Expr *lex, Expr *rex, SourceLocation loc)
828{
829 // FIXME: Shifts don't perform usual arithmetic conversions. This is wrong
830 // for int << longlong -> the result type should be int, not long long.
831 QualType lhsType = lex->getType(), rhsType = rex->getType();
832 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
833
834 if (resType->isIntegerType())
835 return resType;
836 InvalidOperands(loc, lex, rex);
837 return QualType();
838}
839
840inline QualType Sema::CheckRelationalOperands( // C99 6.5.8
841 Expr *lex, Expr *rex, SourceLocation loc)
842{
843 QualType lType = UsualUnaryConversions(lex->getType());
844 QualType rType = UsualUnaryConversions(rex->getType());
845
846 if (lType->isRealType() && rType->isRealType())
847 return Context.IntTy;
848
849 if (lType->isPointerType()) {
850 if (rType->isPointerType())
851 return Context.IntTy;
852 if (rType->isIntegerType()) {
853 if (!rex->isNullPointerConstant())
854 Diag(loc, diag::ext_typecheck_comparison_of_pointer_integer,
855 lex->getSourceRange(), rex->getSourceRange());
856 return Context.IntTy; // the previous diagnostic is a GCC extension.
857 }
858 } else if (rType->isPointerType()) {
859 if (lType->isIntegerType()) {
860 if (!lex->isNullPointerConstant())
861 Diag(loc, diag::ext_typecheck_comparison_of_pointer_integer,
862 lex->getSourceRange(), rex->getSourceRange());
863 return Context.IntTy; // the previous diagnostic is a GCC extension.
864 }
865 }
866 InvalidOperands(loc, lex, rex);
867 return QualType();
868}
869
870inline QualType Sema::CheckEqualityOperands( // C99 6.5.9
871 Expr *lex, Expr *rex, SourceLocation loc)
872{
873 QualType lType = UsualUnaryConversions(lex->getType());
874 QualType rType = UsualUnaryConversions(rex->getType());
875
876 if (lType->isArithmeticType() && rType->isArithmeticType())
877 return Context.IntTy;
878
879 if (lType->isPointerType()) {
880 if (rType->isPointerType())
881 return Context.IntTy;
882 if (rType->isIntegerType()) {
883 if (!rex->isNullPointerConstant())
884 Diag(loc, diag::ext_typecheck_comparison_of_pointer_integer,
885 lex->getSourceRange(), rex->getSourceRange());
886 return Context.IntTy; // the previous diagnostic is a GCC extension.
887 }
888 } else if (rType->isPointerType()) {
889 if (lType->isIntegerType()) {
890 if (!lex->isNullPointerConstant())
891 Diag(loc, diag::ext_typecheck_comparison_of_pointer_integer,
892 lex->getSourceRange(), rex->getSourceRange());
893 return Context.IntTy; // the previous diagnostic is a GCC extension.
894 }
895 }
896 InvalidOperands(loc, lex, rex);
897 return QualType();
898}
899
900inline QualType Sema::CheckBitwiseOperands(
901 Expr *lex, Expr *rex, SourceLocation loc)
902{
903 QualType lhsType = lex->getType(), rhsType = rex->getType();
904
905 if (lhsType->isVectorType() || rhsType->isVectorType())
906 return CheckVectorOperands(loc, lex, rex);
907 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
908
909 if (resType->isIntegerType())
910 return resType;
911 InvalidOperands(loc, lex, rex);
912 return QualType();
913}
914
915inline QualType Sema::CheckLogicalOperands( // C99 6.5.[13,14]
916 Expr *lex, Expr *rex, SourceLocation loc)
917{
918 QualType lhsType = UsualUnaryConversions(lex->getType());
919 QualType rhsType = UsualUnaryConversions(rex->getType());
920
921 if (lhsType->isScalarType() || rhsType->isScalarType())
922 return Context.IntTy;
923 InvalidOperands(loc, lex, rex);
924 return QualType();
925}
926
927inline QualType Sema::CheckAssignmentOperands( // C99 6.5.16.1
928 Expr *lex, Expr *rex, SourceLocation loc, QualType compoundType)
929{
930 QualType lhsType = lex->getType();
931 QualType rhsType = compoundType.isNull() ? rex->getType() : compoundType;
932 bool hadError = false;
933 Expr::isModifiableLvalueResult mlval = lex->isModifiableLvalue();
934
935 switch (mlval) { // C99 6.5.16p2
936 case Expr::MLV_Valid:
937 break;
938 case Expr::MLV_ConstQualified:
939 Diag(loc, diag::err_typecheck_assign_const, lex->getSourceRange());
940 hadError = true;
941 break;
942 case Expr::MLV_ArrayType:
943 Diag(loc, diag::err_typecheck_array_not_modifiable_lvalue,
944 lhsType.getAsString(), lex->getSourceRange());
945 return QualType();
946 case Expr::MLV_NotObjectType:
947 Diag(loc, diag::err_typecheck_non_object_not_modifiable_lvalue,
948 lhsType.getAsString(), lex->getSourceRange());
949 return QualType();
950 case Expr::MLV_InvalidExpression:
951 Diag(loc, diag::err_typecheck_expression_not_modifiable_lvalue,
952 lex->getSourceRange());
953 return QualType();
954 case Expr::MLV_IncompleteType:
955 case Expr::MLV_IncompleteVoidType:
956 Diag(loc, diag::err_typecheck_incomplete_type_not_modifiable_lvalue,
957 lhsType.getAsString(), lex->getSourceRange());
958 return QualType();
959 }
960 if (lhsType == rhsType) // common case, fast path...
961 return lhsType;
962
963 AssignmentCheckResult result = CheckAssignmentConstraints(lhsType, rhsType);
964
965 // decode the result (notice that extensions still return a type).
966 switch (result) {
967 case Compatible:
968 break;
969 case Incompatible:
970 Diag(loc, diag::err_typecheck_assign_incompatible,
971 lhsType.getAsString(), rhsType.getAsString(),
972 lex->getSourceRange(), rex->getSourceRange());
973 hadError = true;
974 break;
975 case PointerFromInt:
976 // check for null pointer constant (C99 6.3.2.3p3)
977 if (compoundType.isNull() && !rex->isNullPointerConstant()) {
978 Diag(loc, diag::ext_typecheck_assign_pointer_int,
979 lhsType.getAsString(), rhsType.getAsString(),
980 lex->getSourceRange(), rex->getSourceRange());
981 }
982 break;
983 case IntFromPointer:
984 Diag(loc, diag::ext_typecheck_assign_pointer_int,
985 lhsType.getAsString(), rhsType.getAsString(),
986 lex->getSourceRange(), rex->getSourceRange());
987 break;
988 case IncompatiblePointer:
989 Diag(loc, diag::ext_typecheck_assign_incompatible_pointer,
990 lhsType.getAsString(), rhsType.getAsString(),
991 lex->getSourceRange(), rex->getSourceRange());
992 break;
993 case CompatiblePointerDiscardsQualifiers:
994 Diag(loc, diag::ext_typecheck_assign_discards_qualifiers,
995 lhsType.getAsString(), rhsType.getAsString(),
996 lex->getSourceRange(), rex->getSourceRange());
997 break;
998 }
999 // C99 6.5.16p3: The type of an assignment expression is the type of the
1000 // left operand unless the left operand has qualified type, in which case
1001 // it is the unqualified version of the type of the left operand.
1002 // C99 6.5.16.1p2: In simple assignment, the value of the right operand
1003 // is converted to the type of the assignment expression (above).
1004 // C++ 5.17p1: the type of the assignment expression is that of its left oprdu.
1005 return hadError ? QualType() : lhsType.getUnqualifiedType();
1006}
1007
1008inline QualType Sema::CheckCommaOperands( // C99 6.5.17
1009 Expr *lex, Expr *rex, SourceLocation loc) {
1010 return UsualUnaryConversions(rex->getType());
1011}
1012
1013QualType Sema::CheckIncrementDecrementOperand(Expr *op, SourceLocation OpLoc) {
1014 QualType lhsType = op->getType(), rhsType = Context.IntTy;
1015 QualType resType = UsualArithmeticConversions(lhsType, rhsType);
1016 assert(!resType.isNull() && "no type for increment/decrement expression");
1017
1018 // C99 6.5.2.4p1
1019 if (const PointerType *pt = dyn_cast<PointerType>(resType)) {
1020 if (!pt->getPointeeType()->isObjectType()) { // C99 6.5.2.4p2, 6.5.6p2
1021 Diag(OpLoc, diag::err_typecheck_arithmetic_incomplete_type,
1022 resType.getAsString(), op->getSourceRange());
1023 return QualType();
1024 }
1025 } else if (!resType->isRealType()) {
1026 // FIXME: Allow Complex as a GCC extension.
1027 Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement,
1028 resType.getAsString(), op->getSourceRange());
1029 return QualType();
1030 }
1031 // At this point, we know we have a real or pointer type. Now make sure
1032 // the operand is a modifiable lvalue.
1033 Expr::isModifiableLvalueResult mlval = op->isModifiableLvalue();
1034 if (mlval != Expr::MLV_Valid) {
1035 // FIXME: emit a more precise diagnostic...
1036 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_incr_decr,
1037 op->getSourceRange());
1038 return QualType();
1039 }
1040 return resType;
1041}
1042
1043/// getPrimaryDeclaration - Helper function for CheckAddressOfOperand().
1044/// This routine allows us to typecheck complex/recursive expressions
1045/// where the declaration is needed for type checking. Here are some
1046/// examples: &s.xx, &s.zz[1].yy, &(1+2), &(XX), &"123"[2].
1047static Decl *getPrimaryDeclaration(Expr *e) {
1048 switch (e->getStmtClass()) {
1049 case Stmt::DeclRefExprClass:
1050 return cast<DeclRefExpr>(e)->getDecl();
1051 case Stmt::MemberExprClass:
1052 return getPrimaryDeclaration(cast<MemberExpr>(e)->getBase());
1053 case Stmt::ArraySubscriptExprClass:
1054 return getPrimaryDeclaration(cast<ArraySubscriptExpr>(e)->getBase());
1055 case Stmt::CallExprClass:
1056 return getPrimaryDeclaration(cast<CallExpr>(e)->getCallee());
1057 case Stmt::UnaryOperatorClass:
1058 return getPrimaryDeclaration(cast<UnaryOperator>(e)->getSubExpr());
1059 case Stmt::ParenExprClass:
1060 return getPrimaryDeclaration(cast<ParenExpr>(e)->getSubExpr());
1061 default:
1062 return 0;
1063 }
1064}
1065
1066/// CheckAddressOfOperand - The operand of & must be either a function
1067/// designator or an lvalue designating an object. If it is an lvalue, the
1068/// object cannot be declared with storage class register or be a bit field.
1069/// Note: The usual conversions are *not* applied to the operand of the &
1070/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.
1071QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) {
1072 Decl *dcl = getPrimaryDeclaration(op);
1073 Expr::isLvalueResult lval = op->isLvalue();
1074
1075 if (lval != Expr::LV_Valid) { // C99 6.5.3.2p1
1076 if (dcl && isa<FunctionDecl>(dcl)) // allow function designators
1077 ;
1078 else { // FIXME: emit more specific diag...
1079 Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof,
1080 op->getSourceRange());
1081 return QualType();
1082 }
1083 } else if (dcl) {
1084 // We have an lvalue with a decl. Make sure the decl is not declared
1085 // with the register storage-class specifier.
1086 if (const VarDecl *vd = dyn_cast<VarDecl>(dcl)) {
1087 if (vd->getStorageClass() == VarDecl::Register) {
1088 Diag(OpLoc, diag::err_typecheck_address_of_register,
1089 op->getSourceRange());
1090 return QualType();
1091 }
1092 } else
1093 assert(0 && "Unknown/unexpected decl type");
1094
1095 // FIXME: add check for bitfields!
1096 }
1097 // If the operand has type "type", the result has type "pointer to type".
1098 return Context.getPointerType(op->getType());
1099}
1100
1101QualType Sema::CheckIndirectionOperand(Expr *op, SourceLocation OpLoc) {
1102 QualType qType = UsualUnaryConversions(op->getType());
1103
1104 assert(!qType.isNull() && "no type for * expression");
1105
1106 if (PointerType *PT = dyn_cast<PointerType>(qType.getCanonicalType())) {
1107 QualType ptype = PT->getPointeeType();
1108 // C99 6.5.3.2p4. "if it points to an object,...".
1109 if (ptype->isIncompleteType()) { // An incomplete type is not an object
1110 // GCC compat: special case 'void *' (treat as warning).
1111 if (ptype->isVoidType()) {
1112 Diag(OpLoc, diag::ext_typecheck_deref_ptr_to_void,
1113 qType.getAsString(), op->getSourceRange());
1114 } else {
1115 Diag(OpLoc, diag::err_typecheck_deref_incomplete_type,
1116 ptype.getAsString(), op->getSourceRange());
1117 return QualType();
1118 }
1119 }
1120 return ptype;
1121 }
1122 Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer,
1123 qType.getAsString(), op->getSourceRange());
1124 return QualType();
1125}
1126
1127static inline BinaryOperator::Opcode ConvertTokenKindToBinaryOpcode(
1128 tok::TokenKind Kind) {
1129 BinaryOperator::Opcode Opc;
1130 switch (Kind) {
1131 default: assert(0 && "Unknown binop!");
1132 case tok::star: Opc = BinaryOperator::Mul; break;
1133 case tok::slash: Opc = BinaryOperator::Div; break;
1134 case tok::percent: Opc = BinaryOperator::Rem; break;
1135 case tok::plus: Opc = BinaryOperator::Add; break;
1136 case tok::minus: Opc = BinaryOperator::Sub; break;
1137 case tok::lessless: Opc = BinaryOperator::Shl; break;
1138 case tok::greatergreater: Opc = BinaryOperator::Shr; break;
1139 case tok::lessequal: Opc = BinaryOperator::LE; break;
1140 case tok::less: Opc = BinaryOperator::LT; break;
1141 case tok::greaterequal: Opc = BinaryOperator::GE; break;
1142 case tok::greater: Opc = BinaryOperator::GT; break;
1143 case tok::exclaimequal: Opc = BinaryOperator::NE; break;
1144 case tok::equalequal: Opc = BinaryOperator::EQ; break;
1145 case tok::amp: Opc = BinaryOperator::And; break;
1146 case tok::caret: Opc = BinaryOperator::Xor; break;
1147 case tok::pipe: Opc = BinaryOperator::Or; break;
1148 case tok::ampamp: Opc = BinaryOperator::LAnd; break;
1149 case tok::pipepipe: Opc = BinaryOperator::LOr; break;
1150 case tok::equal: Opc = BinaryOperator::Assign; break;
1151 case tok::starequal: Opc = BinaryOperator::MulAssign; break;
1152 case tok::slashequal: Opc = BinaryOperator::DivAssign; break;
1153 case tok::percentequal: Opc = BinaryOperator::RemAssign; break;
1154 case tok::plusequal: Opc = BinaryOperator::AddAssign; break;
1155 case tok::minusequal: Opc = BinaryOperator::SubAssign; break;
1156 case tok::lesslessequal: Opc = BinaryOperator::ShlAssign; break;
1157 case tok::greatergreaterequal: Opc = BinaryOperator::ShrAssign; break;
1158 case tok::ampequal: Opc = BinaryOperator::AndAssign; break;
1159 case tok::caretequal: Opc = BinaryOperator::XorAssign; break;
1160 case tok::pipeequal: Opc = BinaryOperator::OrAssign; break;
1161 case tok::comma: Opc = BinaryOperator::Comma; break;
1162 }
1163 return Opc;
1164}
1165
1166static inline UnaryOperator::Opcode ConvertTokenKindToUnaryOpcode(
1167 tok::TokenKind Kind) {
1168 UnaryOperator::Opcode Opc;
1169 switch (Kind) {
1170 default: assert(0 && "Unknown unary op!");
1171 case tok::plusplus: Opc = UnaryOperator::PreInc; break;
1172 case tok::minusminus: Opc = UnaryOperator::PreDec; break;
1173 case tok::amp: Opc = UnaryOperator::AddrOf; break;
1174 case tok::star: Opc = UnaryOperator::Deref; break;
1175 case tok::plus: Opc = UnaryOperator::Plus; break;
1176 case tok::minus: Opc = UnaryOperator::Minus; break;
1177 case tok::tilde: Opc = UnaryOperator::Not; break;
1178 case tok::exclaim: Opc = UnaryOperator::LNot; break;
1179 case tok::kw_sizeof: Opc = UnaryOperator::SizeOf; break;
1180 case tok::kw___alignof: Opc = UnaryOperator::AlignOf; break;
1181 case tok::kw___real: Opc = UnaryOperator::Real; break;
1182 case tok::kw___imag: Opc = UnaryOperator::Imag; break;
1183 case tok::kw___extension__: Opc = UnaryOperator::Extension; break;
1184 }
1185 return Opc;
1186}
1187
1188// Binary Operators. 'Tok' is the token for the operator.
1189Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
1190 ExprTy *LHS, ExprTy *RHS) {
1191 BinaryOperator::Opcode Opc = ConvertTokenKindToBinaryOpcode(Kind);
1192 Expr *lhs = (Expr *)LHS, *rhs = (Expr*)RHS;
1193
1194 assert((lhs != 0) && "ParseBinOp(): missing left expression");
1195 assert((rhs != 0) && "ParseBinOp(): missing right expression");
1196
1197 QualType ResultTy; // Result type of the binary operator.
1198 QualType CompTy; // Computation type for compound assignments (e.g. '+=')
1199
1200 switch (Opc) {
1201 default:
1202 assert(0 && "Unknown binary expr!");
1203 case BinaryOperator::Assign:
1204 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, QualType());
1205 break;
1206 case BinaryOperator::Mul:
1207 case BinaryOperator::Div:
1208 ResultTy = CheckMultiplyDivideOperands(lhs, rhs, TokLoc);
1209 break;
1210 case BinaryOperator::Rem:
1211 ResultTy = CheckRemainderOperands(lhs, rhs, TokLoc);
1212 break;
1213 case BinaryOperator::Add:
1214 ResultTy = CheckAdditionOperands(lhs, rhs, TokLoc);
1215 break;
1216 case BinaryOperator::Sub:
1217 ResultTy = CheckSubtractionOperands(lhs, rhs, TokLoc);
1218 break;
1219 case BinaryOperator::Shl:
1220 case BinaryOperator::Shr:
1221 ResultTy = CheckShiftOperands(lhs, rhs, TokLoc);
1222 break;
1223 case BinaryOperator::LE:
1224 case BinaryOperator::LT:
1225 case BinaryOperator::GE:
1226 case BinaryOperator::GT:
1227 ResultTy = CheckRelationalOperands(lhs, rhs, TokLoc);
1228 break;
1229 case BinaryOperator::EQ:
1230 case BinaryOperator::NE:
1231 ResultTy = CheckEqualityOperands(lhs, rhs, TokLoc);
1232 break;
1233 case BinaryOperator::And:
1234 case BinaryOperator::Xor:
1235 case BinaryOperator::Or:
1236 ResultTy = CheckBitwiseOperands(lhs, rhs, TokLoc);
1237 break;
1238 case BinaryOperator::LAnd:
1239 case BinaryOperator::LOr:
1240 ResultTy = CheckLogicalOperands(lhs, rhs, TokLoc);
1241 break;
1242 case BinaryOperator::MulAssign:
1243 case BinaryOperator::DivAssign:
1244 CompTy = CheckMultiplyDivideOperands(lhs, rhs, TokLoc);
1245 if (!CompTy.isNull())
1246 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1247 break;
1248 case BinaryOperator::RemAssign:
1249 CompTy = CheckRemainderOperands(lhs, rhs, TokLoc);
1250 if (!CompTy.isNull())
1251 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1252 break;
1253 case BinaryOperator::AddAssign:
1254 CompTy = CheckAdditionOperands(lhs, rhs, TokLoc);
1255 if (!CompTy.isNull())
1256 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1257 break;
1258 case BinaryOperator::SubAssign:
1259 CompTy = CheckSubtractionOperands(lhs, rhs, TokLoc);
1260 if (!CompTy.isNull())
1261 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1262 break;
1263 case BinaryOperator::ShlAssign:
1264 case BinaryOperator::ShrAssign:
1265 CompTy = CheckShiftOperands(lhs, rhs, TokLoc);
1266 if (!CompTy.isNull())
1267 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1268 break;
1269 case BinaryOperator::AndAssign:
1270 case BinaryOperator::XorAssign:
1271 case BinaryOperator::OrAssign:
1272 CompTy = CheckBitwiseOperands(lhs, rhs, TokLoc);
1273 if (!CompTy.isNull())
1274 ResultTy = CheckAssignmentOperands(lhs, rhs, TokLoc, CompTy);
1275 break;
1276 case BinaryOperator::Comma:
1277 ResultTy = CheckCommaOperands(lhs, rhs, TokLoc);
1278 break;
1279 }
1280 if (ResultTy.isNull())
1281 return true;
1282 if (CompTy.isNull())
1283 return new BinaryOperator(lhs, rhs, Opc, ResultTy);
1284 else
1285 return new CompoundAssignOperator(lhs, rhs, Opc, ResultTy, CompTy);
1286}
1287
1288// Unary Operators. 'Tok' is the token for the operator.
1289Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
1290 ExprTy *input) {
1291 Expr *Input = (Expr*)input;
1292 UnaryOperator::Opcode Opc = ConvertTokenKindToUnaryOpcode(Op);
1293 QualType resultType;
1294 switch (Opc) {
1295 default:
1296 assert(0 && "Unimplemented unary expr!");
1297 case UnaryOperator::PreInc:
1298 case UnaryOperator::PreDec:
1299 resultType = CheckIncrementDecrementOperand(Input, OpLoc);
1300 break;
1301 case UnaryOperator::AddrOf:
1302 resultType = CheckAddressOfOperand(Input, OpLoc);
1303 break;
1304 case UnaryOperator::Deref:
1305 resultType = CheckIndirectionOperand(Input, OpLoc);
1306 break;
1307 case UnaryOperator::Plus:
1308 case UnaryOperator::Minus:
1309 resultType = UsualUnaryConversions(Input->getType());
1310 if (!resultType->isArithmeticType()) // C99 6.5.3.3p1
1311 return Diag(OpLoc, diag::err_typecheck_unary_expr,
1312 resultType.getAsString());
1313 break;
1314 case UnaryOperator::Not: // bitwise complement
1315 if (Input->getType()->isVectorType())
1316 resultType = Input->getType();
1317 else {
1318 resultType = UsualUnaryConversions(Input->getType());
1319 if (!resultType->isIntegerType()) // C99 6.5.3.3p1
1320 return Diag(OpLoc, diag::err_typecheck_unary_expr,
1321 resultType.getAsString());
1322 }
1323 break;
1324 case UnaryOperator::LNot: // logical negation
1325 // Unlike +/-/~, integer promotions aren't done here (C99 6.5.3.3p5).
1326 resultType = DefaultFunctionArrayConversion(Input->getType());
1327 if (!resultType->isScalarType()) // C99 6.5.3.3p1
1328 return Diag(OpLoc, diag::err_typecheck_unary_expr,
1329 resultType.getAsString());
1330 // LNot always has type int. C99 6.5.3.3p5.
1331 resultType = Context.IntTy;
1332 break;
1333 case UnaryOperator::SizeOf:
1334 resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, true);
1335 break;
1336 case UnaryOperator::AlignOf:
1337 resultType = CheckSizeOfAlignOfOperand(Input->getType(), OpLoc, false);
1338 break;
1339 case UnaryOperator::Extension:
1340 // FIXME: does __extension__ cause any promotions? I would think not.
1341 resultType = Input->getType();
1342 break;
1343 }
1344 if (resultType.isNull())
1345 return true;
1346 return new UnaryOperator(Input, Opc, resultType, OpLoc);
1347}
1348
1349/// ParseAddrLabel - Parse the GNU address of label extension: "&&foo".
1350Sema::ExprResult Sema::ParseAddrLabel(SourceLocation OpLoc,
1351 SourceLocation LabLoc,
1352 IdentifierInfo *LabelII) {
1353 // Look up the record for this label identifier.
1354 LabelStmt *&LabelDecl = LabelMap[LabelII];
1355
1356 // If we haven't seen this label yet, create a forward reference.
1357 if (LabelDecl == 0)
1358 LabelDecl = new LabelStmt(LabLoc, LabelII, 0);
1359
1360 // Create the AST node. The address of a label always has type 'void*'.
1361 return new AddrLabel(OpLoc, LabLoc, LabelDecl,
1362 Context.getPointerType(Context.VoidTy));
1363}
1364