diff --git a/src/linguist/shared/qmakeparser.cpp b/src/linguist/shared/qmakeparser.cpp
index 0dbc3ce07be49bbe57e8770a99c56200eb2c1910..93c7a54ab3ef8a17f92c3630e9229818b531571a 100644
--- a/src/linguist/shared/qmakeparser.cpp
+++ b/src/linguist/shared/qmakeparser.cpp
@@ -1024,7 +1024,6 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
             m_tmp.setRawData((QChar *)uc + 4, nlen);
             const QString *defName;
             ushort defType;
-            uchar nest;
             if (m_tmp == statics.strfor) {
                 if (m_invert || m_operator == OrOperator) {
                     // '|' could actually work reasonably, but qmake does nonsense here.
@@ -1101,13 +1100,20 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
                 parseError(fL1S("%1(function) requires one literal argument.").arg(*defName));
                 return;
             } else if (m_tmp == statics.strreturn) {
-                if (argc > 1) {
-                    parseError(fL1S("return() requires zero or one argument."));
-                    bogusTest(tokPtr);
-                    return;
+                if (m_blockstack.top().nest & NestFunction) {
+                    if (argc > 1) {
+                        parseError(fL1S("return() requires zero or one argument."));
+                        bogusTest(tokPtr);
+                        return;
+                    }
+                } else {
+                    if (*uce != TokFuncTerminator) {
+                        parseError(fL1S("Top-level return() requires zero arguments."));
+                        bogusTest(tokPtr);
+                        return;
+                    }
                 }
                 defType = TokReturn;
-                nest = NestFunction;
                 goto ctrlstm2;
             } else if (m_tmp == statics.strnext) {
                 defType = TokNext;
@@ -1120,15 +1126,14 @@ void QMakeParser::finalizeCall(ushort *&tokPtr, ushort *uc, ushort *ptr, int arg
                     bogusTest(tokPtr);
                     return;
                 }
-                nest = NestLoop;
-              ctrlstm2:
-                if (m_invert) {
-                    parseError(fL1S("Unexpected NOT operator in front of %1().").arg(m_tmp));
+                if (!(m_blockstack.top().nest & NestLoop)) {
+                    parseError(fL1S("Unexpected %1().").arg(m_tmp));
                     bogusTest(tokPtr);
                     return;
                 }
-                if (!(m_blockstack.top().nest & nest)) {
-                    parseError(fL1S("Unexpected %1().").arg(m_tmp));
+              ctrlstm2:
+                if (m_invert) {
+                    parseError(fL1S("Unexpected NOT operator in front of %1().").arg(m_tmp));
                     bogusTest(tokPtr);
                     return;
                 }