v9.CheckScriptFailure(lines, 'E1369: Duplicate member: val')
enddef
+" Test for accessing a private member outside a class in a def function
+def Test_private_member_access_outside_class()
+ # private object member variable
+ var lines =<< trim END
+ vim9script
+ class A
+ this._val = 10
+ def GetVal(): number
+ return this._val
+ enddef
+ endclass
+ def T()
+ var a = A.new()
+ a._val = 20
+ enddef
+ T()
+ END
+ v9.CheckScriptFailure(lines, 'E1333: Cannot access private member: _val')
+
+ # private class member variable
+ lines =<< trim END
+ vim9script
+ class A
+ static _val: number = 10
+ endclass
+ def T()
+ A._val = 20
+ enddef
+ T()
+ END
+ v9.CheckScriptFailure(lines, 'E1333: Cannot access private member: _val')
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
{
// for an object or class member get the type of the member
class_T *cl = lhs->lhs_type->tt_class;
+ // If it is private member variable, then accessing it outside the
+ // class is not allowed.
+ if (*(after + 1) == '_' && !inside_class(cctx, cl))
+ {
+ char_u *m_name = vim_strnsave(after + 1, lhs->lhs_end - after);
+ semsg(_(e_cannot_access_private_member_str), m_name);
+ vim_free(m_name);
+ return FAIL;
+ }
lhs->lhs_member_type = class_member_type(cl, after + 1,
lhs->lhs_end, &lhs->lhs_member_idx);
if (lhs->lhs_member_idx < 0)