mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-02 07:16:29 +00:00
[modules] If we add an implicit special member to a class through an update
record, and that class declaration is not the canonical definition of the class, be sure to add the class to the list of classes that are consulted when we look up a special member in the canonical definition. llvm-svn: 226778
This commit is contained in:
parent
fa11d837a0
commit
1b65dbc477
@ -3523,13 +3523,25 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile,
|
||||
while (Idx < Record.size()) {
|
||||
switch ((DeclUpdateKind)Record[Idx++]) {
|
||||
case UPD_CXX_ADDED_IMPLICIT_MEMBER: {
|
||||
auto *RD = cast<CXXRecordDecl>(D);
|
||||
// FIXME: If we also have an update record for instantiating the
|
||||
// definition of D, we need that to happen before we get here.
|
||||
Decl *MD = Reader.ReadDecl(ModuleFile, Record, Idx);
|
||||
assert(MD && "couldn't read decl from update record");
|
||||
// FIXME: We should call addHiddenDecl instead, to add the member
|
||||
// to its DeclContext.
|
||||
cast<CXXRecordDecl>(D)->addedMember(MD);
|
||||
RD->addedMember(MD);
|
||||
|
||||
// If we've added a new special member to a class definition that is not
|
||||
// the canonical definition, then we need special member lookups in the
|
||||
// canonical definition to also look into our class.
|
||||
auto *DD = RD->DefinitionData.getNotUpdated();
|
||||
if (DD && DD->Definition != RD) {
|
||||
auto &Merged = Reader.MergedLookups[DD->Definition];
|
||||
// FIXME: Avoid the linear-time scan here.
|
||||
if (std::find(Merged.begin(), Merged.end(), RD) == Merged.end())
|
||||
Merged.push_back(RD);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
struct pthread_mutex_t { int lock; };
|
@ -0,0 +1 @@
|
||||
struct pthread_mutex_t { int lock; };
|
@ -0,0 +1,3 @@
|
||||
#include "a.h"
|
||||
#include "b.h"
|
||||
int k = pthread_mutex_t().lock;
|
@ -0,0 +1,3 @@
|
||||
module a { header "a.h" export * }
|
||||
module b { header "b.h" export * }
|
||||
module c { header "c.h" export * }
|
5
clang/test/Modules/merge-implicit-special-members.cpp
Normal file
5
clang/test/Modules/merge-implicit-special-members.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
// RUN: rm -rf %t
|
||||
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/merge-implicit-special-members -verify %s
|
||||
// expected-no-diagnostics
|
||||
#include "c.h"
|
||||
int n = pthread_mutex_t().lock;
|
Loading…
x
Reference in New Issue
Block a user