summaryrefslogtreecommitdiffstats
path: root/clang/Sema/SemaExpr.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* Refactor code so that isIntegerConstantExpr has an ASTContext available.Chris Lattner2007-07-151-8/+9
| | | | llvm-svn: 39884
* This is the final step/commit for implementing exlicit implicit casts. ↵Steve Naroff2007-07-151-22/+41
| | | | | | | | | | | | | Unlike the previous two checkins, which involved lot's of tedious refactoring, this checkin is nice and clean:-) - Hacked UsualUnaryConversions, UsualArithmeticConversions, and DefaultFunctionArrayConversion to create the AST node (using a helper function promoteExprToType). - Added a setType method to Expr. - Changed Expr::isIntegerConstantExpr to allow for the new node. llvm-svn: 39866
* A significant refactoring of the type size stuff to also Chris Lattner2007-07-141-5/+6
| | | | | | compute type alignment. This info is needed for struct layout. llvm-svn: 39850
* More changes related to implementing ImplicitCastExpr.Steve Naroff2007-07-131-36/+64
| | | | | | | | | | | | | | - Fixed a recent regression discovered by Keith Bauer (thanks!). The fix involved adding (back) two arguments to UsualArithmeticConversions. Without the reference arguments, no unary conversions were being passed back to the caller. This had the effect of turning off the UsualUnaryConversions. - Refactored CheckAssignmentConstraints into 3 functions. CheckAssignmentConstraints, CheckSingleAssignmentConstraints, and CheckCompoundAssignmentConstraints. - Changed the argument type of DefaultFunctionArrayConversion from QualType->Expr*&. - Removed a bunch of casts in routines I was working on (cleanup). - Fixed the visitor for ImplicitCastExpr (oops). llvm-svn: 39840
* Removed some superfluous code. The getType() method and associatedSteve Naroff2007-07-131-11/+3
| | | | | | assert is now done in UsualUnaryConversions(). llvm-svn: 39818
* Add (explicit) AST support for implicit casts. This should simplify the Steve Naroff2007-07-131-81/+82
| | | | | | | | | | | | | | | | | | | code generator. Source translation tools can simply ignore this node. - Added a new Expr node, ImplicitCastExpr. - Changed UsualUnaryConversions/UsualArithmeticConversions to take references to Expr *'s. This will allow these routines to instantiate the new AST node and pass it back. - Changed all clients of UsualUnary/UsualArithmetic (lot's of diff's). - Changed some names in CheckConditionalOperands. Several variables where only distinguished by their case (e.g. Cond, cond). Yuck (what was I thinking). - Removed an old/crufty constructor in CastExpr (cleanup). This check-in does not actually create the new AST node. I wanted to separate the mechanical changes from the semantic changes. In addition, I need to coordinate with Chris, since the semantic change will break the code generator. llvm-svn: 39814
* Implement codegen for + and - with pointers. Patch contributed by Chris Lattner2007-07-131-2/+3
| | | | | | Keith Bauer. llvm-svn: 39793
* Two changes...Steve Naroff2007-07-121-8/+4
| | | | | | | | | | | | | | | | | | | | | | | | - Teach all the integer/float predicates on Type about Vectors. - Disallow bitwise compliment on float vectors. For example... typedef float __attribute__(( vector_size(16) )) float4; float4 float4_return() { float4 xx; return ~xx; } ...now emits the following diagnostic... [administrators-powerbook59:~/llvm/tools/clang] admin% ../../Debug/bin/clang bug.c bug.c:8:12: error: invalid argument type to unary expression 'float4' return ~xx; ^ 1 diagnostic generated. llvm-svn: 39791
* Fix a release build of clang.Chris Lattner2007-07-111-1/+1
| | | | llvm-svn: 39756
* Bug #:Steve Naroff2007-07-101-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: Two vector fixes: - Sema::CheckAssignmentConstraints() needs to compare the canonical type. - Expr::isLvalue() needs to disallow subscripting into a vector returned by a function. This follows the rules for struct returns (in C, at least...C++ is another story:-) Here is an example... float4 float4_return() { float4 xx; return xx; } void add_float4_void_return(float4 *a, float4 *b, float4 *result) { float f; float4_return()[1] = f; // now illegal } llvm-svn: 39728
* Bug #:Steve Naroff2007-07-101-15/+23
| | | | | | | | | | | | | Submitted by: Reviewed by: Support the following... 1. Type checking and codegen support for V[i] on vectors. Hacked Sema::ParseArraySubscriptExpr(). 2. Unary bitwise complement ("~") on vectors. Hacked Sema::ParseUnaryOp(). llvm-svn: 39723
* Bug #:Steve Naroff2007-07-091-2/+3
| | | | | | | | Submitted by: Reviewed by: Added primitive support for 32-bit floating point literals. llvm-svn: 39719
* Bug #:Steve Naroff2007-07-091-2/+30
| | | | | | | | | | | | | | | Submitted by: Reviewed by: Typechecking support for vectors... - Added CheckVectorOperands(). Called from CheckAdditionOperands, CheckMultiplyDivideOperands, CheckSubstractionOperands, and CheckBitwiseOperands. - Added diagnostic for converting vector values of different size. - Modified Type::isArithmeticType to include vectors. Sould be ready for Chris to add code generation. I will continue testing/refining. llvm-svn: 39717
* Bug #:Steve Naroff2007-07-061-3/+4
| | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: - Finished semantic analysis for vectors, added some diagnostics. - Added AST for vectors (instantiation, installation into the decl). - Fixed bug in ParseArraySubscriptExpr()...this crasher was introduced by me when we added the range support. - Turned pedantic off by default. Since vectors are gcc extensions, having pedantic on by default was annoying. Turning it off by default is also consistent with gcc (but this wasn't my primary motivation). - Tweaked some comments and diagnostics. Note: The type checking code is still under construction (for vectors). This will be my next check-in. llvm-svn: 39715
* Rename ArithAssignBinaryOperator -> CompoundAssignOperator, implementChris Lattner2007-06-291-1/+1
| | | | | | codegen support for +=. llvm-svn: 39710
* Record the intermediate computation type for compound assignments in the AST.Chris Lattner2007-06-281-38/+36
| | | | | | | | | | | | | For example, for: int test(short S, long L) { return S /= L; } record that the division is done as a long, even though the result type is short. llvm-svn: 39700
* Finally bite the bullet and make the major change: split the clang namespaceChris Lattner2007-06-151-6/+6
| | | | | | | | | | | | | out of the llvm namespace. This makes the clang namespace be a sibling of llvm instead of being a child. The good thing about this is that it makes many things unambiguous. The bad things is that many things in the llvm namespace (notably data structures like smallvector) now require an llvm:: qualifier. IMO, libsystem and libsupport should be split out of llvm into their own namespace in the future, which will fix this issue. llvm-svn: 39659
* Bug #:Steve Naroff2007-06-131-11/+32
| | | | | | | | | | Submitted by: Reviewed by: Fix CheckRelationalOperands/CheckEqualityOperands to deal with null pointer constants. The new logic also deals (more) correctly for non-pointer/integer operands. llvm-svn: 39654
* Bug #:Steve Naroff2007-06-131-10/+17
| | | | | | | | | | | | | | Submitted by: Reviewed by: Fixed typechecking bugs wrt UsualUnaryConversions. Includes two distinct fixes: #1: Call UsualUnaryConversions in CheckRelationalOperands/CheckEqualityOperands. #2: UsualArithmeticConversions arguments are now output parameters. This insures the implicit conversion is seen by clients (and fixes bugs in CheckAdditionOperands and CheckSubtractionOperands when doing pointer arithmetic). ~ llvm-svn: 39649
* Bug #:Steve Naroff2007-06-091-21/+26
| | | | | | | | | | Submitted by: Reviewed by: Lot's of attribute scaffolding. Modernized ParseArraySubscriptExpr...call DefaultFunctionArrayConversion (which simplified the logic considerably) and upgrade Diags to use the range support. llvm-svn: 39628
* factor casts together, add a case for __extension__Chris Lattner2007-06-081-12/+15
| | | | llvm-svn: 39620
* add missing caseChris Lattner2007-06-081-1/+1
| | | | llvm-svn: 39619
* Bug #:Steve Naroff2007-06-061-33/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: The following code illustrates a bug in the semantic analysis for assignments: int func() { int *P; char *x; P = x; // type of this assignment expression should be "int *", NOT "char *". } While the type checking/diagnostics are correct, the type of the assignment expression is incorrect (which shows up during code gen). With the fix, the llvm code looks correct... [dylan:~/llvm/tools/clang] admin% ../../Debug/bin/clang cast.c -emit-llvm cast.c:4:5: warning: incompatible pointer types assigning 'char *' to 'int *' P = x; // type of assignment expression is "int *", NOT "char *". ~ ^ ~ ; ModuleID = 'foo' define i32 @func() { entry: %P = alloca i32* ; <i32**> [#uses=1] %x = alloca i8* ; <i8**> [#uses=1] %allocapt = bitcast i32 undef to i32 ; <i32> [#uses=0] %tmp = load i8** %x ; <i8*> [#uses=1] %conv = bitcast i8* %tmp to i32* ; <i32*> [#uses=1] store i32* %conv, i32** %P ret i32 undef } Even though the fix was simple, I decided to rename/refactor the surrounding code to make a clearer distinction between constraint checking and conversion. - Renamed AssignmentConversionResult -> AssignmentCheckResult. - Renamed UsualAssignmentConversions -> CheckAssignmentConstraints. - Changed the return type of CheckAssignmentConstraints and CheckPointerTypesForAssignment from QualType -> AssignmentCheckResult. These routines no longer take a reference to the result (obviously). - Changed CheckAssignmentOperands to return the correct type (with spec annotations). llvm-svn: 39601
* On bogus code like this:Chris Lattner2007-06-061-2/+14
| | | | | | | | | | | | | | | | | | | | | int *P2; P2(1, 2, 3); register short X; X(); emit: ds.c:10:3: error: called object is not a function or function pointer P2(1, 2, 3); ^~~~~~~~~~~ ds.c:13:3: error: called object is not a function or function pointer X(); ^~~ instead of aborting. llvm-svn: 39599
* Fix semantic analysis of calls on stuff like:Chris Lattner2007-06-061-2/+4
| | | | | | | | | | int func() { int (*FP)(); FP(); (*****FP)(); } llvm-svn: 39598
* implement codegen of string literals.Chris Lattner2007-06-061-1/+0
| | | | llvm-svn: 39597
* add some fixme's for incorrect semaChris Lattner2007-06-051-0/+3
| | | | llvm-svn: 39591
* Bug #:Steve Naroff2007-06-041-22/+26
| | | | | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: Fixed an "impurity" in the typechecking code (to more closely model the C99 spec)... - Added function Sema::DefaultFunctionArrayConversion(). This is called by UsualUnaryConversions(). It is also called from several contexts that don't call for integer promotions (logical negation for expressions, and while/if/do/for conditions in statements). It is also used in UsualAssignmentConversions (which is cleaner than the check I was using before). - Changed the name from UsualUnaryConversion->UsualUnaryConversions. - Added comments to the header. Since several contexts don't call for integer promotions, llvm-svn: 39581
* Fix a fixme, produce diagnostics like this:Chris Lattner2007-06-021-6/+8
| | | | | | | | ds.c:11:16: error: case label does not reduce to an integer constant case 0 ? 0 : foo(): ~~~~~~~~^~~~~ llvm-svn: 39574
* Submitted by: Bill WendlingBill Wendling2007-06-021-0/+5
| | | | | | | | | Reviewed by: Chris Lattner - If the LHS and/or RHS is a reference, then see if they're compatible. If so, the type is that of the LHS. llvm-svn: 39568
* When a function decays into its address, ensure the result type keeps anyChris Lattner2007-06-021-1/+1
| | | | | | typedef information associated with the input. llvm-svn: 39562
* Correct the type of logical not.Chris Lattner2007-06-021-0/+2
| | | | llvm-svn: 39558
* Bug #:Steve Naroff2007-05-301-2/+2
| | | | | | | | | | | | Submitted by: Reviewed by: - ParseForStatement(): Put back a test/assignment. My removal of ParseExprStmt() was a bit over zealous:-(thanks to Chris for pointing it out) - Add assert to VisitDeclStmt(). - Removed an out-of-date FIXME - Added some curlies for a couple multi-line calls to Diag(). llvm-svn: 39528
* Submitted by: Bill WendlingBill Wendling2007-05-301-5/+5
| | | | | | Comment format changes. llvm-svn: 39527
* Bug #:Steve Naroff2007-05-301-11/+13
| | | | | | | | | | Submitted by: Reviewed by: - Many tweaks to various diagnostics. - Fixed some location/range issues. - Bug fix to Sema::ParseDeclStmt() - error return code is "true", not 0. llvm-svn: 39526
* Bug #:Steve Naroff2007-05-301-26/+24
| | | | | | | | | | | | | Submitted by: Reviewed by: Unified the diagnostics for function calls. Since we have range support, there is no need for including the argument number. Instead, I've made the diags more expressive by including more type info. Also improved the indentation of many calls to Diag (which can be 2-3 lines now). llvm-svn: 39523
* Bug #:Steve Naroff2007-05-291-28/+16
| | | | | | | | | | | Submitted by: Reviewed by: - Finished Sema::ParseReturnStmt(). Still need to tweak ranges. - Tweaked location for function arguments (they now point at the expression directly, no parens or commas). - Added InvalidOperands helper...was sick of looking at the same 3 lines in ~9 Check functions. - Added a few diags and moved a group of statement diags to the proper comment/category. llvm-svn: 39517
* Bug #:Steve Naroff2007-05-281-3/+6
| | | | | | | | Submitted by: Reviewed by: Add range support to Sema::CheckConditionalOperands(). llvm-svn: 39514
* Bug #:Steve Naroff2007-05-281-14/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: Refine Sema::ParseCallExpr() diags (range support, add types). Before: func-assign.c:27:11: warning: passing argument 1 from incompatible pointer type pintFunc(&FOO); ^ func-assign.c:28:12: error: incompatible type for argument 1 floatFunc(&FOO); ^ func-assign.c:29:12: error: too many arguments to function floatFunc(1,2,3); ^ After: func-assign.c:27:11: warning: passing incompatible pointer 'struct foo *' to function expecting 'int *' pintFunc(&FOO); ~~~~~~~~^~~~~ func-assign.c:28:12: error: passing incompatible type 'struct foo *' to function expecting 'float' floatFunc(&FOO); ~~~~~~~~~^~~~~ func-assign.c:29:12: error: too many arguments to function floatFunc(1,2,3); ~~~~~~~~~^ ~ llvm-svn: 39513
* Bug #:Steve Naroff2007-05-281-5/+18
| | | | | | | | | Submitted by: Reviewed by: - Implement FIXME in Sema::CheckIndirectionOperand(). - Added "const" to FunctionDecl::getResultType(). llvm-svn: 39512
* implement full sema support for the GCC address-of-label extension.Chris Lattner2007-05-281-1/+17
| | | | llvm-svn: 39510
* Bug #:Steve Naroff2007-05-271-17/+45
| | | | | | | | | | | | | | | | Submitted by: Reviewed by: - Added type checking to Sema::ParseReturnStmt (still under construction). - Improved Expr::isLvalue() and Expr::isModifiableLvalue() to return more info. Used the info in Sema::CheckAssignmentOperands() to produce more descriptive diagnostics. Added FIXME to other clients of isLvalue()/etc. - Added a SourceLocation slot to MemberExpr...changed the implementation of getSourceRange(). - Added getResultType() helper to FunctionDecl. - Changed many Diag calls to use the SourceRange support (now that it's a big hit...we better milk it:-). llvm-svn: 39501
* Bug #:Steve Naroff2007-05-221-2/+2
| | | | | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: One bug compiling "Carbon.h" on Leopard, one diagnostic tweak. - CheckIndirectionOperand wasn't operating on the canonical type (so it was complaining about typedef names). - The diagnostic was less than great. Here's what is was: [dylan:~/llvm/tools/clang] admin% ../../Debug/bin/clang t.c t.c:4:3: error: invalid argument type to unary expression 'int' *p; ^~ And here's what I changed it to... snaroff:clang naroff$ ../../Debug/bin/clang bug.c bug.c:5:3: error: indirection requires a pointer ('int' operand invalid) *p; ^~ llvm-svn: 39481
* Implement Sema::ParseNumericConstant for integer constants in terms of APIntChris Lattner2007-05-211-21/+77
| | | | | | and correctly in terms of C99 6.4.4.1p5. llvm-svn: 39473
* Bug #:Steve Naroff2007-05-201-5/+5
| | | | | | | | | Submitted by: Reviewed by: Bozo bug in last checkin. Needed to move the check for null pointers up (and out of the pointer/pointer clause). llvm-svn: 39466
* Bug #:Steve Naroff2007-05-201-4/+5
| | | | | | | | | | | | | | | | Submitted by: Reviewed by: Fix two bugs... - Sema::CheckConditionalOperands(). Needed to move the check for null pointer constants up to the clause dealing with two pointers types. The previous code would never get executed. - Expr::isNullPointerConstant(). This predicate was much too naive...it should have had a FIXME (my bad). It now deals with "void *" cast expressions. It still has one major bug...it needs to evaluate the expression to correctly determine if it is a null pointer constant (e.g. 7-7 should pass). llvm-svn: 39464
* fix some indentation funkinessChris Lattner2007-05-191-25/+24
| | | | llvm-svn: 39457
* Bug #:Steve Naroff2007-05-181-29/+37
| | | | | | | | | | | | | | | | | | | | Submitted by: Reviewed by: An important, but truly mind numbing change. Added 6 flavors of Sema::Diag() that take 1 or two SourceRanges. Considered adding 3 flavors (using default args), however this wasn't as clear. Removed 2 flavors of Sema::Diag() that took LexerToken's (they weren't used). Changed all the typechecking routines to pass the appropriate range(s). Hacked the diagnostic machinery and driver to acccommodate the new data. What's left? A FIXME in clang.c to use the ranges. Chris offered to do the honors:-) Which includes taking us to the end of an identifier:-) llvm-svn: 39456
* Bug #:Steve Naroff2007-05-181-18/+28
| | | | | | | | | Submitted by: Reviewed by: More tweaks to error diagnostics (adding types, using the new hooks on expr). Still more to do... llvm-svn: 39455
* Bug #:Steve Naroff2007-05-171-3/+4
| | | | | | | | | | | | | | | | | Submitted by: Reviewed by: Refinements to the SourceRange/SourceLocation work. - Renamed Expr::getSourceLocation() helper function to getLocStart(). Added Expr::getLocEnd(). Converted all the getSourceRange() methods to use the new helpers. - Removed many getSourceLocation() accessors. The Expr::getLocStart() helper is the "right" way to get a source location. If we want to add class specific getters (for location), then the names should be reflective of the specific class. For examaple, UnaryOperator::getOpLocation(). For now, I see no reason to have these. - Fixed StringLiteral. - Start actually instantiating ParenExpr()! llvm-svn: 39453
OpenPOWER on IntegriCloud