rsmith added a comment.

I think this is addressing a symptom rather than the cause. The bug appears to 
be that when parsing a.h, we end up with inconsistent exception specifications 
along the redeclaration chain. It looks like 
`Sema::AdjustDestructorExceptionSpec` doesn't do the right thing when 
befriending a destructor. Here's a non-modules testcase based on yours that 
demonstrates either the same problem or at least a closely-related one:

  struct B {
    virtual ~B();
    struct C { friend B::~B() noexcept; }; 
  };

We produce a bogus error here ("exception specification in declaration does not 
match previous declaration"). But we think the exception specifications match 
if class `C` is moved outside class `B`.

Generally, we skip checking the exception specification for a destructor until 
we get to the end of the class. But when the destructor declaration is a friend 
declaration for a destructor of an enclosing class, we need to instead delay 
until that enclosing class is complete. I expect the logic to do that is what's 
missing here.


Repository:
  rC Clang

https://reviews.llvm.org/D51608



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D51608: [... Steve O'Brien via Phabricator via cfe-commits
    • [PATCH] D516... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D516... Steve O'Brien via Phabricator via cfe-commits
    • [PATCH] D516... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D516... Richard Smith - zygoloid via Phabricator via cfe-commits
    • [PATCH] D516... Steve O'Brien via Phabricator via cfe-commits

Reply via email to