]> granicus.if.org Git - clang/commitdiff
Teach libclang to generate USRs containing parameter packs and pack expansions.
authorDouglas Gregor <dgregor@apple.com>
Wed, 19 Jan 2011 20:50:07 +0000 (20:50 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 19 Jan 2011 20:50:07 +0000 (20:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123848 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/usrs-cxx0x.cpp [new file with mode: 0644]
tools/libclang/CIndexUSRs.cpp

diff --git a/test/Index/usrs-cxx0x.cpp b/test/Index/usrs-cxx0x.cpp
new file mode 100644 (file)
index 0000000..a0ea6ba
--- /dev/null
@@ -0,0 +1,8 @@
+template<typename ...Types>
+struct tuple { };
+
+void f(tuple<int, float, double>);
+
+// RUN: c-index-test -test-load-source-usrs all -std=c++0x %s | FileCheck %s
+// CHECK: usrs-cxx0x.cpp c:@ST>1#pT@tuple Extent=[1:1 - 2:17]
+// CHECK: usrs-cxx0x.cpp c:@F@f#$@S@tuple>#p3Ifd# Extent=[4:6 - 4:34]
index 8aed372be67ef7a0345e47fdbdb973f86eb477fb..5e632b9e96e6de6c5ff1ecc7f3d115dc6e11a533 100644 (file)
@@ -523,6 +523,11 @@ void USRGenerator::VisitType(QualType T) {
 
     // Mangle in ObjC GC qualifiers?
 
+    if (const PackExpansionType *Expansion = T->getAs<PackExpansionType>()) {
+      Out << 'P';
+      T = Expansion->getPattern();
+    }
+    
     if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
       unsigned char c = '\0';
       switch (BT->getKind()) {
@@ -666,17 +671,23 @@ void USRGenerator::VisitTemplateParameterList(
        P != PEnd; ++P) {
     Out << '#';
     if (isa<TemplateTypeParmDecl>(*P)) {
+      if (cast<TemplateTypeParmDecl>(*P)->isParameterPack())
+        Out<< 'p';
       Out << 'T';
       continue;
     }
     
     if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
+      if (NTTP->isParameterPack())
+        Out << 'p';
       Out << 'N';
       VisitType(NTTP->getType());
       continue;
     }
     
     TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P);
+    if (TTP->isParameterPack())
+      Out << 'p';
     Out << 't';
     VisitTemplateParameterList(TTP->getTemplateParameters());
   }
@@ -707,9 +718,10 @@ void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) {
       Visit(D);
     break;
       
-  case TemplateArgument::Template:
   case TemplateArgument::TemplateExpansion:
-      // FIXME: variadic templates
+    Out << 'P'; // pack expansion of...
+    // Fall through
+  case TemplateArgument::Template:
     VisitTemplateName(Arg.getAsTemplateOrTemplatePattern());
     break;
       
@@ -718,7 +730,10 @@ void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) {
     break;
       
   case TemplateArgument::Pack:
-    // FIXME: Variadic templates
+    Out << 'p' << Arg.pack_size();
+    for (TemplateArgument::pack_iterator P = Arg.pack_begin(), PEnd = Arg.pack_end();
+         P != PEnd; ++P)
+      VisitTemplateArgument(*P);
     break;
       
   case TemplateArgument::Type: