Skip to content
  1. May 21, 2007
  2. May 20, 2007
    • Steve Naroff's avatar
      Bug #: · 30d1fbc8
      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
      30d1fbc8
    • Chris Lattner's avatar
      Steve pointed out that testcases like this (with a macro expansion): · 5ab15f15
      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
      5ab15f15
    • Steve Naroff's avatar
      Bug #: · ada7d429
      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
      ada7d429
    • Chris Lattner's avatar
      implement octal escape sequences. · 812eda82
      Chris Lattner authored
      llvm-svn: 39463
      812eda82
    • Chris Lattner's avatar
    • Chris Lattner's avatar
      db5ac601
  3. May 19, 2007
    • Chris Lattner's avatar
      improve const correctness · beeb9bc5
      Chris Lattner authored
      llvm-svn: 39460
      beeb9bc5
    • Chris Lattner's avatar
      Use the new source ranges tracking feature to highlight the important pieces · ebd1b334
      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
      ebd1b334
    • Chris Lattner's avatar
      Change the structure of the code that emits the ^ marker in a diagnostic, · f8d31978
      Chris Lattner authored
      but there is no functionality change yet.
      
      llvm-svn: 39458
      f8d31978
    • Chris Lattner's avatar
      fix some indentation funkiness · 84e160a7
      Chris Lattner authored
      llvm-svn: 39457
      84e160a7
    • Steve Naroff's avatar
      Bug #: · 71ce2e06
      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
      71ce2e06
  4. May 18, 2007
    • Steve Naroff's avatar
      Bug #: · e845e272
      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
      e845e272
    • Steve Naroff's avatar
      Bug #: · 72cada0a
      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
      72cada0a
  5. May 17, 2007
    • Steve Naroff's avatar
      Bug #: · 53f07dc5
      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
      53f07dc5
    • Steve Naroff's avatar
      Bug #: · 509fe025
      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
      509fe025
  6. May 16, 2007
    • Steve Naroff's avatar
      Bug #: · a78fe7e3
      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
      a78fe7e3
    • Chris Lattner's avatar
      Remove the Sema::Diag helper that takes a type. Convert clients to use · c04bd6ae
      Chris Lattner authored
      the version that takes a string.
      
      llvm-svn: 39450
      c04bd6ae
    • Chris Lattner's avatar
      Rename type::getAsString to getAsStringInternal. Add a new · 3dc3d775
      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
      3dc3d775
    • Chris Lattner's avatar
      Add helper to emit two strings for a diagnostic. · d6647d3d
      Chris Lattner authored
      llvm-svn: 39448
      d6647d3d
    • Chris Lattner's avatar
      36982e43
  7. May 15, 2007
    • Steve Naroff's avatar
      Bug #: · f8a28c53
      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
      f8a28c53
    • Steve Naroff's avatar
      Bug #: · 043d45da
      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
      043d45da
  8. May 14, 2007
    • Steve Naroff's avatar
      Bug #: · 5dd642eb
      Steve Naroff authored
      Submitted by:
      Reviewed by:
      Some minor cleanup (comments, spec refs, simplied some expressions).
      
      llvm-svn: 39444
      5dd642eb
    • Steve Naroff's avatar
      Bug #: · 475cca0d
      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
      475cca0d
  9. May 13, 2007
    • Steve Naroff's avatar
      Bug #: · 094046fd
      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
      094046fd
  10. May 12, 2007
    • Steve Naroff's avatar
      Bug #: · 29d386c8
      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
      29d386c8
    • Steve Naroff's avatar
      Bug #: · 3f597295
      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
      3f597295
  11. May 11, 2007
    • Steve Naroff's avatar
      Bug #: · 1f4d7272
      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
      1f4d7272
Loading