Either by adding complexity (more features to the compiler) or dropping complexity (fewer C features in the implementation).
Did you ever look at that?
Edit: functions, enum, struct, arrays and maybe make all variables/functions a-z?
Edit2: https://joyofsource.com/projects/bootstrappable-tcc.html
How did you use this in your teaching? It seems like it could the basis for a longer term project that students could take in many directions.
What I'd love to do someday is to write a compiler for a fairly complete C subset in POSIX shell. The goal would be to use only a POSIX shell and this compiler to compile TCC, and then use TCC to bootstrap gcc, all from source. This would be a great tool for reproducible builds from source. If someone here finds this interesting and would like to help out, please reach out to me.