summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/Scope.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-05-30 14:14:58 +0000
committerSam McCall <sam.mccall@gmail.com>2018-05-30 14:14:58 +0000
commit5429bd751cc0729a3b2f49d8c346aa288cd8d2fc (patch)
treeecb7a8e0a08efc304285a887cc295f5915ffad96 /clang/lib/Sema/Scope.cpp
parent173e225f1c2f601536f2e625c05e46fe99ca22b1 (diff)
downloadbcm5719-llvm-5429bd751cc0729a3b2f49d8c346aa288cd8d2fc.tar.gz
bcm5719-llvm-5429bd751cc0729a3b2f49d8c346aa288cd8d2fc.zip
Revert "Update NRVO logic to support early return"
This reverts commit r333500, which causes stage2 compiler crashes. llvm-svn: 333547
Diffstat (limited to 'clang/lib/Sema/Scope.cpp')
-rw-r--r--clang/lib/Sema/Scope.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/clang/lib/Sema/Scope.cpp b/clang/lib/Sema/Scope.cpp
index 5a46ba26d29..eae5a328bfa 100644
--- a/clang/lib/Sema/Scope.cpp
+++ b/clang/lib/Sema/Scope.cpp
@@ -92,6 +92,7 @@ void Scope::Init(Scope *parent, unsigned flags) {
UsingDirectives.clear();
Entity = nullptr;
ErrorTrap.reset();
+ NRVO.setPointerAndInt(nullptr, 0);
}
bool Scope::containedInPrototypeScope() const {
@@ -118,15 +119,19 @@ void Scope::AddFlags(unsigned FlagsToSet) {
Flags |= FlagsToSet;
}
-void Scope::setNRVOCandidate(VarDecl *Candidate) {
- for (Decl *D : DeclsInScope) {
- VarDecl *VD = dyn_cast<VarDecl>(D);
- if (VD && VD != Candidate && VD->isNRVOCandidate())
- VD->setNRVOVariable(false);
+void Scope::mergeNRVOIntoParent() {
+ if (VarDecl *Candidate = NRVO.getPointer()) {
+ if (isDeclScope(Candidate))
+ Candidate->setNRVOVariable(true);
}
- if (Scope *parent = getParent())
- parent->setNRVOCandidate(Candidate);
+ if (getEntity())
+ return;
+
+ if (NRVO.getInt())
+ getParent()->setNoNRVO();
+ else if (NRVO.getPointer())
+ getParent()->addNRVOCandidate(NRVO.getPointer());
}
LLVM_DUMP_METHOD void Scope::dump() const { dumpImpl(llvm::errs()); }
@@ -186,4 +191,9 @@ void Scope::dumpImpl(raw_ostream &OS) const {
OS << "MSCurManglingNumber: " << getMSCurManglingNumber() << '\n';
if (const DeclContext *DC = getEntity())
OS << "Entity : (clang::DeclContext*)" << DC << '\n';
+
+ if (NRVO.getInt())
+ OS << "NRVO not allowed\n";
+ else if (NRVO.getPointer())
+ OS << "NRVO candidate : (clang::VarDecl*)" << NRVO.getPointer() << '\n';
}
OpenPOWER on IntegriCloud