r315236 - PR13575: Fix USR mangling for fixed-size arrays

Jan Korous via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 9 12:51:33 PDT 2017


Author: jkorous
Date: Mon Oct  9 12:51:33 2017
New Revision: 315236

URL: http://llvm.org/viewvc/llvm-project?rev=315236&view=rev
Log:
PR13575: Fix USR mangling for fixed-size arrays

Differential Revision: https://reviews.llvm.org/D38643

Added:
    cfe/trunk/test/Index/USR/
    cfe/trunk/test/Index/USR/array-type.cpp
Modified:
    cfe/trunk/lib/Index/USRGeneration.cpp

Modified: cfe/trunk/lib/Index/USRGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/USRGeneration.cpp?rev=315236&r1=315235&r2=315236&view=diff
==============================================================================
--- cfe/trunk/lib/Index/USRGeneration.cpp (original)
+++ cfe/trunk/lib/Index/USRGeneration.cpp Mon Oct  9 12:51:33 2017
@@ -816,6 +816,25 @@ void USRGenerator::VisitType(QualType T)
       T = VT->getElementType();
       continue;
     }
+    if (const auto *const AT = dyn_cast<ArrayType>(T)) {
+      Out << '{';
+      switch (AT->getSizeModifier()) {
+      case ArrayType::Static:
+        Out << 's';
+        break;
+      case ArrayType::Star:
+        Out << '*';
+        break;
+      case ArrayType::Normal:
+        Out << 'n';
+        break;
+      }
+      if (const auto *const CAT = dyn_cast<ConstantArrayType>(T))
+        Out << CAT->getSize();
+
+      T = AT->getElementType();
+      continue;
+    }
 
     // Unhandled type.
     Out << ' ';

Added: cfe/trunk/test/Index/USR/array-type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/USR/array-type.cpp?rev=315236&view=auto
==============================================================================
--- cfe/trunk/test/Index/USR/array-type.cpp (added)
+++ cfe/trunk/test/Index/USR/array-type.cpp Mon Oct  9 12:51:33 2017
@@ -0,0 +1,11 @@
+// RUN: c-index-test core -print-source-symbols -- %s | FileCheck %s
+
+// Function template specializations differing in array type parameter should have unique USRs.
+
+template<class buffer> void foo(buffer);
+// CHECK: {{[0-9]+}}:17 | function(Gen,TS)/C++ | foo | c:@F at foo<#{n16C>#*C# | __Z3fooIA16_cEvT_ | Decl,RelSpecialization | rel: 1
+template<> void foo<char[16]>(char[16]);
+// CHECK: {{[0-9]+}}:17 | function(Gen,TS)/C++ | foo | c:@F at foo<#{n32C>#*C# | __Z3fooIA32_cEvT_ | Decl,RelSpecialization | rel: 1
+template<> void foo<char[32]>(char[32]);
+// CHECK: {{[0-9]+}}:17 | function(Gen,TS)/C++ | foo | c:@F at foo<#{n64C>#*C# | __Z3fooIA64_cEvT_ | Decl,RelSpecialization | rel: 1
+template<> void foo<char[64]>(char[64]);




More information about the cfe-commits mailing list