Skip to content

Commit

Permalink
Fix all tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
csyonghe committed Feb 5, 2025
1 parent d8c2eb8 commit 30efc58
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 14 deletions.
3 changes: 3 additions & 0 deletions source/slang/slang-check-conversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,6 +1011,7 @@ bool SemanticsVisitor::_coerce(
auto resultExpr = getASTBuilder()->create<MakeOptionalExpr>();
resultExpr->loc = fromExpr->loc;
resultExpr->type = toType;
resultExpr->checked = true;
*outToExpr = resultExpr;
}
return true;
Expand Down Expand Up @@ -1136,6 +1137,7 @@ bool SemanticsVisitor::_coerce(
derefExpr = m_astBuilder->create<DerefExpr>();
derefExpr->base = fromExpr;
derefExpr->type = QualType(fromElementType);
derefExpr->checked = true;
}

if (!_coerce(site, toType, outToExpr, fromElementType, derefExpr, &subCost))
Expand Down Expand Up @@ -1164,6 +1166,7 @@ bool SemanticsVisitor::_coerce(
refExpr->base = fromExpr;
refExpr->type = QualType(refType);
refExpr->type.isLeftValue = false;
refExpr->checked = true;
*outToExpr = refExpr;
}
if (outCost)
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-check-decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4483,6 +4483,7 @@ void SemanticsVisitor::addRequiredParamsToSynthesizedDecl(
synMemberExpr->elementIndices.add((uint32_t)i);
synMemberExpr->type = elementType;
synMemberExpr->type.isLeftValue = paramType.isLeftValue;
synMemberExpr->checked = true;
synArgs.add(synMemberExpr);
}
}
Expand Down
6 changes: 5 additions & 1 deletion source/slang/slang-check-expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ Expr* SemanticsVisitor::openExistential(Expr* expr, DeclRef<InterfaceDecl> inter
openedValue->declRef = varDeclRef;
openedValue->type = QualType(openedType);
openedValue->originalExpr = expr;

openedValue->checked = true;
// The result of opening an existential is an l-value
// if the original existential is an l-value.
//
Expand Down Expand Up @@ -226,6 +226,7 @@ Expr* SemanticsVisitor::maybeOpenRef(Expr* expr)
openRef->innerExpr = expr;
openRef->type.isLeftValue = (as<RefType>(exprType) != nullptr);
openRef->type.type = refType->getValueType();
openRef->checked = true;
return openRef;
}
return expr;
Expand Down Expand Up @@ -522,6 +523,7 @@ Expr* SemanticsVisitor::constructDerefExpr(Expr* base, QualType elementType, Sou
derefExpr->loc = loc;
derefExpr->base = base;
derefExpr->type = QualType(elementType);
derefExpr->checked = true;

if (as<PtrType>(base->type) || as<RefType>(base->type))
{
Expand Down Expand Up @@ -3916,6 +3918,7 @@ Expr* SemanticsExprVisitor::visitAsTypeExpr(AsTypeExpr* expr)
makeOptional->type = optType;
makeOptional->value = castToSuperType;
makeOptional->typeExpr = typeExpr.exp;
makeOptional->checked = true;
return makeOptional;
}

Expand Down Expand Up @@ -4123,6 +4126,7 @@ Expr* SemanticsVisitor::CheckMatrixSwizzleExpr(
swizExpr->loc = memberRefExpr->loc;
swizExpr->base = memberRefExpr->baseExpression;
swizExpr->memberOpLoc = memberRefExpr->memberOperatorLoc;
swizExpr->checked = true;

// We can have up to 4 swizzles of two elements each
MatrixCoord elementCoords[4];
Expand Down
10 changes: 2 additions & 8 deletions source/slang/slang-check-impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -2853,14 +2853,8 @@ struct SemanticsExprVisitor : public SemanticsVisitor, ExprVisitor<SemanticsExpr
// deal with this cases here, even if they are no-ops.
//

#define CASE(NAME) \
Expr* visit##NAME(NAME* expr) \
{ \
if (!getShared()->isInLanguageServer()) \
SLANG_DIAGNOSE_UNEXPECTED(getSink(), expr, "should not appear in input syntax"); \
expr->type = m_astBuilder->getErrorType(); \
return expr; \
}
#define CASE(NAME) \
Expr* visit##NAME(NAME* expr) { return expr; }

CASE(DerefExpr)
CASE(MakeRefExpr)
Expand Down
5 changes: 5 additions & 0 deletions source/slang/slang-diagnostic-defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,11 @@ DIAGNOSTIC(
Error,
unexpectedTokenExpectedComponentDefinition,
"unexpected token '$0', only component definitions are allowed in a shader scope.")
DIAGNOSTIC(
20005,
Error,
invalidEmptyParenthesisExpr,
"empty parenthesis '()' is not a valid expression.")
DIAGNOSTIC(20008, Error, invalidOperator, "invalid operator '$0'.")
DIAGNOSTIC(20011, Error, unexpectedColon, "unexpected ':'.")
DIAGNOSTIC(
Expand Down
15 changes: 13 additions & 2 deletions source/slang/slang-parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5620,6 +5620,7 @@ Stmt* parseCompileTimeForStmt(Parser* parser)
VarDecl* varDecl = parser->astBuilder->create<VarDecl>();
varDecl->nameAndLoc = varNameAndLoc;
varDecl->loc = varNameAndLoc.loc;
varDecl->checkState = DeclCheckState::ReadyForParserLookup;

stmt->varDecl = varDecl;

Expand Down Expand Up @@ -7133,9 +7134,19 @@ static Expr* parseAtomicExpr(Parser* parser)
// as an expression.

Expr* base = nullptr;
if (!tryParseExpression(parser, base, TokenType::RParent))
if (parser->LookAheadToken(TokenType::RParent))
{
base = parser->ParseType();
// We don't support empty parentheses `()` as a valid expression.
parser->diagnose(openParen, Diagnostics::invalidEmptyParenthesisExpr);
base = parser->astBuilder->create<IncompleteExpr>();
base->type = parser->astBuilder->getErrorType();
}
else
{
if (!tryParseExpression(parser, base, TokenType::RParent))
{
base = parser->ParseType();
}
}

parser->ReadToken(TokenType::RParent);
Expand Down
6 changes: 3 additions & 3 deletions tests/bugs/generic-type-arg-overloaded.slang.expected
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ struct Stuff {}
tests/bugs/generic-type-arg-overloaded.slang(11): note: see previous declaration of 'Stuff'
struct Stuff : IThing { int getVal() { return 1; } }
^~~~~
tests/bugs/generic-type-arg-overloaded.slang(32): error 20005: empty parenthesis '()' is not a valid expression.
+ nonGeneric<G>();
^
tests/bugs/generic-type-arg-overloaded.slang(26): error 39999: ambiguous reference to 'Stuff'
return util<Stuff>()
^~~~~
Expand All @@ -15,9 +18,6 @@ struct Stuff {}
tests/bugs/generic-type-arg-overloaded.slang(11): note 39999: candidate: struct Stuff
struct Stuff : IThing { int getVal() { return 1; } }
^~~~~
tests/bugs/generic-type-arg-overloaded.slang(32): error 39999: expected a generic when using '<...>' (found: '() -> int')
+ nonGeneric<G>();
^~~~~~~~~~
}
standard output = {
}

0 comments on commit 30efc58

Please sign in to comment.