forked from OSchip/llvm-project
[Expr] Check the language before ignoring Objective C keywords
Summary: This patch adds the check of the language before ignoring names like `id` or `Class`, which are reserved in Objective C, but are allowed in C++. It is needed to make it possible to evaluate expressions in a C++ program containing names like `id` or `Class`. Reviewers: jingham, zturner, labath, clayborg Reviewed By: jingham, clayborg Tags: #lldb Differential Revision: https://reviews.llvm.org/D54843 llvm-svn: 348240
This commit is contained in:
parent
9d432e0d14
commit
f335188925
|
@ -63,3 +63,16 @@ class ExprOptionsTestCase(TestBase):
|
|||
val = frame.EvaluateExpression('foo != nullptr', options)
|
||||
self.assertTrue(val.IsValid())
|
||||
self.assertFalse(val.GetError().Success())
|
||||
|
||||
# Make sure we can retrieve `id` variable if language is set to C++11:
|
||||
options.SetLanguage(lldb.eLanguageTypeC_plus_plus_11)
|
||||
val = frame.EvaluateExpression('id == 0', options)
|
||||
self.assertTrue(val.IsValid())
|
||||
self.assertTrue(val.GetError().Success())
|
||||
self.DebugSBValue(val)
|
||||
|
||||
# Make sure we can't retrieve `id` variable if language is set to ObjC:
|
||||
options.SetLanguage(lldb.eLanguageTypeObjC)
|
||||
val = frame.EvaluateExpression('id == 0', options)
|
||||
self.assertTrue(val.IsValid())
|
||||
self.assertFalse(val.GetError().Success())
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
extern "C" int foo(void);
|
||||
static int static_value = 0;
|
||||
static int id = 1234;
|
||||
|
||||
int
|
||||
bar()
|
||||
{
|
||||
static_value++;
|
||||
return static_value;
|
||||
id++;
|
||||
return static_value + id;
|
||||
}
|
||||
|
||||
int main (int argc, char const *argv[])
|
||||
|
|
|
@ -771,8 +771,9 @@ bool ClangASTSource::IgnoreName(const ConstString name,
|
|||
static const ConstString id_name("id");
|
||||
static const ConstString Class_name("Class");
|
||||
|
||||
if (name == id_name || name == Class_name)
|
||||
return true;
|
||||
if (m_ast_context->getLangOpts().ObjC)
|
||||
if (name == id_name || name == Class_name)
|
||||
return true;
|
||||
|
||||
StringRef name_string_ref = name.GetStringRef();
|
||||
|
||||
|
|
|
@ -398,10 +398,9 @@ ClangExpressionParser::ClangExpressionParser(ExecutionContextScope *exe_scope,
|
|||
LLVM_FALLTHROUGH;
|
||||
case lldb::eLanguageTypeC_plus_plus_03:
|
||||
m_compiler->getLangOpts().CPlusPlus = true;
|
||||
// FIXME: the following language option is a temporary workaround,
|
||||
// to "ask for C++, get ObjC++". Apple hopes to remove this requirement on
|
||||
// non-Apple platforms, but for now it is needed.
|
||||
m_compiler->getLangOpts().ObjC = true;
|
||||
if (process_sp)
|
||||
m_compiler->getLangOpts().ObjC =
|
||||
process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC) != nullptr;
|
||||
break;
|
||||
case lldb::eLanguageTypeObjC_plus_plus:
|
||||
case lldb::eLanguageTypeUnknown:
|
||||
|
|
Loading…
Reference in New Issue