- May 23, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Added "global" statistics gathering for Decls/Stmts/Exprs. Very useful for working with a single file. When we start compiling multiple files, will need to enhance this to collect stats on a per-module basis. llvm-svn: 39485
-
Bill Wendling authored
Submitted by: Bill Wendling Reviewed by: Chris Lattner - Changed "std::cerr" to "OS" stream to be consistent with the other outputs in the method. llvm-svn: 39483
-
- May 21, 2007
-
-
Chris Lattner authored
llvm-svn: 39477
-
Chris Lattner authored
llvm-svn: 39476
-
Chris Lattner authored
integer constants, whoa! :) llvm-svn: 39475
-
Chris Lattner authored
and correctly in terms of C99 6.4.4.1p5. llvm-svn: 39473
-
Chris Lattner authored
llvm-svn: 39472
-
Chris Lattner authored
llvm-svn: 39469
-
Chris Lattner authored
void foo() { abc: def: hij: case 1: case 1: goto abc baz: goto def } instead of: void foo() { abc: def: hij: case 1: case 1: goto abc baz: goto def } llvm-svn: 39468
-
Chris Lattner authored
llvm-svn: 39467
-
- May 20, 2007
-
-
Steve Naroff authored
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
-
Steve Naroff authored
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
-
Chris Lattner authored
llvm-svn: 39461
-
- May 19, 2007
-
-
Chris Lattner authored
llvm-svn: 39457
-
Steve Naroff authored
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
-
- May 18, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: More tweaks to error diagnostics (adding types, using the new hooks on expr). Still more to do... llvm-svn: 39455
-
Steve Naroff authored
Submitted by: Reviewed by: Extended Expr's constant expression predicates to return a source location if the predicate returns false. This enables us to position the cursor exactly were the error occurred (simple pleasures:-). constant.c:9:9: error: enumerator value for 'E2' is not an integer constant E2 = (aconst + 1), // illegal ^ constant.c:10:8: error: enumerator value for 'E3' is not an integer constant E3 = "abc", ^ constant.c:12:12: error: enumerator value for 'E5' is not an integer constant E5 = 0?7:printf("xx"), // illegal ^ constant.c:13:12: error: enumerator value for 'E6' is not an integer constant E6 = 1?7:printf("xx"), // legal ^ constant.c:16:14: error: enumerator value for 'E9' is not an integer constant E9 = E0 || a, // illegal ^ constant.c:21:6: error: array has incomplete element type 'void' void ary[7]; ^ constant.c:22:28: error: variable length array declared outside of any function struct { int a; } ary2[1?7:printf("xx")], ^ constant.c:23:34: error: variable length array declared outside of any function aryIllegal[0?7:printf("yy")]; ^ constant.c:25:10: error: variable length array declared outside of any function int ary3[a]; // illegal ^ constant.c:26:17: error: size of array has non-integer type 'float' typedef int vla[2.0]; // illegal ^ constant.c:30:22: error: size of array has non-integer type 'float' int nonIntegerArray2[1+2.0]; ^ llvm-svn: 39454
-
- May 17, 2007
-
-
Steve Naroff authored
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
-
Steve Naroff authored
Submitted by: Reviewed by: - Added a getSourceRange() method to all subclasses of Expr. - Changed all the constructors and instantiators. - Only added SourceLocations's when necessary. For example, binary expression *don't* carry the operator location...it isn't necessary to implement getSourceRange(). On the other hand, unary expressions *do* carry the operator location. - Added trivial SourceRange value class to SourceLocation. Note: need to talk to Chris about the FIXME for StringLiteral... llvm-svn: 39452
-
- May 16, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: - Implement type checking for Sema::CheckConditionalOperands. - Fixed crasher in Sema::UsualUnaryConversion (incorrect use of cast<>). - Added a few diagnostics and started passing 2 args! (Thanks Chris!). Here's some diagnostic output that is much nicer than gcc... [dylan:~/llvm/tools/clang] admin% ../../Debug/bin/clang cond.c cond.c:12:14: error: used type 'struct foo' where arithmetic or pointer type is required result = s ? 1 : 2; ^ cond.c:13:14: error: incompatible operand types ('struct foo' and 'struct bar') result = a ? s : s2; ^ cond.c:14:14: warning: pointer type mismatch ('struct foo *' and 'struct bar *') result = a ? ps : ps2; ^ cond.c:14:10: warning: assignment makes integer from pointer without a cast result = a ? ps : ps2; ^ cond.c:15:14: error: incompatible operand types ('struct foo *' and 'struct foo') result = a ? ps : s; ^ cond.c:16:14: warning: pointer type mismatch ('void (*)(int)' and 'void (*)(int, int)') result = a ? func : func2; ^ cond.c:16:10: warning: assignment makes integer from pointer without a cast result = a ? func : func2; ^ 7 diagnostics generated. [dylan:~/llvm/tools/clang] admin% cc -c cond.c cond.c: In function 'main': cond.c:12: error: used struct type value where scalar is required cond.c:13: error: type mismatch in conditional expression cond.c:14: warning: pointer type mismatch in conditional expression cond.c:14: warning: assignment makes integer from pointer without a cast cond.c:15: error: type mismatch in conditional expression cond.c:16: warning: pointer type mismatch in conditional expression cond.c:16: warning: assignment makes integer from pointer without a cast llvm-svn: 39451
-
Chris Lattner authored
the version that takes a string. llvm-svn: 39450
-
Chris Lattner authored
QualType::getAsString() that returns a string, which is much easier for clients to use. Convert clients to use it. llvm-svn: 39449
-
Chris Lattner authored
llvm-svn: 39448
-
- May 15, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: - Unified isConstantExpr/isIntegerConstantExpr by creating a private function named isConstantExpr (that takes a bool to indicate the flavor). isConstantExpr and isIntegerConstantExpr are now inline wrapper/helper functions. - Fixed bug in expression based sizeof (it needed to make sure the type is constant). - Added Sema::CheckConditionalOperands() stub. Will add contraints in my next commit. llvm-svn: 39446
-
Steve Naroff authored
Submitted by: Reviewed by: - Completed Expr::isConstantExpr() and Expr::isIntegerConstantExpr(). - Completed Sema::ParseUnaryOp(), it lacked support for sizeof/alignof. - Added Sema::CheckSizeOfAlignOfOperand(), used by ParseUnaryOp/ParseSizeOfAlignOfTypeExpr. - Fixed a couple bugs in CheckRelationalOperands/CheckEqualityOperands (make sure extensions aren't treated as errors). - Changed a bunch of predicates (in BinaryOperator/UnaryOperator) to member functions (the static members weren't being used). - Added UnaryOperator::isIncrementDecrementOp/isSizeOfAlignOfOp. llvm-svn: 39445
-
- May 14, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Some minor cleanup (comments, spec refs, simplied some expressions). llvm-svn: 39444
-
Steve Naroff authored
Submitted by: Reviewed by: Fixed a bug in Sema::CheckAddressOfOperand(). It was (incorrectly) using isModifiableLvalue() instead of isLvalue(). This motivated me to (finally) cleanup methods surrounding lsLvalue/isModifiableLvalue. Cleanup involved: - adding Expr::isLvalue(). - modified Expr::isModifiableLvalue() to use Expr::isLvalue(). - removed Type::isLvalue(), Type::isModifiableLvalue(), and QualType::isModifiableLvalue(). They were confusing...the respective logic is now a part of the Expr member functions... - also added some comments and spec references, since these methods are so central to expressions working properly. llvm-svn: 39443
-
- May 13, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Two bug fixes to CheckIncrementDecrementOperand: - removed "constantOne" usage and simply use Context.IntTy. - fix the last constraint check...the lvalue test needs to be on the expression, not the type! (duh). llvm-svn: 39442
-
- May 12, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Removed a couple superflous checks from typesAreCompatible. Moved the spec references up to a comment. llvm-svn: 39441
-
Steve Naroff authored
Submitted by: Reviewed by: This check-in should finally "nail" complex pointer assignments (involving qualifiers, etc.). - Replaced pointerTypeQualifiersAlign() with CheckPointerTypesForAssignment() This also simplified UsualAssignmentConversions(). - Fixed Type::pointerTypesAreCompatible() and Type::typesAreCompatible() to closely reflect the spec. They were (unfortunately) compensating for some of the missing logic in the assignment checking code. llvm-svn: 39440
-
- May 11, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: - Enhanced UsualAssignmentConversions() to properly handle type qualifiers on pointers. - Added helper function Sema::pointerTypeQualifiersAlign(). - Noticed several errors improperly named "ext_" (fixed). - Combined structureTypesAreCompatible/unionTypesAreCompatible into tagTypesAreCompatible. - Renamed Type::getCanonicalType() to Type::getCanonicalTypeInternal(). It will never confuse/bite me again:-) - Added a couple extension diagnostics for discarded type qualifiers. llvm-svn: 39439
-
- May 09, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Fix a couple bugs in ParseCallExpr(). - check isVariadic(). - make sure an AST isn't created if the number of args don't match but the types do! - rename "n" to something more descriptive:-) llvm-svn: 39438
-
- May 08, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: - Added Sema::isConstantArrayType() and Type::isConstantSizeType(). - Implemented type checking for "variably modified" types (i.e. VLA's). Added checking for file scope variables, static variables, member variables, and typedefs. - Changed Expr::isIntegerConstantExpr() to non-virtual implementation. Fixed bug with sizeof/alignof. Looking at the diff, I may need to add a check to exclude alignof. - Added Expr::isConstantExpr()...non-virtual, like above. - Added typechecking for case statements (found a bug with actions/parsing...). - Added several diagnostics. - Fixed several comments. Started implemented constant expression checking for arrays. llvm-svn: 39437
-
- May 07, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Start work on typechecking constant expressions. - Added isIntegerConstantExpr() predicate to all exprs. - Use the predicate to implement checking for enum constant initializers. - Added diagnostic. - Added Init slot to EnumConstantDecl class/constructor. llvm-svn: 39436
-
Steve Naroff authored
Submitted by: Reviewed by: - Unified CheckSimpleAssignmentOperands/CheckCompoundAssignmentOperands into one function, named CheckAssignmentOperands. One less function to maintain. - Converted the unary check functions (ParseUnaryOp and friends) to have the same API as their binary counterparts. - Implemented CheckIndirectionOperand (was stubbed). While testing, noticed that Expr::isModifiableLvalue was incomplete (fixed and referenced draft). - Added constantOne instance variable to Sema. - Removed CheckArithmeticOperand (the code was so simple that it is now part of ParseUnaryOp). The name wasn't great anyway:-) llvm-svn: 39435
-
- May 04, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Implemented type checking for compound assignments (*=, /=, etc.). This encouraged me to do a fairly dramatic refactoring of the Check* functions. (since I wanted to reuse the existing work, rather than duplicate the logic). For example, I changed all the Check* functions to return a QualType (instead of returning an Expr). This had a very nice side benefit...there is now only one instantiation point for BinaryOperator()! (A property I've always wanted...separating type checking from AST building is *much* nicer). Another change is to remove "code" from all the Check* functions (this allowed me to remove the weird comment about enums/unsigned:-). Removing the code forced me to add a few functions, however. For example, < ExprResult CheckAdditiveOperands( // C99 6.5.6 < Expr *lex, Expr *rex, SourceLocation OpLoc, unsigned OpCode); > inline QualType CheckAdditionOperands( // C99 6.5.6 > Expr *lex, Expr *rex, SourceLocation OpLoc); > inline QualType CheckSubtractionOperands( // C99 6.5.6 > Expr *lex, Expr *rex, SourceLocation OpLoc); While this isn't as terse, it more closely reflects the differences in the typechecking logic. For example, I disliked having to check the code again in CheckMultiplicativeOperands/CheckAdditiveOperands. Created the following helper functions: - Expr::isNullPointerConstant(). - SemaExpr.cpp: static inline BinaryOperator::Opcode ConvertTokenKindToBinaryOpcode(). This was purely asethetic, since ParseBinOp() is now larger. I didn't feel like looking at 2 huge switch statements. ParseBinOp() now avoids using any of the BinaryOperator predicates (since I switched to a switch statement:-) Only one regret (minor). I couldn't figure out how to avoid having two assign functions, CheckCompoundAssignmentOperands, CheckSimpleAssignmentOperands. Conceptually, the two functions make sense. Unfortunately, their implementation contains a lot of duplication (thought they aren't that be in the first place). llvm-svn: 39433
-
- May 03, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Work on finishing up typechecking for simple assignments (=) and function calls. Here is an overview: - implemented type checking for function calls (in Sema::ParseCallExpr). - refactored UsualAssignmentConversions to return the result of the conversion. This enum will allow all clients to emit different diagnostics based on context. - fixed bug in Expr::isLvalue()...it wasn't handling arrays properly. Also changed the name to isModifiableLvalue, which is consistent with the function on QualType. - Added 6 diagnostics (3 errors, 3 extensions). llvm-svn: 39432
-
Steve Naroff authored
Submitted by: Reviewed by: More refinements to UsualAssignmentConversions(). Added a call to do the UsualUnaryConversion for arrays/functions. I believe this is correct (but subtle). This enabled me to remove code for dealing with arrays/functions explictly (which more closely reflects the spec). llvm-svn: 39431
-
- May 02, 2007
-
-
Steve Naroff authored
Submitted by: Reviewed by: Refactored assignment conversion code. - added Sema::UsualAssignmentConversions(). It will service simple assignment, argument passing, initialization, and return. - simplified Sema::CheckAssignmentOperands() using the previous function. llvm-svn: 39429
-
Steve Naroff authored
Submitted by: Reviewed by: - implement Type::functionTypesAreCompatible(). - fix bug in Sema::CheckAssignmentOperands(). Spec allows any pointer type to be assigned to _Bool. llvm-svn: 39428
-