Skip to content

Commit 9d20f34

Browse files
committed
added parsing of rvalue references and skip functions that contain them (provided by [email protected])
1 parent 045d9dd commit 9d20f34

File tree

8 files changed

+31
-5
lines changed

8 files changed

+31
-5
lines changed

generator/parser/binder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,13 @@ void Binder::visitFunctionDefinition(FunctionDefinitionAST *node)
375375
}
376376

377377
decl_cc.run(declarator);
378+
foreach (DeclaratorCompiler::Parameter p, decl_cc.parameters()) {
379+
if (p.type.isRvalueReference()) {
380+
std::cerr << "** Skipping function with rvalue reference parameter: "
381+
<< qPrintable(name_cc.name()) << std::endl;
382+
return;
383+
}
384+
}
378385

379386
Q_ASSERT(! decl_cc.id().isEmpty());
380387

generator/parser/codemodel.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ TypeInfo TypeInfo::combine (const TypeInfo &__lhs, const TypeInfo &__rhs)
144144
__result.setConstant (__result.isConstant () || __rhs.isConstant ());
145145
__result.setVolatile (__result.isVolatile () || __rhs.isVolatile ());
146146
__result.setReference (__result.isReference () || __rhs.isReference ());
147+
__result.setRvalueReference (__result.isRvalueReference () || __rhs.isRvalueReference ());
147148
__result.setIndirections (__result.indirections () + __rhs.indirections ());
148149
__result.setArrayElements (__result.arrayElements () + __rhs.arrayElements ());
149150

@@ -187,7 +188,9 @@ QString TypeInfo::toString() const
187188
if (indirections())
188189
tmp += QString(indirections(), QLatin1Char('*'));
189190

190-
if (isReference())
191+
if (isRvalueReference())
192+
tmp += QLatin1String("&&");
193+
else if (isReference())
191194
tmp += QLatin1Char('&');
192195

193196
if (isFunctionPointer())

generator/parser/codemodel.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,13 @@ class TypeInfo
131131
: flags(other.flags),
132132
m_qualifiedName(other.m_qualifiedName),
133133
m_arrayElements(other.m_arrayElements),
134-
m_arguments(other.m_arguments)
134+
m_arguments(other.m_arguments),
135+
m_rvalue_reference(other.m_rvalue_reference)
135136
{
136137
}
137138

138139
TypeInfo():
139-
flags (0) {}
140+
flags (0), m_rvalue_reference(false) {}
140141

141142
QStringList qualifiedName() const { return m_qualifiedName; }
142143
void setQualifiedName(const QStringList &qualified_name) { m_qualifiedName = qualified_name; }
@@ -150,6 +151,9 @@ class TypeInfo
150151
bool isReference() const { return m_reference; }
151152
void setReference(bool is) { m_reference = is; }
152153

154+
bool isRvalueReference() const { return m_rvalue_reference; }
155+
void setRvalueReference(bool is) { m_rvalue_reference = is; }
156+
153157
int indirections() const { return m_indirections; }
154158
void setIndirections(int indirections) { m_indirections = indirections; }
155159

@@ -192,6 +196,7 @@ class TypeInfo
192196
QStringList m_qualifiedName;
193197
QStringList m_arrayElements;
194198
QList<TypeInfo> m_arguments;
199+
bool m_rvalue_reference;
195200
};
196201

197202
class _CodeModelItem: public QSharedData

generator/parser/compiler_utils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ TypeInfo CompilerUtils::typeDescription(TypeSpecifierAST *type_specifier, Declar
6060
typeInfo.setConstant (type_cc.isConstant ());
6161
typeInfo.setVolatile (type_cc.isVolatile ());
6262
typeInfo.setReference (decl_cc.isReference ());
63+
typeInfo.setRvalueReference (decl_cc.isRvalueReference ());
6364
typeInfo.setIndirections (decl_cc.indirection ());
6465
typeInfo.setArrayElements (decl_cc.arrayElements ());
6566

generator/parser/declarator_compiler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ void DeclaratorCompiler::run(DeclaratorAST *node)
6262
_M_array.clear();
6363
_M_function = false;
6464
_M_reference = false;
65+
_M_rvalue_reference = false;
6566
_M_variadics = false;
6667
_M_indirection = 0;
6768

@@ -116,6 +117,10 @@ void DeclaratorCompiler::visitPtrOperator(PtrOperatorAST *node)
116117

117118
switch (op)
118119
{
120+
case Token_and:
121+
_M_rvalue_reference = true;
122+
_M_reference = false;
123+
break;
119124
case '&':
120125
_M_reference = true;
121126
break;

generator/parser/declarator_compiler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class DeclaratorCompiler: protected DefaultVisitor
7575
inline bool isFunction() const { return _M_function; }
7676
inline bool isVariadics() const { return _M_variadics; }
7777
inline bool isReference() const { return _M_reference; }
78+
inline bool isRvalueReference() const { return _M_rvalue_reference; }
7879
inline int indirection() const { return _M_indirection; }
7980
inline QList<Parameter> parameters() const { return _M_parameters; }
8081

@@ -88,6 +89,7 @@ class DeclaratorCompiler: protected DefaultVisitor
8889

8990
bool _M_function;
9091
bool _M_reference;
92+
bool _M_rvalue_reference;
9193
bool _M_variadics;
9294
int _M_indirection;
9395
QString _M_id;

generator/parser/name_compiler.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ void NameCompiler::visitTemplateArgument(TemplateArgumentAST *node)
147147

148148
_M_name.last() += q.join("::");
149149

150-
if (decl_cc.isReference())
150+
if (decl_cc.isRvalueReference())
151+
_M_name.last() += "&&";
152+
else if (decl_cc.isReference())
151153
_M_name.last() += "&";
152154
if (decl_cc.indirection())
153155
_M_name.last() += QString(decl_cc.indirection(), '*');

generator/parser/parser.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ bool Parser::parsePtrOperator(PtrOperatorAST *&node)
10401040
{
10411041
int tk = token_stream.lookAhead();
10421042

1043-
if (tk != '&' && tk != '*'
1043+
if (tk != '&' && tk != Token_and && tk != '*'
10441044
&& tk != Token_scope && tk != Token_identifier)
10451045
{
10461046
return false;
@@ -1054,6 +1054,7 @@ bool Parser::parsePtrOperator(PtrOperatorAST *&node)
10541054
{
10551055
case '&':
10561056
case '*':
1057+
case Token_and:
10571058
ast->op = token_stream.cursor();
10581059
token_stream.nextToken();
10591060
break;

0 commit comments

Comments
 (0)