Skip to content

Commit fcc74a4

Browse files
committed
issue #10618 C++ consteval functions need label
Adding analogous to `constexpr`: - `constinit` (C++20) - `consteval` (C++20)
1 parent 77cff91 commit fcc74a4

File tree

7 files changed

+100
-2
lines changed

7 files changed

+100
-2
lines changed

addon/doxmlparser/doxmlparser/compound.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3964,7 +3964,7 @@ class memberdefType(GeneratedsSuper):
39643964
__hash__ = GeneratedsSuper.__hash__
39653965
subclass = None
39663966
superclass = None
3967-
def __init__(self, kind=None, id=None, prot=None, static=None, extern=None, strong=None, const=None, explicit=None, inline=None, refqual=None, virt=None, volatile=None, mutable=None, noexcept=None, constexpr=None, readable=None, writable=None, initonly=None, settable=None, privatesettable=None, protectedsettable=None, gettable=None, privategettable=None, protectedgettable=None, final=None, sealed=None, new=None, add=None, remove=None, raise_=None, optional=None, required=None, accessor=None, attribute=None, property=None, readonly=None, bound=None, removable=None, constrained=None, transient=None, maybevoid=None, maybedefault=None, maybeambiguous=None, templateparamlist=None, type_=None, definition=None, argsstring=None, name=None, qualifiedname=None, read=None, write=None, bitfield=None, reimplements=None, reimplementedby=None, qualifier=None, param=None, enumvalue=None, requiresclause=None, initializer=None, exceptions=None, briefdescription=None, detaileddescription=None, inbodydescription=None, location=None, references=None, referencedby=None, gds_collector_=None, **kwargs_):
3967+
def __init__(self, kind=None, id=None, prot=None, static=None, extern=None, strong=None, const=None, explicit=None, inline=None, refqual=None, virt=None, volatile=None, mutable=None, noexcept=None, constexpr=None, consteval=None, constinit=None, readable=None, writable=None, initonly=None, settable=None, privatesettable=None, protectedsettable=None, gettable=None, privategettable=None, protectedgettable=None, final=None, sealed=None, new=None, add=None, remove=None, raise_=None, optional=None, required=None, accessor=None, attribute=None, property=None, readonly=None, bound=None, removable=None, constrained=None, transient=None, maybevoid=None, maybedefault=None, maybeambiguous=None, templateparamlist=None, type_=None, definition=None, argsstring=None, name=None, qualifiedname=None, read=None, write=None, bitfield=None, reimplements=None, reimplementedby=None, qualifier=None, param=None, enumvalue=None, requiresclause=None, initializer=None, exceptions=None, briefdescription=None, detaileddescription=None, inbodydescription=None, location=None, references=None, referencedby=None, gds_collector_=None, **kwargs_):
39683968
self.gds_collector_ = gds_collector_
39693969
self.gds_elementtree_node_ = None
39703970
self.original_tagname_ = None
@@ -4000,6 +4000,10 @@ def __init__(self, kind=None, id=None, prot=None, static=None, extern=None, stro
40004000
self.noexcept_nsprefix_ = None
40014001
self.constexpr = _cast(None, constexpr)
40024002
self.constexpr_nsprefix_ = None
4003+
self.consteval = _cast(None, consteval)
4004+
self.consteval_nsprefix_ = None
4005+
self.constinit = _cast(None, constinit)
4006+
self.constinit_nsprefix_ = None
40034007
self.readable = _cast(None, readable)
40044008
self.readable_nsprefix_ = None
40054009
self.writable = _cast(None, writable)
@@ -4332,6 +4336,14 @@ def get_constexpr(self):
43324336
return self.constexpr
43334337
def set_constexpr(self, constexpr):
43344338
self.constexpr = constexpr
4339+
def get_consteval(self):
4340+
return self.consteval
4341+
def set_consteval(self, consteval):
4342+
self.consteval = consteval
4343+
def get_constinit(self):
4344+
return self.constinit
4345+
def set_constinit(self, constinit):
4346+
self.constinit = constinit
43354347
def get_readable(self):
43364348
return self.readable
43374349
def set_readable(self, readable):
@@ -4620,6 +4632,12 @@ def exportAttributes(self, outfile, level, already_processed, namespaceprefix_='
46204632
if self.constexpr is not None and 'constexpr' not in already_processed:
46214633
already_processed.add('constexpr')
46224634
outfile.write(' constexpr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.constexpr), input_name='constexpr')), ))
4635+
if self.consteval is not None and 'consteval' not in already_processed:
4636+
already_processed.add('consteval')
4637+
outfile.write(' consteval=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.consteval), input_name='consteval')), ))
4638+
if self.constinit is not None and 'constinit' not in already_processed:
4639+
already_processed.add('constinit')
4640+
outfile.write(' constinit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.constinit), input_name='constinit')), ))
46234641
if self.readable is not None and 'readable' not in already_processed:
46244642
already_processed.add('readable')
46254643
outfile.write(' readable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.readable), input_name='readable')), ))
@@ -4872,6 +4890,16 @@ def buildAttributes(self, node, attrs, already_processed):
48724890
already_processed.add('constexpr')
48734891
self.constexpr = value
48744892
self.validate_DoxBool(self.constexpr) # validate type DoxBool
4893+
value = find_attr_value_('consteval', node)
4894+
if value is not None and 'consteval' not in already_processed:
4895+
already_processed.add('consteval')
4896+
self.consteval = value
4897+
self.validate_DoxBool(self.consteval) # validate type DoxBool
4898+
value = find_attr_value_('constinit', node)
4899+
if value is not None and 'constinit' not in already_processed:
4900+
already_processed.add('constinit')
4901+
self.constinit = value
4902+
self.validate_DoxBool(self.constinit) # validate type DoxBool
48754903
value = find_attr_value_('readable', node)
48764904
if value is not None and 'readable' not in already_processed:
48774905
already_processed.add('readable')

src/memberdef.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
179179
bool livesInsideEnum() const override;
180180
bool isSliceLocal() const override;
181181
bool isConstExpr() const override;
182+
bool isConstEval() const override;
183+
bool isConstInit() const override;
182184
int numberOfFlowKeyWords() const override;
183185
bool isFriendToHide() const override;
184186
bool isNotFriend() const override;
@@ -775,6 +777,10 @@ class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
775777
{ return getMdAlias()->isSliceLocal(); }
776778
bool isConstExpr() const override
777779
{ return getMdAlias()->isConstExpr(); }
780+
bool isConstEval() const override
781+
{ return getMdAlias()->isConstEval(); }
782+
bool isConstInit() const override
783+
{ return getMdAlias()->isConstInit(); }
778784
int numberOfFlowKeyWords() const override
779785
{ return getMdAlias()->numberOfFlowKeyWords(); }
780786
bool isFriendToHide() const override
@@ -2798,6 +2804,8 @@ StringVector MemberDefImpl::getLabels(const Definition *container) const
27982804
if (isPrivateSettable()) sl.push_back("private set");
27992805
}
28002806
if (isConstExpr()) sl.push_back("constexpr");
2807+
if (isConstEval()) sl.push_back("consteval");
2808+
if (isConstInit()) sl.push_back("constinit");
28012809
if (isAddable()) sl.push_back("add");
28022810
if (!isUNOProperty() && isRemovable()) sl.push_back("remove");
28032811
if (isRaisable()) sl.push_back("raise");
@@ -5491,6 +5499,16 @@ bool MemberDefImpl::isConstExpr() const
54915499
return m_memSpec.isConstExpr();
54925500
}
54935501

5502+
bool MemberDefImpl::isConstEval() const
5503+
{
5504+
return m_memSpec.isConstEval();
5505+
}
5506+
5507+
bool MemberDefImpl::isConstInit() const
5508+
{
5509+
return m_memSpec.isConstInit();
5510+
}
5511+
54945512
const MemberVector &MemberDefImpl::enumFieldList() const
54955513
{
54965514
return m_enumFields;

src/memberdef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ class MemberDef : public Definition
187187
virtual bool livesInsideEnum() const = 0;
188188
virtual bool isSliceLocal() const = 0;
189189
virtual bool isConstExpr() const = 0;
190+
virtual bool isConstEval() const = 0;
191+
virtual bool isConstInit() const = 0;
190192
virtual int numberOfFlowKeyWords() const = 0;
191193

192194
// derived getters

src/scanner.l

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,20 @@ NONLopt [^\n]*
12381238
}
12391239
REJECT;
12401240
}
1241+
<FindMembers>{B}*"consteval"{BN}+ {
1242+
if (yyextra->insideCpp)
1243+
{
1244+
yyextra->current->spec.setConstEval(true);
1245+
}
1246+
REJECT;
1247+
}
1248+
<FindMembers>{B}*"constinit"{BN}+ {
1249+
if (yyextra->insideCpp)
1250+
{
1251+
yyextra->current->spec.setConstInit(true);
1252+
}
1253+
REJECT;
1254+
}
12411255
<FindMembers>{B}*"published"{BN}+ { // UNO IDL published keyword
12421256
if (yyextra->insideIDL)
12431257
{
@@ -2507,6 +2521,30 @@ NONLopt [^\n]*
25072521
}
25082522
yyextra->current->name=yyextra->current->name.mid(10);
25092523
}
2524+
else if (yyextra->current->name.startsWith("consteval "))
2525+
{
2526+
if (yyextra->current->type.isEmpty())
2527+
{
2528+
yyextra->current->type="consteval";
2529+
}
2530+
else
2531+
{
2532+
yyextra->current->type+="consteval ";
2533+
}
2534+
yyextra->current->name=yyextra->current->name.mid(10);
2535+
}
2536+
else if (yyextra->current->name.startsWith("constinit "))
2537+
{
2538+
if (yyextra->current->type.isEmpty())
2539+
{
2540+
yyextra->current->type="constinit";
2541+
}
2542+
else
2543+
{
2544+
yyextra->current->type+="constinit ";
2545+
}
2546+
yyextra->current->name=yyextra->current->name.mid(10);
2547+
}
25102548
else if (yyextra->current->name.startsWith("const "))
25112549
{
25122550
if (yyextra->current->type.isEmpty())

src/types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ class LocalToc
373373
/* 45 */ TSPEC(Strong) TSPEC(Weak) TSPEC(Unretained) TSPEC(Alias) TSPEC(ConstExp) \
374374
/* 50 */ TSPEC(Default) TSPEC(Delete) TSPEC(NoExcept) TSPEC(Attribute) TSPEC(Property) \
375375
/* 55 */ TSPEC(Readonly) TSPEC(Bound) TSPEC(Constrained) TSPEC(Transient) TSPEC(MaybeVoid) \
376-
/* 60 */ TSPEC(MaybeDefault) TSPEC(MaybeAmbiguous) TSPEC(Published)
376+
/* 60 */ TSPEC(MaybeDefault) TSPEC(MaybeAmbiguous) TSPEC(Published) TSPEC(ConstEval) TSPEC(ConstInit)
377377

378378
/** Wrapper class for a number of boolean properties.
379379
* The properties are packed together, and initialized to false.

src/xmlgen.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,16 @@ static void generateXMLForMember(const MemberDef *md,TextStream &ti,TextStream &
647647
t << " constexpr=\"yes\"";
648648
}
649649

650+
if (md->isConstEval())
651+
{
652+
t << " consteval=\"yes\"";
653+
}
654+
655+
if (md->isConstInit())
656+
{
657+
t << " constinit=\"yes\"";
658+
}
659+
650660
if (md->isExternal())
651661
{
652662
t << " extern=\"yes\"";

templates/xml/compound.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@
221221
<xsd:attribute name="mutable" type="DoxBool" use="optional"/>
222222
<xsd:attribute name="noexcept" type="DoxBool" use="optional"/>
223223
<xsd:attribute name="constexpr" type="DoxBool" use="optional"/>
224+
<xsd:attribute name="consteval" type="DoxBool" use="optional"/>
225+
<xsd:attribute name="constinit" type="DoxBool" use="optional"/>
224226
<!-- Qt property -->
225227
<xsd:attribute name="readable" type="DoxBool" use="optional"/>
226228
<xsd:attribute name="writable" type="DoxBool" use="optional"/>

0 commit comments

Comments
 (0)