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