zcov: / lib/AST/TemplateBase.cpp


Files: 1 Branches Taken: 56.7% 17 / 30
Generated: 2010-02-10 01:31 Branches Executed: 80.0% 24 / 30
Line Coverage: 80.4% 37 / 46


Programs: 2 Runs 3018


       1                 : //===--- TemplateBase.cpp - Common template AST class implementation ------===//
       2                 : //
       3                 : //                     The LLVM Compiler Infrastructure
       4                 : //
       5                 : // This file is distributed under the University of Illinois Open Source
       6                 : // License. See LICENSE.TXT for details.
       7                 : //
       8                 : //===----------------------------------------------------------------------===//
       9                 : //
      10                 : // This file implements common classes used throughout C++ template
      11                 : // representations.
      12                 : //
      13                 : //===----------------------------------------------------------------------===//
      14                 : 
      15                 : #include "llvm/ADT/FoldingSet.h"
      16                 : #include "clang/AST/TemplateBase.h"
      17                 : #include "clang/AST/DeclBase.h"
      18                 : #include "clang/AST/DeclTemplate.h"
      19                 : #include "clang/AST/Expr.h"
      20                 : #include "clang/AST/TypeLoc.h"
      21                 : 
      22                 : using namespace clang;
      23                 : 
      24                 : //===----------------------------------------------------------------------===//
      25                 : // TemplateArgument Implementation
      26                 : //===----------------------------------------------------------------------===//
      27                 : 
      28                 : /// \brief Construct a template argument pack.
      29                 : void TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs,
      30                9:                                        bool CopyArgs) {
                        9: branch 1 taken
                        0: branch 2 not taken
      31                9:   assert(isNull() && "Must call setArgumentPack on a null argument");
      32                 : 
      33                9:   Kind = Pack;
      34                9:   Args.NumArgs = NumArgs;
      35                9:   Args.CopyArgs = CopyArgs;
                        9: branch 0 taken
                        0: branch 1 not taken
      36                9:   if (!Args.CopyArgs) {
      37                9:     Args.Args = args;
      38                9:     return;
      39                 :   }
      40                 : 
      41                 :   // FIXME: Allocate in ASTContext
                        0: branch 2 not taken
                        0: branch 3 not taken
      42                0:   Args.Args = new TemplateArgument[NumArgs];
                        0: branch 0 not taken
                        0: branch 1 not taken
      43                0:   for (unsigned I = 0; I != Args.NumArgs; ++I)
      44                0:     Args.Args[I] = args[I];
      45                 : }
      46                 : 
      47                 : void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
      48            10765:                                ASTContext &Context) const {
      49            10765:   ID.AddInteger(Kind);
                        2: branch 0 taken
                     7225: branch 1 taken
                       95: branch 2 taken
                       39: branch 3 taken
                     3220: branch 4 taken
                      184: branch 5 taken
                        0: branch 6 not taken
                        0: branch 7 not taken
      50            10765:   switch (Kind) {
      51                 :   case Null:
      52                2:     break;
      53                 : 
      54                 :   case Type:
      55             7225:     getAsType().Profile(ID);
      56             7225:     break;
      57                 : 
      58                 :   case Declaration:
                       92: branch 1 taken
                        3: branch 2 taken
      59               95:     ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
      60               95:     break;
      61                 : 
      62                 :   case Template:
                       12: branch 0 taken
                       27: branch 1 taken
      63               39:     if (TemplateTemplateParmDecl *TTP
      64                 :           = dyn_cast_or_null<TemplateTemplateParmDecl>(
      65               39:                                        getAsTemplate().getAsTemplateDecl())) {
      66               12:       ID.AddBoolean(true);
      67               12:       ID.AddInteger(TTP->getDepth());
      68               12:       ID.AddInteger(TTP->getPosition());
      69                 :     } else {
      70               27:       ID.AddBoolean(false);
      71                 :       ID.AddPointer(Context.getCanonicalTemplateName(getAsTemplate())
      72               27:                       .getAsVoidPointer());
      73                 :     }
      74               39:     break;
      75                 :       
      76                 :   case Integral:
      77             3220:     getAsIntegral()->Profile(ID);
      78             3220:     getIntegralType().Profile(ID);
      79             3220:     break;
      80                 : 
      81                 :   case Expression:
      82              184:     getAsExpr()->Profile(ID, Context, true);
      83              184:     break;
      84                 : 
      85                 :   case Pack:
      86                0:     ID.AddInteger(Args.NumArgs);
                        0: branch 0 not taken
                        0: branch 1 not taken
      87                0:     for (unsigned I = 0; I != Args.NumArgs; ++I)
      88                0:       Args.Args[I].Profile(ID, Context);
      89                 :   }
      90            10765: }
      91                 : 
      92                 : //===----------------------------------------------------------------------===//
      93                 : // TemplateArgumentLoc Implementation
      94                 : //===----------------------------------------------------------------------===//
      95                 : 
      96               43: SourceRange TemplateArgumentLoc::getSourceRange() const {
                       14: branch 1 taken
                        0: branch 2 not taken
                       15: branch 3 taken
                       14: branch 4 taken
                        0: branch 5 not taken
                        0: branch 6 not taken
      97               43:   switch (Argument.getKind()) {
      98                 :   case TemplateArgument::Expression:
      99               14:     return getSourceExpression()->getSourceRange();
     100                 :       
     101                 :   case TemplateArgument::Declaration:
     102                0:     return getSourceDeclExpression()->getSourceRange();
     103                 :       
     104                 :   case TemplateArgument::Type:
     105               15:     return getTypeSourceInfo()->getTypeLoc().getFullSourceRange();
     106                 :       
     107                 :   case TemplateArgument::Template:
                        2: branch 2 taken
                       12: branch 3 taken
     108               14:     if (getTemplateQualifierRange().isValid())
     109                 :       return SourceRange(getTemplateQualifierRange().getBegin(),
     110                2:                          getTemplateNameLoc());
     111               12:     return SourceRange(getTemplateNameLoc());
     112                 :       
     113                 :   case TemplateArgument::Integral:
     114                 :   case TemplateArgument::Pack:
     115                 :   case TemplateArgument::Null:
     116                0:     return SourceRange();
     117                 :   }
     118                 : 
     119                 :   // Silence bonus gcc warning.
     120                0:   return SourceRange();
     121                 : }

Generated: 2010-02-10 01:31 by zcov