Skip to content
  1. Mar 28, 2009
    • Anders Carlsson's avatar
    • 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
    • Anders Carlsson's avatar
      9205d553
    • Eli Friedman's avatar
      Change compound assignment operators to keep track of both the promoted · 8b7b1b1a
      Eli Friedman authored
      LHS type and the computation result type; this encodes information into 
      the AST which is otherwise non-obvious.  Fix Sema to always come up with the 
      right answer for both of these types.  Fix IRGen and the analyzer to 
      account for these changes.  This fixes PR2601.  The approach is inspired 
      by PR2601 comment 2.
      
      Note that this changes real *= complex in CodeGen from a silent 
      miscompilation to an explicit error.
      
      I'm not really sure that the analyzer changes are correct, or how to 
      test them... someone more familiar with the analyzer should check those 
      changes.
      
      llvm-svn: 67889
      8b7b1b1a
    • Douglas Gregor's avatar
      Make our diagnostics about the obsolete GNU designated-initializer · 5c7c9cb6
      Douglas Gregor authored
      syntax into extension warnings, and provide code-modification hints
      showing how to fix the problem.
      
      llvm-svn: 67885
      5c7c9cb6
    • Douglas Gregor's avatar
      Initial implementation of parsing, semantic analysis, and template · 333489bb
      Douglas Gregor authored
      instantiation for C++ typename-specifiers such as
      
        typename T::type
      
      The parsing of typename-specifiers is relatively easy thanks to
      annotation tokens. When we see the "typename", we parse the
      typename-specifier and produce a typename annotation token. There are
      only a few places where we need to handle this. We currently parse the
      typename-specifier form that terminates in an identifier, but not the
      simple-template-id form, e.g.,
      
        typename T::template apply<U, V>
      
      Parsing of nested-name-specifiers has a similar problem, since at this
      point we don't have any representation of a class template
      specialization whose template-name is unknown.
      
      Semantic analysis is only partially complete, with some support for
      template instantiation that works for simple examples. 
      
      llvm-svn: 67875
      333489bb
  2. Mar 27, 2009
  3. Mar 26, 2009
  4. Mar 25, 2009
  5. Mar 24, 2009
    • Sebastian Redl's avatar
      f769df5e
    • Anders Carlsson's avatar
      Fix the bug that Eli noticed where we wouldn't look at function decls outside... · b57738b0
      Anders Carlsson authored
      Fix the bug that Eli noticed where we wouldn't look at function decls outside the class declaration.
      
      llvm-svn: 67627
      b57738b0
    • Anders Carlsson's avatar
      More work on diagnosing abstract classes. We can now handle cases like · b5a27b46
      Anders Carlsson authored
      class C {
        void g(C c);
      
        virtual void f() = 0;
      };
      
      In this case, C is not known to be abstract when doing semantic analysis on g. This is done by recursively traversing the abstract class and checking the types of member functions. 
      
      llvm-svn: 67594
      b5a27b46
    • Douglas Gregor's avatar
      Template instantiation for the declarations of member functions within · f4f296de
      Douglas Gregor authored
      a class template. At present, we can only instantiation normal
      methods, but not constructors, destructors, or conversion operators.
      
      As ever, this contains a bit of refactoring in Sema's type-checking. In
      particular:
      
        - Split ActOnFunctionDeclarator into ActOnFunctionDeclarator
          (handling the declarator itself) and CheckFunctionDeclaration
          (checking for the the function declaration), the latter of which
          is also used by template instantiation.
        - We were performing the adjustment of function parameter types in
          three places; collect those into a single new routine.
        - When the type of a parameter is adjusted, allocate an
          OriginalParmVarDecl to keep track of the type as it was written.
        - Eliminate a redundant check for out-of-line declarations of member
          functions; hide more C++-specific checks on function declarations
          behind if(getLangOptions().CPlusPlus).
      
      llvm-svn: 67575
      f4f296de
  6. Mar 23, 2009
  7. Mar 22, 2009
  8. Mar 21, 2009
  9. Mar 20, 2009
  10. Mar 19, 2009
    • Douglas Gregor's avatar
      Introduce a new expression type, UnresolvedDeclRefExpr, that describes · 90a1a651
      Douglas Gregor authored
      dependent qualified-ids such as
      
        Fibonacci<N - 1>::value
      
      where N is a template parameter. These references are "unresolved"
      because the name is dependent and, therefore, cannot be resolved to a
      declaration node (as we would do for a DeclRefExpr or
      QualifiedDeclRefExpr). UnresolvedDeclRefExprs instantiate to
      DeclRefExprs, QualifiedDeclRefExprs, etc.
      
      Also, be a bit more careful about keeping only a single set of
      specializations for a class template, and instantiating from the
      definition of that template rather than a previous declaration. In
      general, we need a better solution for this for all TagDecls, because
      it's too easy to accidentally look at a declaration that isn't the
      definition.
      
      We can now process a simple Fibonacci computation described as a
      template metaprogram.
      
      llvm-svn: 67308
      90a1a651
    • Douglas Gregor's avatar
      Extend the use of QualifiedNameType to the creation of class template · e177b725
      Douglas Gregor authored
      specialization names. This way, we keep track of sugared types like
      
        std::vector<Real>
      
      I believe we are now using QualifiedNameTypes everywhere we can. Next
      step: QualifiedDeclRefExprs.
      
      llvm-svn: 67268
      e177b725
    • Douglas Gregor's avatar
      Introduce a representation for types that we referred to via a · 5253768a
      Douglas Gregor authored
      qualified name, e.g., 
      
        foo::x
      
      so that we retain the nested-name-specifier as written in the source
      code and can reproduce that qualified name when printing the types
      back (e.g., in diagnostics). This is PR3493, which won't be complete
      until finished the other tasks mentioned near the end of this commit.
      
      The parser's representation of nested-name-specifiers, CXXScopeSpec,
      is now a bit fatter, because it needs to contain the scopes that
      precede each '::' and keep track of whether the global scoping
      operator '::' was at the beginning. For example, we need to keep track
      of the leading '::', 'foo', and 'bar' in
       
        ::foo::bar::x
      
      The Action's CXXScopeTy * is no longer a DeclContext *. It's now the
      opaque version of the new NestedNameSpecifier, which contains a single
      component of a nested-name-specifier (either a DeclContext * or a Type
      *, bitmangled). 
      
      The new sugar type QualifiedNameType composes a sequence of
      NestedNameSpecifiers with a representation of the type we're actually
      referring to. At present, we only build QualifiedNameType nodes within
      Sema::getTypeName. This will be extended to other type-constructing
      actions (e.g., ActOnClassTemplateId).
      
      Also on the way: QualifiedDeclRefExprs will also store a sequence of
      NestedNameSpecifiers, so that we can print out the property
      nested-name-specifier. I expect to also use this for handling
      dependent names like Fibonacci<I - 1>::value.
      
      llvm-svn: 67265
      5253768a
  11. Mar 18, 2009
  12. Mar 17, 2009
  13. Mar 15, 2009
  14. Mar 14, 2009
  15. Mar 13, 2009
Loading