let Documentation = [NoDebugDocs];
}
-def DebugTypeInfoAsNeeded : InheritableAttr {
- let Spellings = [Clang<"debug_type_info_as_needed">];
- let Subjects = SubjectList<[CXXRecord]>;
- let Documentation = [Undocumented];
- let SimpleHandler = 1;
-}
-
def NoDuplicate : InheritableAttr {
let Spellings = [Clang<"noduplicate">];
let Subjects = SubjectList<[Function]>;
if (!CXXDecl)
return false;
- // Don't omit definition if marked with attribute.
- if (RD->hasAttr<DebugTypeInfoAsNeededAttr>())
- return false;
-
// Only emit complete debug info for a dynamic class when its vtable is
// emitted. However, Microsoft debuggers don't resolve type information
// across DLL boundaries, so skip this optimization if the class or any of its
+++ /dev/null
-// RUN: %clang_cc1 -DSETATTR=0 -emit-llvm -std=c++14 -debug-info-kind=constructor %s -o - | FileCheck %s --check-prefix=DEBUG
-// RUN: %clang_cc1 -DSETATTR=1 -emit-llvm -std=c++14 -debug-info-kind=constructor %s -o - | FileCheck %s --check-prefix=WITHATTR
-
-#if SETATTR
-#define DEBUGASNEEDED __attribute__((debug_type_info_as_needed))
-#else
-#define DEBUGASNEEDED
-#endif
-
-// Struct that isn't constructed, so its full type info should be omitted with
-// -debug-info-kind=constructor.
-struct DEBUGASNEEDED some_struct {
- some_struct() {}
-};
-
-void func1(some_struct s) {}
-// void func2() { func1(); }
-// DEBUG: !DICompositeType({{.*}}name: "some_struct"
-// DEBUG-SAME: flags: {{.*}}DIFlagFwdDecl
-// WITHATTR: !DICompositeType({{.*}}name: "some_struct"
-// WITHATTR-NOT: DIFlagFwdDecl
-