File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 ());
Original file line number Diff line number Diff 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" )
Original file line number Diff line number Diff 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
6869public:
@@ -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;
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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);
You can’t perform that action at this time.
0 commit comments