]> granicus.if.org Git - clang/commitdiff
Debug Info: include address-of ('&') operator and qualified names in template argumen...
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 9 May 2013 22:43:45 +0000 (22:43 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 9 May 2013 22:43:45 +0000 (22:43 +0000)
This fixes several (7 out of 16) cases of PR14492 in the GDB 7.5 test
suite. It seems GDB was bailing out whenever it had even the slightest
problem with the template argument list (& I assume it didn't like
seeing template value parameters that were just simple names - perhaps
assuming that lone names must be types, not values)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181556 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/TemplateBase.cpp
test/CodeGenCXX/debug-info-template.cpp

index d68b95edb730dff6c61ef496486b02b855df3926..c3e2c4a7bba84a6ae0fc6fa02f6cbd6b92f051f1 100644 (file)
@@ -353,9 +353,10 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
     
   case Declaration: {
     NamedDecl *ND = cast<NamedDecl>(getAsDecl());
+    Out << '&';
     if (ND->getDeclName()) {
       // FIXME: distinguish between pointer and reference args?
-      Out << *ND;
+      ND->printQualifiedName(Out);
     } else {
       Out << "<anonymous>";
     }
index 38a99cf4c6ad1ac6d9607bfb7256ff740723160b..9bb75ffa3ba2c959669b21f574b01851cc68d973 100644 (file)
@@ -1,19 +1,26 @@
-// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -g %s -o - -std=c++11 | FileCheck %s
 
+// CHECK: [[INT:![0-9]*]] = {{.*}} ; [ DW_TAG_base_type ] [int]
 // CHECK: metadata [[TCI:![0-9]*]], i32 0, i32 1, %class.TC* @tci, null} ; [ DW_TAG_variable ] [tci]
-// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]]} ; [ DW_TAG_class_type ] [TC<int, 2>]
+// CHECK: [[TC:![0-9]*]] = {{.*}}, metadata [[TCARGS:![0-9]*]]} ; [ DW_TAG_class_type ] [TC<int, 2, &glb, &foo::e, &foo::f, nullptr>]
 // CHECK: [[TCARGS]] = metadata !{metadata [[TCARG1:![0-9]*]], metadata [[TCARG2:![0-9]*]]}
 //
 // We seem to be missing file/line/col info on template value parameters -
 // metadata supports it but it's not populated.
 //
-// CHECK: [[TCARG1]] = {{.*}}metadata !"T", metadata [[INT:![0-9]*]], {{.*}} ; [ DW_TAG_template_type_parameter ]
-// CHECK: [[INT]] = {{.*}} ; [ DW_TAG_base_type ] [int]
+// CHECK: [[TCARG1]] = {{.*}}metadata !"T", metadata [[INT]], {{.*}} ; [ DW_TAG_template_type_parameter ]
 // CHECK: [[TCARG2]] = {{.*}}metadata !"", metadata [[UINT:![0-9]*]], i64 2, {{.*}} ; [ DW_TAG_template_value_parameter ]
 // CHECK: [[UINT]] = {{.*}} ; [ DW_TAG_base_type ] [unsigned int]
 
-template<typename T, unsigned>
+struct foo {
+  int e;
+  void f();
+};
+
+template<typename T, unsigned, int *x, int foo::*a, void (foo::*b)(), int *n>
 class TC {
 };
 
-TC<int, 2> tci;
+int glb;
+
+TC<int, 2, &glb, &foo::e, &foo::f, nullptr> tci;