Debug Info: include address-of ('&') operator and qualified names in template argument lists

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
This commit is contained in:
David Blaikie 2013-05-09 22:43:45 +00:00
Родитель eac29c855f
Коммит f1e08ac58e
2 изменённых файлов: 15 добавлений и 7 удалений

Просмотреть файл

@ -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>";
}

Просмотреть файл

@ -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;