Skip to content

Commit 63d2603

Browse files
usiemsmrbean-bremen
authored andcommitted
Handle (templated) functions with packed parameters
1 parent 690c1cc commit 63d2603

6 files changed

Lines changed: 33 additions & 11 deletions

File tree

generator/parser/ast.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ struct DeclaratorAST: public AST
384384
const ListNode<std::size_t> *fun_cv{};
385385
ExceptionSpecificationAST *exception_spec{};
386386
bool _override{};
387+
bool packedParameter{};
387388
ValueReferenceEnum valueRef{ UnspecifiedRef };
388389
};
389390

generator/parser/binder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,12 @@ void Binder::visitFunctionDefinition(FunctionDefinitionAST *node)
420420
// << qPrintable(name_cc.name()) << std::endl;
421421
return;
422422
}
423+
if (p.packedParameter) {
424+
//warnHere();
425+
//std::cerr << "** Skipping function with packed parameter: "
426+
// << qPrintable(name_cc.name()) << std::endl;
427+
return;
428+
}
423429
}
424430

425431
Q_ASSERT(! decl_cc.id().isEmpty());

generator/parser/declarator_compiler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ void DeclaratorCompiler::run(DeclaratorAST *node)
6464
_M_reference = false;
6565
_M_rvalue_reference = false;
6666
_M_variadics = false;
67+
_M_packed_parameter = false;
6768
_M_indirection = 0;
6869

6970
if (node)
@@ -81,6 +82,7 @@ void DeclaratorCompiler::run(DeclaratorAST *node)
8182
_M_function = (node->parameter_declaration_clause != 0);
8283
if (node->parameter_declaration_clause && node->parameter_declaration_clause->ellipsis)
8384
_M_variadics = true;
85+
_M_packed_parameter = node->packedParameter;
8486

8587
visitNodes(this, node->ptr_ops);
8688
visit(node->parameter_declaration_clause);
@@ -151,6 +153,7 @@ void DeclaratorCompiler::visitParameterDeclaration(ParameterDeclarationAST *node
151153

152154
p.name = decl_cc.id();
153155
p.type = CompilerUtils::typeDescription(node->type_specifier, node->declarator, _M_binder);
156+
p.packedParameter = decl_cc.isPackedParameter();
154157

155158
// ignore case a single void parameter
156159
if (_M_parameters.isEmpty() && p.name.isEmpty() && p.type.toString() == "void")

generator/parser/declarator_compiler.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@ class DeclaratorCompiler: protected DefaultVisitor
6060
TypeInfo type;
6161
QString name;
6262
QString defaultValueExpression;
63-
bool defaultValue;
63+
bool defaultValue{};
64+
bool packedParameter{};
6465

65-
Parameter(): defaultValue(false) {}
66+
Parameter() {}
6667
};
6768

6869
public:
@@ -76,6 +77,7 @@ class DeclaratorCompiler: protected DefaultVisitor
7677
inline bool isVariadics() const { return _M_variadics; }
7778
inline bool isReference() const { return _M_reference; }
7879
inline bool isRvalueReference() const { return _M_rvalue_reference; }
80+
inline bool isPackedParameter() const { return _M_packed_parameter; }
7981
inline int indirection() const { return _M_indirection; }
8082
inline QList<Parameter> parameters() const { return _M_parameters; }
8183

@@ -91,6 +93,7 @@ class DeclaratorCompiler: protected DefaultVisitor
9193
bool _M_reference;
9294
bool _M_rvalue_reference;
9395
bool _M_variadics;
96+
bool _M_packed_parameter;
9497
int _M_indirection;
9598
QString _M_id;
9699
QStringList _M_array;

generator/parser/parser.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,7 @@ bool Parser::parseTypeSpecifier(TypeSpecifierAST *&node)
12731273
return true;
12741274
}
12751275

1276-
bool Parser::parseDeclarator(DeclaratorAST *&node)
1276+
bool Parser::parseDeclarator(DeclaratorAST *&node, bool asParameter)
12771277
{
12781278
std::size_t start = token_stream.cursor();
12791279

@@ -1305,14 +1305,23 @@ bool Parser::parseDeclarator(DeclaratorAST *&node)
13051305
{
13061306
// unnamed bitfield
13071307
}
1308-
else if (parseName(declId, true))
1309-
{
1310-
ast->id = declId;
1311-
}
13121308
else
13131309
{
1314-
rewind(start);
1315-
return false;
1310+
if (asParameter && token_stream.lookAhead() == Token_ellipsis)
1311+
{
1312+
// parameter pack
1313+
nextToken();
1314+
ast->packedParameter = true;
1315+
}
1316+
if (parseName(declId, true))
1317+
{
1318+
ast->id = declId;
1319+
}
1320+
else
1321+
{
1322+
rewind(start);
1323+
return false;
1324+
}
13161325
}
13171326

13181327
if (token_stream.lookAhead() == ':')
@@ -1902,7 +1911,7 @@ bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node)
19021911
int index = (int) token_stream.cursor();
19031912

19041913
DeclaratorAST *decl = 0;
1905-
if (!parseDeclarator(decl))
1914+
if (!parseDeclarator(decl, /*asParameter=*/true))
19061915
{
19071916
rewind(index);
19081917

generator/parser/parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Parser
9393
bool parseDeclaration(DeclarationAST *&node);
9494
bool parseDeclarationInternal(DeclarationAST *&node);
9595
bool parseDeclarationStatement(StatementAST *&node);
96-
bool parseDeclarator(DeclaratorAST *&node);
96+
bool parseDeclarator(DeclaratorAST *&node, bool asParameter = false);
9797
bool parseDeclaratorParametersAndSuffix(DeclaratorAST* node);
9898
bool parseDeleteExpression(ExpressionAST *&node);
9999
bool parseDoStatement(StatementAST *&node);

0 commit comments

Comments
 (0)