summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Expression')
-rw-r--r--lldb/source/Expression/ASTResultSynthesizer.cpp19
-rw-r--r--lldb/source/Expression/ClangExpressionParser.cpp2
2 files changed, 19 insertions, 2 deletions
diff --git a/lldb/source/Expression/ASTResultSynthesizer.cpp b/lldb/source/Expression/ASTResultSynthesizer.cpp
index 2c7533864b5..f40266ce358 100644
--- a/lldb/source/Expression/ASTResultSynthesizer.cpp
+++ b/lldb/source/Expression/ASTResultSynthesizer.cpp
@@ -260,6 +260,21 @@ ASTResultSynthesizer::SynthesizeBodyResult (CompoundStmt *Body,
// No auxiliary variable necessary; expression returns void
return true;
+ // In C++11, last_expr can be a LValueToRvalue implicit cast. Strip that off if that's the
+ // case.
+
+ do {
+ ImplicitCastExpr *implicit_cast = dyn_cast<ImplicitCastExpr>(last_expr);
+
+ if (!implicit_cast)
+ break;
+
+ if (!implicit_cast->getCastKind() == CK_LValueToRValue)
+ break;
+
+ last_expr = implicit_cast->getSubExpr();
+ } while (0);
+
// is_lvalue is used to record whether the expression returns an assignable Lvalue or an
// Rvalue. This is relevant because they are handled differently.
//
@@ -354,7 +369,7 @@ ASTResultSynthesizer::SynthesizeBodyResult (CompoundStmt *Body,
ExprResult address_of_expr = m_sema->CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf, last_expr);
- m_sema->AddInitializerToDecl(result_decl, address_of_expr.take(), true, true);
+ m_sema->AddInitializerToDecl(result_decl, address_of_expr.take(), true, false);
}
else
{
@@ -373,7 +388,7 @@ ASTResultSynthesizer::SynthesizeBodyResult (CompoundStmt *Body,
if (!result_decl)
return false;
- m_sema->AddInitializerToDecl(result_decl, last_expr, true, true);
+ m_sema->AddInitializerToDecl(result_decl, last_expr, true, false);
}
DC->addDecl(result_decl);
diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp
index efc00cc95d7..ecf0547e745 100644
--- a/lldb/source/Expression/ClangExpressionParser.cpp
+++ b/lldb/source/Expression/ClangExpressionParser.cpp
@@ -215,12 +215,14 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope,
break;
case lldb::eLanguageTypeC_plus_plus:
m_compiler->getLangOpts().CPlusPlus = true;
+ m_compiler->getLangOpts().CPlusPlus0x = true;
break;
case lldb::eLanguageTypeObjC_plus_plus:
default:
m_compiler->getLangOpts().ObjC1 = true;
m_compiler->getLangOpts().ObjC2 = true;
m_compiler->getLangOpts().CPlusPlus = true;
+ m_compiler->getLangOpts().CPlusPlus0x = true;
break;
}
OpenPOWER on IntegriCloud