- May 21, 2007
-
-
Chris Lattner authored
llvm-svn: 39478
-
Chris Lattner authored
llvm-svn: 39477
-
Chris Lattner authored
llvm-svn: 39476
-
Chris Lattner authored
integer constants, whoa! :) llvm-svn: 39475
-
Chris Lattner authored
where the parser emitted bogus diagnostics. Before, when compiling: struct A { int X; } someA; int func(int, struct A); int test1(void *P, int C) { return func(((C*40) + *P) / 42+P, someA); } we emitted: bug3.c:7:25: error: invalid operands to binary expression ('int' and 'void') return func(((C*40) + *P) / 42+P, someA); ~~~~~~ ^ ~~ bug3.c:7:31: error: expected ')' return func(((C*40) + *P) / 42+P, someA); ^ bug3.c:7:16: error: to match this '(' return func(((C*40) + *P) / 42+P, someA); ^ now we only emit the first. llvm-svn: 39474
-
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: 39471
-
Chris Lattner authored
llvm-svn: 39470
-
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
-
Chris Lattner authored
#define friendlystruct fs struct A { int X; }; void test2(struct A friendlystruct, int C) { return friendlystruct + (C *40); } were getting diagnosed like this: t.c:7:27: error: invalid operands to binary expression ('struct A' and 'int') return friendlystruct + (C *40); ~~ ^ ~~~~~~~~~~~ The problem is that getCharacterData returns a pointer to the macro expansion, not to the macro instantiation. Instead, use getLogicalLoc to get a pointer to the instatiation location, so we relex the macro id. We now get: t.c:7:27: error: invalid operands to binary expression ('struct A' and 'int') return friendlystruct + (C *40); ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~ oooh ahh. :) llvm-svn: 39465
-
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: 39463
-
Chris Lattner authored
llvm-svn: 39462
-
Chris Lattner authored
llvm-svn: 39461
-
- May 19, 2007
-
-
Chris Lattner authored
llvm-svn: 39460
-
Chris Lattner authored
of a subexpression when emitting a diagnostic. Consider this example: struct A { int X; }; void test1(void *P, int C) { return ((C*40) + *P) / 42+P; } void test2(struct A friendlystruct, int C) { return (C *40) + friendlystruct; } void test3(struct A friendlystruct, int C) { return friendlystruct + test2(friendlystruct , C); } clang now produces this output: t.c:4:18: error: invalid operands to binary expression ('int' and 'void') return ((C*40) + *P) / 42+P; ~~~~~~ ^ ~~ This shows the important pieces of a nested (and potentially very complex) expression. t.c:8:18: error: invalid operands to binary expression ('int' and 'struct A') return (C *40) + friendlystruct; ~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~ This shows that tabs in source files (after the 'C') and multichar tokens (friendlystruct) are handled correctly. t.c:12:25: error: invalid operands to binary expression ('struct A' and 'void') return friendlystruct + test2(friendlystruct ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~ This shows how multiline ranges are printed. Any part of the range that is not on the same line as the carat is just ignored. This also shows that trailing spaces on the line aren't highlighted. llvm-svn: 39459
-
Chris Lattner authored
but there is no functionality change yet. llvm-svn: 39458
-
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
-
Chris Lattner authored
etc. llvm-svn: 39447
-
- 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
-