#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/ValueObjectConstResult.h"
#include "lldb/Core/ValueObjectVariable.h"
+#include "lldb/Expression/DiagnosticManager.h"
#include "lldb/Expression/Materializer.h"
#include "lldb/Symbol/CompileUnit.h"
#include "lldb/Symbol/CompilerDecl.h"
m_parser_vars->m_code_gen = code_gen;
}
+void ClangExpressionDeclMap::InstallDiagnosticManager(
+ DiagnosticManager &diag_manager) {
+ assert(m_parser_vars);
+ m_parser_vars->m_diagnostics = &diag_manager;
+}
+
void ClangExpressionDeclMap::DidParse() {
if (m_parser_vars && m_parser_vars->m_persistent_vars) {
for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
if (ast == nullptr)
return false;
+ // Check if we already declared a persistent variable with the same name.
+ if (lldb::ExpressionVariableSP conflicting_var =
+ m_parser_vars->m_persistent_vars->GetVariable(name)) {
+ std::string msg = llvm::formatv("redefinition of persistent variable '{0}'",
+ name).str();
+ m_parser_vars->m_diagnostics->AddDiagnostic(
+ msg, DiagnosticSeverity::eDiagnosticSeverityError,
+ DiagnosticOrigin::eDiagnosticOriginLLDB);
+ return false;
+ }
+
if (m_parser_vars->m_materializer && is_result) {
Status err;
void InstallCodeGenerator(clang::ASTConsumer *code_gen);
+ void InstallDiagnosticManager(DiagnosticManager &diag_manager);
+
/// Disable the state needed for parsing and IR transformation.
void DidParse();
clang::ASTConsumer *m_code_gen = nullptr; ///< If non-NULL, a code generator
///that receives new top-level
///functions.
+ DiagnosticManager *m_diagnostics = nullptr;
+
private:
ParserVars(const ParserVars &) = delete;
const ParserVars &operator=(const ParserVars &) = delete;
ClangExpressionDeclMap *decl_map = type_system_helper->DeclMap();
if (decl_map) {
decl_map->InstallCodeGenerator(&m_compiler->getASTConsumer());
+ decl_map->InstallDiagnosticManager(diagnostic_manager);
clang::ExternalASTSource *ast_source = decl_map->CreateProxy();
# Test that $200 wasn't created by the previous expression.
self.expect("expr $200", error=True,
substrs=["use of undeclared identifier '$200'"])
+
+ # Try redeclaring the persistent variable with the same type.
+ # This should be rejected as we treat them as if they are globals.
+ self.expect("expr int $i = 123", error=True,
+ substrs=["error: redefinition of persistent variable '$i'"])
+ self.expect_expr("$i", result_type="int", result_value="5")
+
+ # Try redeclaring the persistent variable with another type. Should
+ # also be rejected.
+ self.expect("expr long $i = 123", error=True,
+ substrs=["error: redefinition of persistent variable '$i'"])
+ self.expect_expr("$i", result_type="int", result_value="5")
+
+ # Try assigning the persistent variable a new value.
+ self.expect("expr $i = 55")
+ self.expect_expr("$i", result_type="int", result_value="55")