diff options
-rw-r--r-- | clang/include/clang/Sema/Sema.h | 2 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 23 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 16 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/stress1/common.h | 14 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/stress1/merge00.h | 14 | ||||
-rw-r--r-- | clang/test/Modules/stress1.cpp | 5 |
7 files changed, 49 insertions, 28 deletions
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 9e07ad533f1..dde928ff914 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -592,7 +592,7 @@ public: /// WeakUndeclaredIdentifiers - Identifiers contained in /// \#pragma weak before declared. rare. may alias another /// identifier, declared or undeclared - llvm::DenseMap<IdentifierInfo*,WeakInfo> WeakUndeclaredIdentifiers; + llvm::MapVector<IdentifierInfo *, WeakInfo> WeakUndeclaredIdentifiers; /// ExtnameUndeclaredIdentifiers - Identifiers contained in /// \#pragma redefine_extname before declared. Used in Solaris system headers diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index a1a9b9d0b8c..6825dfa41fa 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -524,14 +524,8 @@ void Sema::LoadExternalWeakUndeclaredIdentifiers() { SmallVector<std::pair<IdentifierInfo *, WeakInfo>, 4> WeakIDs; ExternalSource->ReadWeakUndeclaredIdentifiers(WeakIDs); - for (unsigned I = 0, N = WeakIDs.size(); I != N; ++I) { - llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator Pos - = WeakUndeclaredIdentifiers.find(WeakIDs[I].first); - if (Pos != WeakUndeclaredIdentifiers.end()) - continue; - - WeakUndeclaredIdentifiers.insert(WeakIDs[I]); - } + for (auto &WeakID : WeakIDs) + WeakUndeclaredIdentifiers.insert(WeakID); } @@ -694,16 +688,13 @@ void Sema::ActOnEndOfTranslationUnit() { } // Check for #pragma weak identifiers that were never declared - // FIXME: This will cause diagnostics to be emitted in a non-determinstic - // order! Iterating over a densemap like this is bad. LoadExternalWeakUndeclaredIdentifiers(); - for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator - I = WeakUndeclaredIdentifiers.begin(), - E = WeakUndeclaredIdentifiers.end(); I != E; ++I) { - if (I->second.getUsed()) continue; + for (auto WeakID : WeakUndeclaredIdentifiers) { + if (WeakID.second.getUsed()) + continue; - Diag(I->second.getLocation(), diag::warn_weak_identifier_undeclared) - << I->first; + Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared) + << WeakID.first; } if (LangOpts.CPlusPlus11 && diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 336d222f17e..4ef62b9bb5d 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -5019,8 +5019,7 @@ void Sema::ProcessPragmaWeak(Scope *S, Decl *D) { ND = FD; if (ND) { if (IdentifierInfo *Id = ND->getIdentifier()) { - llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator I - = WeakUndeclaredIdentifiers.find(Id); + auto I = WeakUndeclaredIdentifiers.find(Id); if (I != WeakUndeclaredIdentifiers.end()) { WeakInfo W = I->second; DeclApplyPragmaWeak(S, ND, W); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 9f0626f060c..7227a97e7b9 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4359,15 +4359,13 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, // entire table, since later PCH files in a PCH chain are only interested in // the results at the end of the chain. RecordData WeakUndeclaredIdentifiers; - if (!SemaRef.WeakUndeclaredIdentifiers.empty()) { - for (llvm::DenseMap<IdentifierInfo*,WeakInfo>::iterator - I = SemaRef.WeakUndeclaredIdentifiers.begin(), - E = SemaRef.WeakUndeclaredIdentifiers.end(); I != E; ++I) { - AddIdentifierRef(I->first, WeakUndeclaredIdentifiers); - AddIdentifierRef(I->second.getAlias(), WeakUndeclaredIdentifiers); - AddSourceLocation(I->second.getLocation(), WeakUndeclaredIdentifiers); - WeakUndeclaredIdentifiers.push_back(I->second.getUsed()); - } + for (auto &WeakUndeclaredIdentifier : SemaRef.WeakUndeclaredIdentifiers) { + IdentifierInfo *II = WeakUndeclaredIdentifier.first; + WeakInfo &WI = WeakUndeclaredIdentifier.second; + AddIdentifierRef(II, WeakUndeclaredIdentifiers); + AddIdentifierRef(WI.getAlias(), WeakUndeclaredIdentifiers); + AddSourceLocation(WI.getLocation(), WeakUndeclaredIdentifiers); + WeakUndeclaredIdentifiers.push_back(WI.getUsed()); } // Build a record containing all of the ext_vector declarations. diff --git a/clang/test/Modules/Inputs/stress1/common.h b/clang/test/Modules/Inputs/stress1/common.h index d2fff1098d9..b158a8e6c1e 100644 --- a/clang/test/Modules/Inputs/stress1/common.h +++ b/clang/test/Modules/Inputs/stress1/common.h @@ -35,4 +35,18 @@ struct S01 {}; struct S02 {}; } +#pragma weak pragma_weak00 +#pragma weak pragma_weak01 +#pragma weak pragma_weak02 +#pragma weak pragma_weak03 +#pragma weak pragma_weak04 +#pragma weak pragma_weak05 + +extern "C" int pragma_weak00(); +extern "C" int pragma_weak01(); +extern "C" int pragma_weak02(); +extern "C" int pragma_weak03; +extern "C" int pragma_weak04; +extern "C" int pragma_weak05; + #endif diff --git a/clang/test/Modules/Inputs/stress1/merge00.h b/clang/test/Modules/Inputs/stress1/merge00.h index c6dccdf5305..b769b0877dd 100644 --- a/clang/test/Modules/Inputs/stress1/merge00.h +++ b/clang/test/Modules/Inputs/stress1/merge00.h @@ -1,6 +1,14 @@ #ifndef STRESS1_MERGE00_H #define STRESS1_MERGE00_H +// These don't match the imported declarations because we import them from +// modules which are built in isolation of the current header's pragma state +// much like they are built in isolation of the incoming macro state. +// FIXME: We should expect warnings here but we can't because verify doesn't +// work for modules. +//#pragma weak pragma_weak01 // expected-warning {{weak identifier 'pragma_weak01' never declared}} +//#pragma weak pragma_weak04 // expected-warning {{weak identifier 'pragma_waek04' never declared}} + #include "m00.h" #include "m01.h" #include "m02.h" @@ -8,4 +16,10 @@ inline int g() { return N00::S00('a').method00('b') + (int)N00::S00(42) + function00(42); } +#pragma weak pragma_weak02 +#pragma weak pragma_weak05 + +extern "C" int pragma_weak02(); +int pragma_weak05; + #endif diff --git a/clang/test/Modules/stress1.cpp b/clang/test/Modules/stress1.cpp index 55d9533b7ae..e03e538a3ce 100644 --- a/clang/test/Modules/stress1.cpp +++ b/clang/test/Modules/stress1.cpp @@ -98,3 +98,8 @@ #include "merge00.h" int f() { return N01::S00('a').method00('b') + (int)N00::S00(42) + function00(42) + g(); } + +int f2() { + return pragma_weak00() + pragma_weak01() + pragma_weak02() + + pragma_weak03 + pragma_weak04 + pragma_weak05; +} |