diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-02-29 03:16:56 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-02-29 03:16:56 +0000 |
commit | ac6260187b6b2f26faa9264d170d649a501f58a9 (patch) | |
tree | a6b10c78e37cd077116267fe9d014c6941642b50 /lib/Sema/SemaExpr.cpp | |
parent | b732fcebcf2ce5c24a29d660e9400d7dc9f86b69 (diff) |
Make the odr-use logic work correctly for constant-expressions. PR12006.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151699 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 30a02b2953..5a2b2dc7e9 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -10023,6 +10023,18 @@ void Sema::UpdateMarkingForLValueToRValue(Expr *E) { MaybeODRUseExprs.erase(E->IgnoreParens()); } +ExprResult Sema::ActOnConstantExpression(ExprResult Res) { + if (!Res.isUsable()) + return Res; + + // If a constant-expression is a reference to a variable where we delay + // deciding whether it is an odr-use, just assume we will apply the + // lvalue-to-rvalue conversion. In the one case where this doesn't happen + // (a non-type template argument), we have special handling anyway. + UpdateMarkingForLValueToRValue(Res.get()); + return Res; +} + void Sema::CleanupVarDeclMarking() { for (llvm::SmallPtrSetIterator<Expr*> i = MaybeODRUseExprs.begin(), e = MaybeODRUseExprs.end(); |