diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 1ebb82ffadc..f3bfcc31440 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1449,6 +1449,11 @@ bool Moc::until(Token target) { --index; break; } + + if (braceCount <= 0 && t == SEMIC) { + // Abort on semicolon. Allow recovering bad template parsing (QTBUG-31218) + break; + } } if(target == COMMA && angleCount != 0 && possible != -1) { diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index e0179b393b3..923275d9284 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -79,6 +79,9 @@ QT_USE_NAMESPACE +template struct QTBUG_31218 {}; +struct QTBUG_31218_Derived : QTBUG_31218<-1<0> {}; + struct MyStruct {}; struct MyStruct2 {};