Skip to content
  1. Apr 12, 2009
    • Sebastian Redl's avatar
      Parse deleted member functions. Parsing member declarations goes through a... · 42e92c4b
      Sebastian Redl authored
      Parse deleted member functions. Parsing member declarations goes through a different code path that I forgot previously.
      Implement the rvalue reference overload dance for returning local objects. Returning a local object first tries to find a move constructor now.
      The error message when no move constructor is defined (or is not applicable) and the copy constructor is deleted is quite ugly, though.
      
      llvm-svn: 68902
      42e92c4b
  2. Apr 09, 2009
  3. Mar 28, 2009
    • Chris Lattner's avatar
      Introduce a new OpaquePtr<N> struct type, which is a simple POD wrapper for a · 83f095cc
      Chris Lattner authored
      pointer.  Its purpose in life is to be a glorified void*, but which does not
      implicitly convert to void* or other OpaquePtr's with a different UID.
      
      Introduce Action::DeclPtrTy which is a typedef for OpaquePtr<0>.  Change the 
      entire parser/sema interface to use DeclPtrTy instead of DeclTy*.  This
      makes the C++ compiler enforce that these aren't convertible to other opaque
      types.
      
      We should also convert ExprTy, StmtTy, TypeTy, AttrTy, BaseTy, etc,
      but I don't plan to do that in the short term.
      
      The one outstanding known problem with this patch is that we lose the 
      bitmangling optimization where ActionResult<DeclPtrTy> doesn't know how to
      bitmangle the success bit into the low bit of DeclPtrTy.  I will rectify
      this with a subsequent patch.
      
      llvm-svn: 67952
      83f095cc
  4. Mar 24, 2009
  5. Mar 23, 2009
  6. Mar 17, 2009
  7. Mar 15, 2009
  8. Mar 13, 2009
    • Douglas Gregor's avatar
      Implement template instantiation for several more kinds of expressions: · 0950e41b
      Douglas Gregor authored
        - C++ function casts, e.g., T(foo)
        - sizeof(), alignof()
      
      More importantly, this allows us to verify that we're performing
      overload resolution during template instantiation, with
      argument-dependent lookup and the "cached" results of name lookup from
      the template definition.
      
      llvm-svn: 66947
      0950e41b
    • Douglas Gregor's avatar
      Refactor the way we handle operator overloading and template · 1baf54e1
      Douglas Gregor authored
      instantiation for binary operators. This change moves most of the
      operator-overloading code from the parser action ActOnBinOp to a new,
      parser-independent semantic checking routine CreateOverloadedBinOp. 
      
      Of particular importance is the fact that CreateOverloadedBinOp does
      *not* perform any name lookup based on the current parsing context (it
      doesn't take a Scope*), since it has to be usable during template
      instantiation, when there is no scope information. Rather, it takes a
      pre-computed set of functions that are visible from the context or via
      argument-dependent lookup, and adds to that set any member operators
      and built-in operator candidates. The set of functions is computed in
      the parser action ActOnBinOp based on the current context (both
      operator name lookup and argument-dependent lookup). Within a
      template, the set computed by ActOnBinOp is saved within the
      type-dependent AST node and is augmented with the results of
      argument-dependent name lookup at instantiation time (see
      TemplateExprInstantiator::VisitCXXOperatorCallExpr).
      
      Sadly, we can't fully test this yet. I'll follow up with template
      instantiation for sizeof so that the real fun can begin.
      
      llvm-svn: 66923
      1baf54e1
  9. Mar 09, 2009
  10. Feb 28, 2009
  11. Feb 26, 2009
  12. Feb 25, 2009
    • Douglas Gregor's avatar
      C99 DR #316 implies that the function parameter types that are known · 739ef0c1
      Douglas Gregor authored
      only from a function definition (that does not have a prototype) are
      only used to determine the compatible with other declarations of that
      same function. In particular, when referencing the function we pretend
      as if it does not have a prototype. Implement this behavior, which
      fixes PR3626.
      
      llvm-svn: 65460
      739ef0c1
  13. Feb 18, 2009
    • Douglas Gregor's avatar
      Downgrade complaints about calling unavailable functions to a warning · 171c45ab
      Douglas Gregor authored
      (as GCC does), except when we've performed overload resolution and
      found an unavailable function: in this case, we actually error.
      
      Merge the checking of unavailable functions with the checking for
      deprecated functions. This unifies a bit of code, and makes sure that
      we're checking for unavailable functions in the right places. Also,
      this check can cause an error. We may, eventually, want an option to
      make "unavailable" warnings into errors.
      
      Implement much of the logic needed for C++0x deleted functions, which
      are effectively the same as "unavailable" functions (but always cause
      an error when referenced). However, we don't have the syntax to
      specify deleted functions yet :)
      
      llvm-svn: 64955
      171c45ab
  14. Feb 17, 2009
  15. Feb 12, 2009
    • Douglas Gregor's avatar
      Introduce _Complex conversions into the function overloading · 78ca74d8
      Douglas Gregor authored
      system. Since C99 doesn't have overloading and C++ doesn't have
      _Complex, there is no specification for    this. Here's what I think
      makes sense.
      
      Complex conversions come in several flavors:
      
        - Complex promotions:  a complex -> complex   conversion where the
          underlying real-type conversion is a floating-point promotion. GCC
          seems to call this a promotion, EDG does something else. This is
          given "promotion" rank for determining the best viable function.
        - Complex conversions: a complex -> complex conversion that is
          not a complex promotion. This is given "conversion" rank for
          determining the best viable   function.
        - Complex-real conversions: a real -> complex or complex -> real
          conversion. This is given "conversion" rank for determining the
          best viable function.
      
      These rules are the same for C99 (when using the "overloadable"
      attribute) and C++. However, there is one difference in the handling
      of floating-point promotions: in C99, float -> long double and double
      -> long double are considered promotions (so we give them "promotion" 
      rank), while C++ considers these conversions ("conversion" rank).
      
      llvm-svn: 64343
      78ca74d8
    • Douglas Gregor's avatar
      Initial implementation of function overloading in C. · 4e5cbdcb
      Douglas Gregor authored
      This commit adds a new attribute, "overloadable", that enables C++
      function overloading in C. The attribute can only be added to function
      declarations, e.g.,
      
        int *f(int) __attribute__((overloadable));
      
      If the "overloadable" attribute exists on a function with a given
      name, *all* functions with that name (and in that scope) must have the
      "overloadable" attribute. Sets of overloaded functions with the
      "overloadable" attribute then follow the normal C++ rules for
      overloaded functions, e.g., overloads must have different
      parameter-type-lists from each other.
      
      When calling an overloaded function in C, we follow the same
      overloading rules as C++, with three extensions to the set of standard
      conversions:
      
        - A value of a given struct or union type T can be converted to the
          type T. This is just the identity conversion. (In C++, this would
          go through a copy constructor).
        - A value of pointer type T* can be converted to a value of type U*
          if T and U are compatible types. This conversion has Conversion
          rank (it's considered a pointer conversion in C).
        - A value of type T can be converted to a value of type U if T and U
          are compatible (and are not both pointer types). This conversion
          has Conversion rank (it's considered to be a new kind of
          conversion unique to C, a "compatible" conversion).
      
      Known defects (and, therefore, next steps):
        1) The standard-conversion handling does not understand conversions
        involving _Complex or vector extensions, so it is likely to get
        these wrong. We need to add these conversions.
        2) All overloadable functions with the same name will have the same
        linkage name, which means we'll get a collision in the linker (if
        not sooner). We'll need to mangle the names of these functions.
      
      llvm-svn: 64336
      4e5cbdcb
  16. Feb 09, 2009
  17. Feb 07, 2009
    • Sebastian Redl's avatar
      Move CheckPointerToMemberOperands to SemaExprCXX.cpp · 5822f08c
      Sebastian Redl authored
      llvm-svn: 64029
      5822f08c
    • Ted Kremenek's avatar
      Overhaul of Stmt allocation: · 5a201951
      Ted Kremenek authored
      - Made allocation of Stmt objects using vanilla new/delete a *compiler
        error* by making this new/delete "protected" within class Stmt.
      - Now the only way to allocate Stmt objects is by using the new
        operator that takes ASTContext& as an argument.  This ensures that
        all Stmt nodes are allocated from the same (pool) allocator.
      - Naturally, these two changes required that *all* creation sites for
        AST nodes use new (ASTContext&).  This is a large patch, but the
        majority of the changes are just this mechanical adjustment.
      - The above changes also mean that AST nodes can no longer be
        deallocated using 'delete'.  Instead, one most do
        StmtObject->Destroy(ASTContext&) or do
        ASTContextObject.Deallocate(StmtObject) (the latter not running the
        'Destroy' method).
      
      Along the way I also...
      - Made CompoundStmt allocate its array of Stmt* using the allocator in
        ASTContext (previously it used std::vector).  There are a whole
        bunch of other Stmt classes that need to be similarly changed to
        ensure that all memory allocated for ASTs comes from the allocator
        in ASTContext.
      - Added a new smart pointer ExprOwningPtr to Sema.h.  This replaces
        the uses of llvm::OwningPtr within Sema, as llvm::OwningPtr used
        'delete' to free memory instead of a Stmt's 'Destroy' method.
      
      Big thanks to Doug Gregor for helping with the acrobatics of making
      'new/delete' private and the new smart pointer ExprOwningPtr!
      
      llvm-svn: 63997
      5a201951
  18. Feb 04, 2009
    • Douglas Gregor's avatar
      Fix our semantic analysis of · b8a9a41d
      Douglas Gregor authored
        unqualified-id '('
      
      in C++. The unqualified-id might not refer to any declaration in our
      current scope, but declarations by that name might be found via
      argument-dependent lookup. We now do so properly.
      
      As part of this change, CXXDependentNameExpr, which was previously
      designed to express the unqualified-id in the above constructor within
      templates, has become UnresolvedFunctionNameExpr, which does
      effectively the same thing but will work for both templates and
      non-templates.
      
      Additionally, we cope with all unqualified-ids, since ADL also applies
      in cases like
      
        operator+(x, y)
      
      llvm-svn: 63733
      b8a9a41d
  19. Feb 03, 2009
  20. Jan 30, 2009
    • Douglas Gregor's avatar
      Eliminated LookupCriteria, whose creation was causing a bottleneck for · ed8f2887
      Douglas Gregor authored
      LookupName et al. Instead, use an enum and a bool to describe its
      contents.
      
      Optimized the C/Objective-C path through LookupName, eliminating any
      unnecessarily C++isms. Simplify IdentifierResolver::iterator, removing
      some code and arguments that are no longer used.
      
      Eliminated LookupDeclInScope/LookupDeclInContext, moving all callers
      over to LookupName, LookupQualifiedName, or LookupParsedName, as
      appropriate.
      
      All together, I'm seeing a 0.2% speedup on Cocoa.h with PTH and
      -disable-free. Plus, we're down to three name-lookup routines.
      
      llvm-svn: 63354
      ed8f2887
  21. Jan 29, 2009
  22. Jan 28, 2009
  23. Jan 27, 2009
  24. Jan 25, 2009
  25. Jan 20, 2009
    • Douglas Gregor's avatar
      Remove ScopedDecl, collapsing all of its functionality into Decl, so · 6e6ad602
      Douglas Gregor authored
      that every declaration lives inside a DeclContext.
      
      Moved several things that don't have names but were ScopedDecls (and,
      therefore, NamedDecls) to inherit from Decl rather than NamedDecl,
      including ObjCImplementationDecl and LinkageSpecDecl. Now, we don't
      store empty DeclarationNames for these things, nor do we try to insert
      them into DeclContext's lookup structure.
      
      The serialization tests are temporarily disabled. We'll re-enable them
      once we've sorted out the remaining ownership/serialiazation issues
      between DeclContexts and TranslationUnion, DeclGroups, etc.
      
      llvm-svn: 62562
      6e6ad602
  26. Jan 19, 2009
  27. Jan 18, 2009
  28. Jan 16, 2009
  29. Jan 14, 2009
    • Douglas Gregor's avatar
      Refactor name lookup. · 34074326
      Douglas Gregor authored
      This change refactors and cleans up our handling of name lookup with
      LookupDecl. There are several aspects to this refactoring:
      
        - The criteria for name lookup is now encapsulated into the class
        LookupCriteria, which replaces the hideous set of boolean values
        that LookupDecl currently has.
      
        - The results of name lookup are returned in a new class
        LookupResult, which can lazily build OverloadedFunctionDecls for
        overloaded function sets (and, eventually, eliminate the need to
        allocate member for OverloadedFunctionDecls) and contains a
        placeholder for handling ambiguous name lookup (for C++).
      
        - The primary entry points for name lookup are now LookupName (for
          unqualified name lookup) and LookupQualifiedName (for qualified
          name lookup). There is also a convenience function
          LookupParsedName that handles qualified/unqualified name lookup
          when given a scope specifier. Together, these routines are meant
          to gradually replace the kludgy LookupDecl, but this won't happen
          until after we have base class lookup (which forces us to cope
          with ambiguities).
      
        - Documented the heck out of name lookup. Experimenting a little
          with using Doxygen's member groups to make some sense of the Sema
          class. Feedback welcome!
      
        - Fixes some lingering issues with name lookup for
        nested-name-specifiers, which now goes through
        LookupName/LookupQualifiedName. 
      
      llvm-svn: 62245
      34074326
    • Douglas Gregor's avatar
      Introduce support for C++0x explicit conversion operators (N2437) · 5fb53972
      Douglas Gregor authored
      Small cleanup in the handling of user-defined conversions. 
      
      Also, implement an optimization when constructing a call. We avoid
      recomputing implicit conversion sequences and instead use those
      conversion sequences that we computed as part of overload resolution.
      
      llvm-svn: 62231
      5fb53972
    • Ted Kremenek's avatar
      FunctionDecl::setParams() now uses the allocator associated with ASTContext to... · 4ba36fcc
      Ted Kremenek authored
      FunctionDecl::setParams() now uses the allocator associated with ASTContext to allocate the array of ParmVarDecl*'s.
      
      llvm-svn: 62203
      4ba36fcc
  30. Jan 13, 2009
Loading