spyffe created this revision.
Templates can end in parameter packs, like this
template struct MyStruct { /*...*/ };
LLDB does not currently support these parameter packs; it does not emit them
into the template argument list at all. This causes problems when you
specialize, e.g.:
template <> struct MyStruct { /*...*/ };
template <> struct MyStruct : MyStruct { /*...*/ };
LLDB generates two template specializations, each with no template arguments,
and then when they are imported by the `ASTImporter` into a parser's AST
context we get a single specialization that inherits from itself, causing
Clang's record layout mechanism to smash its stack.
This patch fixes the problem for classes and adds tests. The tests for
functions fail because Clang's `ASTImporter` can't import them at the moment,
so I've xfailed that test.
Repository:
rL LLVM
https://reviews.llvm.org/D33025
Files:
include/lldb/Symbol/ClangASTContext.h
packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/Makefile
packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/TestClassTemplateParameterPack.py
packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/main.cpp
packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/Makefile
packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/TestFunctionTemplateParameterPack.py
packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/main.cpp
source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
source/Symbol/ClangASTContext.cpp
Index: packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/main.cpp
===
--- packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/main.cpp
+++ packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/main.cpp
@@ -0,0 +1,24 @@
+//===-- main.cpp *- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LIDENSE.TXT for details.
+//
+//===--===//
+
+template int staticSizeof() {
+ return sizeof(T);
+}
+
+template int staticSizeof() {
+ return staticSizeof() + sizeof(T1);
+}
+
+int main (int argc, char const *argv[])
+{
+ int sz = staticSizeof();
+ return staticSizeof() != sz; //% self.expect("expression -- sz == staticSizeof()", "staticSizeof worked", substrs = ["true"])
+ //% self.expect("expression -- sz == staticSizeof() + sizeof(char)", "staticSizeof worked", substrs = ["true"])
+ //% self.expect("expression -- sz == staticSizeof() + sizeof(int) + sizeof(char)", "staticSizeof worked", substrs = ["true"])
+}
Index: packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/TestFunctionTemplateParameterPack.py
===
--- packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/TestFunctionTemplateParameterPack.py
+++ packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/TestFunctionTemplateParameterPack.py
@@ -0,0 +1,6 @@
+from lldbsuite.test import lldbinline
+from lldbsuite.test import decorators
+
+lldbinline.MakeInlineTest(
+__file__, globals(), [
+decorators.expectedFailureAll(bugnumber="rdar://problem/32096064")])
Index: packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/Makefile
===
--- packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/Makefile
+++ packages/Python/lldbsuite/test/lang/cpp/function-template-parameter-pack/Makefile
@@ -0,0 +1,3 @@
+LEVEL = ../../../make
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
Index: packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/main.cpp
===
--- packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/main.cpp
+++ packages/Python/lldbsuite/test/lang/cpp/class-template-parameter-pack/main.cpp
@@ -0,0 +1,61 @@
+//===-- main.cpp *- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LIDENSE.TXT for details.
+//
+//===--===//
+
+template struct C {
+ T member;
+ bool isSixteenThirtyTwo() { return false; }
+};
+
+template <> struct C {
+ int mem