r231451 - Don't crash on non-public referenced dtors in toplevel classes.
David Blaikie
dblaikie at gmail.com
Fri Mar 6 10:04:47 PST 2015
On Fri, Mar 6, 2015 at 9:57 AM, Nico Weber <thakis at chromium.org> wrote:
> On Fri, Mar 6, 2015 at 9:32 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>>
>>
>> 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?
>>
>
> Public defaulted dtors are marked as "irrelevant destructors", and that
> triggers an early return somewhere. If a destructor is not public, it isn't
> irrelevant to sema though, as it now needs access checks.
>
Ah, I see - just an optimization, then. Thanks for the context.
> So the early return that "protects" irrelevant destructors doesn't fire
> for this case, and we need to explicitly check for triviality. As the
> commit message says,
>
Maybe a detail missed from the commit message? I don't see that detail
mentioned.
> constructors have the same check a few lines further up.
>
Ah, looking at the code I see - fair enough then.
Thanks for the details!
- David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150306/9d62ce29/attachment.html>
More information about the cfe-commits
mailing list