Skip to content

Commit 24d0a14

Browse files
authored
Merge pull request #1959 from Teemperor/cherry/cb81e662a58908913f342520e4c010564a68126a
[lldb] Reject redefinitions of persistent variables
2 parents bac4247 + d449c81 commit 24d0a14

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "lldb/Core/ModuleSpec.h"
2020
#include "lldb/Core/ValueObjectConstResult.h"
2121
#include "lldb/Core/ValueObjectVariable.h"
22+
#include "lldb/Expression/DiagnosticManager.h"
2223
#include "lldb/Expression/Materializer.h"
2324
#include "lldb/Symbol/CompileUnit.h"
2425
#include "lldb/Symbol/CompilerDecl.h"
@@ -125,6 +126,12 @@ void ClangExpressionDeclMap::InstallCodeGenerator(
125126
m_parser_vars->m_code_gen = code_gen;
126127
}
127128

129+
void ClangExpressionDeclMap::InstallDiagnosticManager(
130+
DiagnosticManager &diag_manager) {
131+
assert(m_parser_vars);
132+
m_parser_vars->m_diagnostics = &diag_manager;
133+
}
134+
128135
void ClangExpressionDeclMap::DidParse() {
129136
if (m_parser_vars && m_parser_vars->m_persistent_vars) {
130137
for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
@@ -196,6 +203,17 @@ bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl *decl,
196203
if (ast == nullptr)
197204
return false;
198205

206+
// Check if we already declared a persistent variable with the same name.
207+
if (lldb::ExpressionVariableSP conflicting_var =
208+
m_parser_vars->m_persistent_vars->GetVariable(name)) {
209+
std::string msg = llvm::formatv("redefinition of persistent variable '{0}'",
210+
name).str();
211+
m_parser_vars->m_diagnostics->AddDiagnostic(
212+
msg, DiagnosticSeverity::eDiagnosticSeverityError,
213+
DiagnosticOrigin::eDiagnosticOriginLLDB);
214+
return false;
215+
}
216+
199217
if (m_parser_vars->m_materializer && is_result) {
200218
Status err;
201219

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ class ClangExpressionDeclMap : public ClangASTSource {
102102

103103
void InstallCodeGenerator(clang::ASTConsumer *code_gen);
104104

105+
void InstallDiagnosticManager(DiagnosticManager &diag_manager);
106+
105107
/// Disable the state needed for parsing and IR transformation.
106108
void DidParse();
107109

@@ -330,6 +332,8 @@ class ClangExpressionDeclMap : public ClangASTSource {
330332
clang::ASTConsumer *m_code_gen = nullptr; ///< If non-NULL, a code generator
331333
///that receives new top-level
332334
///functions.
335+
DiagnosticManager *m_diagnostics = nullptr;
336+
333337
private:
334338
ParserVars(const ParserVars &) = delete;
335339
const ParserVars &operator=(const ParserVars &) = delete;

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,7 @@ ClangExpressionParser::ParseInternal(DiagnosticManager &diagnostic_manager,
10741074
ClangExpressionDeclMap *decl_map = type_system_helper->DeclMap();
10751075
if (decl_map) {
10761076
decl_map->InstallCodeGenerator(&m_compiler->getASTConsumer());
1077+
decl_map->InstallDiagnosticManager(diagnostic_manager);
10771078

10781079
clang::ExternalASTSource *ast_source = decl_map->CreateProxy();
10791080

lldb/test/API/commands/expression/persistent_variables/TestPersistentVariables.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,19 @@ def test_persistent_variables(self):
4141
# Test that $200 wasn't created by the previous expression.
4242
self.expect("expr $200", error=True,
4343
substrs=["use of undeclared identifier '$200'"])
44+
45+
# Try redeclaring the persistent variable with the same type.
46+
# This should be rejected as we treat them as if they are globals.
47+
self.expect("expr int $i = 123", error=True,
48+
substrs=["error: redefinition of persistent variable '$i'"])
49+
self.expect_expr("$i", result_type="int", result_value="5")
50+
51+
# Try redeclaring the persistent variable with another type. Should
52+
# also be rejected.
53+
self.expect("expr long $i = 123", error=True,
54+
substrs=["error: redefinition of persistent variable '$i'"])
55+
self.expect_expr("$i", result_type="int", result_value="5")
56+
57+
# Try assigning the persistent variable a new value.
58+
self.expect("expr $i = 55")
59+
self.expect_expr("$i", result_type="int", result_value="55")

0 commit comments

Comments
 (0)