summaryrefslogtreecommitdiffstats
path: root/src/tools/moc/moc.cpp
diff options
context:
space:
mode:
authorMårten Nordheim <marten.nordheim@qt.io>2020-04-23 15:32:32 +0200
committerMårten Nordheim <marten.nordheim@qt.io>2021-05-04 01:39:48 +0200
commit12b8283f899ebcf401d974927314b9531334a56e (patch)
tree823f5266f1f047507e46c2f550c57a2383ef6277 /src/tools/moc/moc.cpp
parente3e070e87b3a8036f7200755ba32b57437304ee6 (diff)
Moc: parse trailing return type
Pick-to: 5.15 6.1 Fixes: QTBUG-71123 Change-Id: I1c3749f0892fddcc433c9afcb1d6d7c30c97c9d9 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/tools/moc/moc.cpp')
-rw-r--r--src/tools/moc/moc.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index a66eda6f86..c8fe0e9a83 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -198,6 +198,7 @@ Type Moc::parseType()
case DOUBLE:
case VOID:
case BOOL:
+ case AUTO:
type.name += lexem();
isVoid |= (lookup(0) == VOID);
break;
@@ -467,15 +468,6 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro)
scopedFunctionName = tempType.isScoped;
}
- // we don't support references as return types, it's too dangerous
- if (def->type.referenceType == Type::Reference) {
- QByteArray rawName = def->type.rawName;
- def->type = Type("void");
- def->type.rawName = rawName;
- }
-
- def->normalizedType = normalizeType(def->type.name);
-
if (!test(RPAREN)) {
parseFunctionArguments(def);
next(RPAREN);
@@ -498,6 +490,10 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro)
next(LPAREN);
until(RPAREN);
}
+
+ if (def->type.name == "auto" && test(ARROW))
+ def->type = parseType(); // Parse trailing return-type
+
if (test(SEMIC))
;
else if ((def->inlineCode = test(LBRACE)))
@@ -515,6 +511,22 @@ bool Moc::parseFunction(FunctionDef *def, bool inMacro)
warning(msg.constData());
return false;
}
+
+ QList<QByteArray> typeNameParts = normalizeType(def->type.name).split(' ');
+ if (typeNameParts.contains("auto")) {
+ // We expected a trailing return type but we haven't seen one
+ error("Function declared with auto as return type but missing trailing return type. "
+ "Return type deduction is not supported.");
+ }
+
+ // we don't support references as return types, it's too dangerous
+ if (def->type.referenceType == Type::Reference) {
+ QByteArray rawName = def->type.rawName;
+ def->type = Type("void");
+ def->type.rawName = rawName;
+ }
+
+ def->normalizedType = normalizeType(def->type.name);
return true;
}