r231451 - Don't crash on non-public referenced dtors in toplevel classes.

Nico Weber thakis at chromium.org
Fri Mar 6 10:55:16 PST 2015


On Fri, Mar 6, 2015 at 10:04 AM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> 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.
>

Ah sorry, it was on the bug, not in the commit message:
http://llvm.org/bugs/show_bug.cgi?id=22793#c5


>
>
>> 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/d6607ad3/attachment.html>


More information about the cfe-commits mailing list