Skip to content

Commit 67e858d

Browse files
committed
Round 12+13: new-expr fix, constexpr return type, template args in expression
Parser: - stripMatchingNew: only strip new when declared/new types share base name - parseTypeRef: constexpr no longer marks return type as const - looksLikeTemplateArgList: fixed to not fire in parseRelational context - parsePrimary: qualified names (std::foo<T>) now parsed as Identifier with template args even when not followed by () - ref-to-array param dims: use parseExpr to handle N+1 expressions - Compound boolean template args: && correctly reconstructed when consumed by parseTypeRef CodeGen: - static constexpr members emit constexpr keyword - operator[] and operator() not emitted as friend CppBuild: - preprocessMacros: strip #include before g++ -E - removePSketchFromDataStructs: skip template classes
1 parent 3e46f90 commit 67e858d

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

mode/CppMode.jar

399 Bytes
Binary file not shown.

src/java/Parser.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,7 +1696,16 @@ private TypeRef parseTypeRefAfterConst(boolean isConst) {
16961696
matchKeyword("volatile"); // similarly for volatile
16971697
}
16981698
boolean isReference = matchOp("&");
1699-
boolean isRvalueRef = !isReference && matchOp("&&");
1699+
// Only consume && as rvalue-ref if followed by a name or * (not = or binary operator context)
1700+
boolean isRvalueRef = !isReference && checkOp("&&")
1701+
&& pos + 1 < tokens.size()
1702+
&& (tokens.get(pos + 1).type() == CppLexerTokenType.IDENTIFIER
1703+
|| tokens.get(pos + 1).type() == CppLexerTokenType.KEYWORD
1704+
|| tokens.get(pos + 1).isOp("*")
1705+
|| tokens.get(pos + 1).isPunct(")")
1706+
|| tokens.get(pos + 1).isPunct(",")
1707+
|| tokens.get(pos + 1).isPunct(">"));
1708+
if (isRvalueRef) advance();
17001709

17011710
return new NamedType(baseName, templateArgs, pointerDepth, isReference, isConst, isRvalueRef);
17021711
}
@@ -2672,6 +2681,26 @@ else if (checkPunct(",") && depth == 0) {
26722681
String rendered = joined + "<" + renderTemplateArgs(templateArgs) + ">";
26732682
return new Identifier(rendered, t.line(), t.col(), List.of());
26742683
}
2684+
// Non-call template use: "std::is_arithmetic_v<T>" (no "(" after ">")
2685+
if (checkOp("<") && looksLikeTemplateArgList()) {
2686+
int argStart = pos; advance(); int _d=1, _pd=0, _bd=0;
2687+
while (!isAtEnd() && _d > 0) {
2688+
if (checkPunct("(")||checkPunct("[")) _pd++;
2689+
else if (checkPunct(")")||checkPunct("]")) _pd--;
2690+
else if (checkPunct("{")) _bd++;
2691+
else if (checkPunct("}")) _bd--;
2692+
else if (_pd==0&&_bd==0) {
2693+
if (checkOp("<")) _d++;
2694+
else if (checkOp(">")) { _d--; if(_d==0){advance();break;} }
2695+
else if (checkOp(">>")) { _d-=2; splitTrailingShiftIntoTwoCloseAngles(); if(_d<=0){advance();break;} }
2696+
}
2697+
if (_d>0) advance();
2698+
}
2699+
StringBuilder _tb = new StringBuilder(joined).append("<");
2700+
for (int _i=argStart+1; _i<pos-1; _i++) _tb.append(tokens.get(_i).text());
2701+
_tb.append(">");
2702+
return new Identifier(_tb.toString(), t.line(), t.col(), List.of());
2703+
}
26752704
return new ScopedName(parts, t.line(), t.col(), List.of());
26762705
}
26772706
if (checkOp("<") && looksLikeTemplatedConstructionCallee()) {
@@ -3049,8 +3078,11 @@ private Param parseParam() {
30493078
// Encode dims into name: "&arr[10]" -> CodeGen emits "int (&arr)[10]"
30503079
StringBuilder dimEnc = new StringBuilder();
30513080
while (checkPunct("[")) {
3052-
advance(); dimEnc.append("[");
3053-
if (!checkPunct("]")) { dimEnc.append(peek().text()); advance(); }
3081+
int _ds = pos; advance(); dimEnc.append("[");
3082+
if (!checkPunct("]")) {
3083+
int _de = pos; parseExpr(); // consume dimension expression
3084+
for (int _di = _de; _di < pos; _di++) dimEnc.append(tokens.get(_di).text());
3085+
}
30543086
expectPunct("]"); dimEnc.append("]");
30553087
}
30563088
return new Param(type, (isRef ? "&" : "*") + pname + dimEnc.toString(), null, List.of(), false);

0 commit comments

Comments
 (0)