]> granicus.if.org Git - clang/commitdiff
DebugInfo: Lazily built static member variable declarations should use the canonical...
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Oct 2014 22:22:17 +0000 (22:22 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Oct 2014 22:22:17 +0000 (22:22 +0000)
When lazily constructing static member variable declarations (when
the vtable optimization fires and the definition of the type is omitted
(or built later, lazily), but the out of line definition of the static
member is provided and must be described in debug info) ensure we use
the canonical declaration when computing the file, line, etc for that
declaration (rather than the definition, which is also a declaration,
but not the canonical one).

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

lib/CodeGen/CGDebugInfo.cpp
test/CodeGenCXX/debug-info-static-member.cpp

index 025bdfaed0e1b86fdfab9d09574665e4fbe94d24..512db76a8416945c605717895e43b741dce7e5b7 100644 (file)
@@ -895,6 +895,7 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var,
                                      const RecordDecl* RD) {
   // Create the descriptor for the static variable, with or without
   // constant initializers.
+  Var = Var->getCanonicalDecl();
   llvm::DIFile VUnit = getOrCreateFile(Var->getLocation());
   llvm::DIType VTy = getOrCreateType(Var->getType(), VUnit);
 
index 7bbac6bafc91cb41562893d3ca192c04e0b8d825..2a4f0c3dcd8c82accd1d1d059b5d755cb796f7cd 100644 (file)
@@ -45,3 +45,13 @@ int main()
 // CHECK: metadata !{metadata !"0x34\00a\00{{.*}}", {{.*}} @_ZN1C1aE, metadata ![[DECL_A]]} ; [ DW_TAG_variable ] [a] {{.*}} [def]
 // CHECK: metadata !{metadata !"0x34\00b\00{{.*}}", {{.*}} @_ZN1C1bE, metadata ![[DECL_B]]} ; [ DW_TAG_variable ] [b] {{.*}} [def]
 // CHECK: metadata !{metadata !"0x34\00c\00{{.*}}", {{.*}} @_ZN1C1cE, metadata ![[DECL_C]]} ; [ DW_TAG_variable ] [c] {{.*}} [def]
+
+// Verify that even when a static member declaration is created lazily when
+// creating the definition, the declaration line is that of the canonical
+// declaration, not the definition.
+struct V {
+  virtual ~V(); // cause the definition of 'V' to be omitted by no-standalone-debug optimization
+  static const int const_va = 42;
+};
+// CHECK: ; [ DW_TAG_member ] [const_va] [line [[@LINE-2]],
+const int V::const_va;