diff --git a/src/parser/cxx/type_checker.cc b/src/parser/cxx/type_checker.cc index 7e700b10..a2204824 100644 --- a/src/parser/cxx/type_checker.cc +++ b/src/parser/cxx/type_checker.cc @@ -2119,6 +2119,13 @@ auto TypeChecker::Visitor::check_member_access(MemberExpressionAST* ast) auto cv1 = strip_cv(objectType); if (ast->accessOp == TokenKind::T_MINUS_GREATER) { + if (control()->is_class_or_union(ast->baseExpression->type)) { + // todo: lookup operator-> in the class + } else { + (void)ensure_prvalue(ast->baseExpression); + objectType = ast->baseExpression->type; + } + auto pointerType = type_cast(objectType); if (!pointerType) return false; diff --git a/tests/unit_tests/sema/member_access_03.cc b/tests/unit_tests/sema/member_access_03.cc new file mode 100644 index 00000000..1168a43a --- /dev/null +++ b/tests/unit_tests/sema/member_access_03.cc @@ -0,0 +1,14 @@ +// RUN: %cxx -verify -fcheck -freport-missing-types %s + +struct X { + int a[1]; +}; + +struct S { + struct X x[2]; +}; + +int main() { + struct S s; + return s.x->a[0]; +} \ No newline at end of file