diff --git a/xls/contrib/xlscc/translator.cc b/xls/contrib/xlscc/translator.cc index 7efb968835..3bff1fb550 100644 --- a/xls/contrib/xlscc/translator.cc +++ b/xls/contrib/xlscc/translator.cc @@ -1750,6 +1750,10 @@ absl::StatusOr Translator::CreateInitValue( if (initializer != nullptr) { LValueModeGuard lvalue_mode(*this); + XLS_ASSIGN_OR_RETURN(bool lvalue_result, ctype->ContainsLValues(*this)); + if (!lvalue_result) { + context().lvalue_mode = false; + } XLS_ASSIGN_OR_RETURN(CValue cv, GenerateIR_Expr(initializer, loc)); @@ -4830,7 +4834,15 @@ absl::StatusOr Translator::GenerateIR_Expr(const clang::Expr* expr, // Implicit dereference if (arr_val.type()->Is()) { XLSCC_CHECK_NE(arr_val.lvalue(), nullptr, loc); + CValue arr_val_orig = arr_val; + XLS_ASSIGN_OR_RETURN(arr_val, GenerateIR_Expr(arr_val.lvalue(), loc)); + + if (!arr_val.type()->Is()) { + return absl::UnimplementedError(ErrorMessage( + loc, "Dereference didn't yield an array type, but %s from %s", + std::string(*arr_val.type()), std::string(*arr_val_orig.type()))); + } } XLS_ASSIGN_OR_RETURN(CValue index_bval, diff --git a/xls/contrib/xlscc/unit_tests/translator_pointer_test.cc b/xls/contrib/xlscc/unit_tests/translator_pointer_test.cc index 06bdc0330f..10ca03ff8c 100644 --- a/xls/contrib/xlscc/unit_tests/translator_pointer_test.cc +++ b/xls/contrib/xlscc/unit_tests/translator_pointer_test.cc @@ -37,12 +37,23 @@ TEST_F(TranslatorPointerTest, ToArraySubscript) { const std::string content = R"( int my_package() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; - int*a = &arr[10]; + int*a = &arr[9]; return a[0]; })"; Run({}, 10, content); } +TEST_F(TranslatorPointerTest, ToArraySubscript2) { + const std::string content = R"( + int my_package() { + int arr[10] = {1,2,3,4,5,6,7,8,9,10}; + int*a = &arr[9]; + int b = a[0]; + return b; + })"; + Run({}, 10, content); +} + TEST_F(TranslatorPointerTest, AssignToPointer) { const std::string content = R"( int my_package() {