r324062 - [Sema] Add implicit members even for invalid CXXRecordDecls
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 2 00:40:08 PST 2018
Author: ibiryukov
Date: Fri Feb 2 00:40:08 2018
New Revision: 324062
URL: http://llvm.org/viewvc/llvm-project?rev=324062&view=rev
Log:
[Sema] Add implicit members even for invalid CXXRecordDecls
Summary:
It should be safe, since other code paths are already generating
implicit members even in invalid CXXRecordDecls (e.g. lookup).
If we don't generate implicit members on CXXRecordDecl's completion,
they will be generated by next lookup of constructors. This causes a
crash when the following conditions are met:
- a CXXRecordDecl is invalid,
- it is provided via ExternalASTSource (e.g. from PCH),
- it has inherited constructors (they create ShadowDecls),
- lookup of its constructors was not run before ASTWriter serialized
it.
This may require the ShadowDecls created for inherited constructors to
be removed from the class, but that's no longer possible since class is
provided by ExternalASTSource.
See provided lit test for an example.
Reviewers: bkramer
Reviewed By: bkramer
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D42810
Added:
cfe/trunk/test/Index/Inputs/crash-preamble-classes.h
cfe/trunk/test/Index/crash-preamble-classes.cpp
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=324062&r1=324061&r2=324062&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Feb 2 00:40:08 2018
@@ -15440,10 +15440,10 @@ void Sema::ActOnFields(Scope *S, SourceL
CXXRecord->getDestructor());
}
- if (!CXXRecord->isInvalidDecl()) {
- // Add any implicitly-declared members to this class.
- AddImplicitlyDeclaredMembersToClass(CXXRecord);
+ // Add any implicitly-declared members to this class.
+ AddImplicitlyDeclaredMembersToClass(CXXRecord);
+ if (!CXXRecord->isInvalidDecl()) {
// If we have virtual base classes, we may end up finding multiple
// final overriders for a given virtual function. Check for this
// problem now.
Added: cfe/trunk/test/Index/Inputs/crash-preamble-classes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Inputs/crash-preamble-classes.h?rev=324062&view=auto
==============================================================================
--- cfe/trunk/test/Index/Inputs/crash-preamble-classes.h (added)
+++ cfe/trunk/test/Index/Inputs/crash-preamble-classes.h Fri Feb 2 00:40:08 2018
@@ -0,0 +1,9 @@
+struct Incomplete;
+
+struct X : Incomplete {
+ X();
+};
+
+struct Y : X {
+ using X::X;
+};
Added: cfe/trunk/test/Index/crash-preamble-classes.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/crash-preamble-classes.cpp?rev=324062&view=auto
==============================================================================
--- cfe/trunk/test/Index/crash-preamble-classes.cpp (added)
+++ cfe/trunk/test/Index/crash-preamble-classes.cpp Fri Feb 2 00:40:08 2018
@@ -0,0 +1,8 @@
+#include "crash-preamble-classes.h"
+
+struct Z : Y {
+ Z() {}
+};
+
+// RUN: env CINDEXTEST_EDITING=1 \
+// RUN: c-index-test -test-load-source-reparse 5 local -I %S/Inputs %s
More information about the cfe-commits
mailing list