In bind_comp_words, the readonly attribute is unconditionally removed from COMP_WORDS, even if that variable is a nameref. This allows unsetting the readonly attribute on any arbitrary variable.
v = find_variable ("COMP_WORDS");
if (v == 0)
v = make_new_array_variable ("COMP_WORDS");
if (readonly_p (v))
VUNSETATTR (v, att_readonly);
For example:
$ readonly var=foo
$ declare -n COMP_WORDS=var
$ f() { :; }
$ compgen -F f .
bash: compgen: warning: -F option may not work as you expect
$ declare -p var
declare -a var=([0]="foo")
I'm not sure why shooting yourself in the foot by making COMP_WORDS readonly should be forbidden, since the readonly attribute is not removed from any of the other COMP_* variables.