What is Gaussian16's read-file logic when using ONIOM with genecp?

I want to use the ONIOM keyword, like oniom(ccsd(t)/avtz:m06/genEcp) or similar, in conjunction with genecp. I want to use genEcp in the low-layer, but I always get an error about L301, error in reading basis or pseudo in the end of input file.

If change the sequence, like oniom(m06/genEcp:ccsd(t)/avtz), everything is OK, but that's not what I want and it is wrong both in theory and answer. Someone said it's a bug on this chinese site, but I don't know how to avoid it.

Also, the tests from g16, test1009.com test0369.com are OK. I tried the oniom(ccsd(t)/gen:m06/genecp) similar with test0369.com and failed.

I think this is a severe bug, for one can repeat the error just by changing the keyword in the input below from blyp to b3lyp, or element from Ti to Ar.

#p oniom(HF/gen:blyp/genecp)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He 0
sto-3g
****
Ti 0
lanl2dz
****

Ti 0
lanl2dz


I am not very well versed with ONIOM calculations, so I cannot really comment, whether my following examples are actually sensible, I just picked your example with different methods.
I think the biggest problem here is the lack of a real description of ONIOM for Gaussian, especially when it comes to defining general basis sets. Long story short, and if you don't like my rambling, check out g16/tests/com/test0699.com. In brief, if you use oniom(x/genecp:y/genecp), you'll need three complete sections of general basis sets: low-level real system, high-level model system, low-level model system.

As you have noticed something like oniom(CCSD(T)/cc-pVTZ:M06/def2SVP) will run perfectly fine. There is nothing special about that, Gaussian uses all of its default implementations and files.
From what I understood, a two-layer calculation will first perform a low-level calculation on the real system, then the high-level calculation on the model system, then the low-level calculation on the model system.

Input 1

#P TEST oniom(CCSD(T)/cc-pVTZ:M06/def2SVP)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

!~eof


The issue comes when specifying the general basis. If you want to specify a basis for the high level, it is still somewhat normal, so the above can be rewritten as following.

Input 2

#P TEST oniom(CCSD(T)/gen:M06/def2SVP)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He 0
cc-pVTZ
****

!~eof


So far so good, but what do you need to do to change the level for the lower layer? That is not quite as simple. Let's use the example and just switch it around.

Input 3 (broken)

#P TEST oniom(CCSD(T)/cc-pVTZ:M06/gen)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He Ti 0
def2SVP
****

!~eof


It will run the low-level calculation on the system (RMO6/gen), then run the high-level calculation (CCSD(T)/cc-pVTZ), then abort with the error in 301:

General basis read from cards:  (5D, 7F)
End of file reading basis center.


It needs a general basis for the low-level calculation of the model system, if you add that, everything will work. Therefore, Input 1 can be rewritten as:

Input 3 (fixed)

#P TEST oniom(CCSD(T)/cc-pVTZ:M06/gen)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He Ti 0
def2SVP
****

He 0
def2SVP
****

!~eof


From here on in it may be quite obvious what to do to run it with two different general basis sets. Simply specify them in the order as you would specify the charge: low-level real system (everything), high-level model system (layer H), low-level model system (layer H).

Input 4

#P TEST oniom(CCSD(T)/gen:M06/gen)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He Ti 0
def2SVP
****

He 0
cc-pVTZ
****

He 0
def2SVP
****

!~eof


Now, let's finish this with the ecp settings. Here it is especially important to keep track of the blank lines. Even though helium will not have an ECP, Gaussian will want to read that section. Since it is terminated by a blank line, at least that must be there. Otherwise you will get the following error in L301:

EOF while reading ECP pointer card.


The following input should reproduce your example.

#P TEST oniom(HF/genecp:BLYP/genecp)

Title Card Required

0 1
He                0    0.0 0.0 0.0 H
Ti                0    0.0 0.0 4.0 L

He 0
STO-3G
****
Ti 0
LANL2DZ
****

Ti 0
LANL2DZ

He 0
def2SVP
****

He 0
STO-3G
****

!~eof


So I would say the bug is not in the code itself, but in the documentation.