Regarding `keeping a pattern space comprising all text since the last match "Compiling", but there can be thousands of lines without an error. Would it be very inefficient?` - it probably wouldn't any less efficient than any alternative approach such as doing 2 passes of the input file to identify the matching pairs of delimiters before starting printing and it'd have the advantage that it will work whether the input is stored in a file or coming from a pipe.

Probably most efficient is just to use 2 calls to `tac` with `awk` if you're on a system that has `tac`:

 $ tac file | awk '/error:/{f=1; print "---separator---"} f; /^Compiling/{f=0}' | tac
 Compiling File3
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find A
 ---separator---
 Compiling File5
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find B
 ---separator---

Otherwise, just using any awk in any shell on every Unix box:

 $ awk '
 /^Compiling/ { buf="" }
 { buf = buf $0 "\n" }
 /^error:/ { print buf "---separator---" }
 ' file
 Compiling File3
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find A
 ---separator---
 Compiling File5
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find B
 ---separator---

Alternatively, using GNU awk for multi-char RS and RT:

 $ awk -v RS='\nerror:[^\n]+' -v ORS='\n---separator---\n' '
 sub(/(^|.*\n)Compiling/,"Compiling") { print $0 RT }
 ' file
 Compiling File3
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find A
 ---separator---
 Compiling File5
 ... commands ...
 In file included from ...
 In file included from ...
 In file included from ...
 error: could not find B
 ---separator---