r231451 - Don't crash on non-public referenced dtors in toplevel classes.
David Blaikie
dblaikie at gmail.com
Fri Mar 6 09:32:45 PST 2015
On Thu, Mar 5, 2015 at 10:01 PM, Nico Weber <nicolasweber at gmx.de> wrote:
> Author: nico
> Date: Fri Mar 6 00:01:06 2015
> New Revision: 231451
>
> URL: http://llvm.org/viewvc/llvm-project?rev=231451&view=rev
> Log:
> Don't crash on non-public referenced dtors in toplevel classes.
>
> Fixes PR22793, a bug that caused self-hosting to fail after the innocuous
> r231254. See the bug for details.
>
Awesome - thanks for jumping on this!
>
> Modified:
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=231451&r1=231450&r2=231451&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Mar 6 00:01:06 2015
> @@ -117,7 +117,7 @@ static AvailabilityResult DiagnoseAvaila
> case AR_Available:
> case AR_NotYetIntroduced:
> break;
> -
> +
> case AR_Deprecated:
> if (S.getCurContextAvailability() != AR_Deprecated)
> S.EmitAvailabilityWarning(Sema::AD_Deprecation,
> @@ -11859,8 +11859,11 @@ void Sema::MarkFunctionReferenced(Source
> } else if (CXXDestructorDecl *Destructor =
> dyn_cast<CXXDestructorDecl>(Func)) {
> Destructor = cast<CXXDestructorDecl>(Destructor->getFirstDecl());
> - if (Destructor->isDefaulted() && !Destructor->isDeleted())
> + if (Destructor->isDefaulted() && !Destructor->isDeleted()) {
> + if (Destructor->isTrivial() &&
> !Destructor->hasAttr<DLLExportAttr>())
> + return;
> DefineImplicitDestructor(Loc, Destructor);
> + }
> if (Destructor->isVirtual() && getLangOpts().AppleKext)
> MarkVTableUsed(Loc, Destructor->getParent());
> } else if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(Func)) {
>
> Modified: cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp?rev=231451&r1=231450&r2=231451&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp Fri Mar 6
> 00:01:06 2015
> @@ -32,3 +32,17 @@ static C c[4];
>
> int main() {
> }
> +
> +namespace PR22793 {
> +template <typename>
> +struct foo {
> +protected:
>
Naively, I was hoping a/the fix might resolve around this being protected.
I was sort of hoping that the fix might involve /removing/ code that was
needlessly checking access rather than adding more conditions. Seems
strange that the access level could change the behavior of this code. (but
I haven't fully understood the notes you made on the bug - so I imagine
it's probably described in there somewhere) Any chance of that?
- David
> +// CHECK-NOT: _ZN7PR227933fooIiED2Ev
> + ~foo() = default;
> + friend void func();
> +};
> +
> +void func() { foo<int> f; }
> +
> +template struct foo<int>;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150306/11c5b013/attachment.html>
More information about the cfe-commits
mailing list