From 1da9019e9d3150502264365668156edf64ddfab1 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 28 Jul 2025 23:54:02 -0700 Subject: Improve diagnostics over ambiguous references. (#7930) * Improve diagnostics over ambiguous references. * Fix. * Remove files. * Fix some optix hitobject intrinsics. * Fix some hitobject intrinsics for optix. * Fix. * update rhi * revert slang-rhi * Update slang-rhi --- source/slang/slang-check-expr.cpp | 42 ++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'source/slang/slang-check-expr.cpp') diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 6fed59621..f63d1aaeb 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -386,6 +386,9 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr( // and given a type of `(Test) -> float` to indicate // that it is an "unbound" instance method. // + auto expr = m_astBuilder->create(); + expr->loc = loc; + expr->type = type; if (!isDeclUsableAsStaticMember(declRef.getDecl())) { getSink()->diagnose( @@ -393,11 +396,9 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr( Diagnostics::staticRefToNonStaticMember, typeType->getType(), declRef.getName()); + expr->type = m_astBuilder->getErrorType(); } - auto expr = m_astBuilder->create(); - expr->loc = loc; - expr->type = type; expr->baseExpression = baseExpr; expr->name = name; expr->declRef = declRef; @@ -1184,6 +1185,20 @@ LookupResult SemanticsVisitor::resolveOverloadedLookup(LookupResult const& inRes return result; } +bool SemanticsVisitor::maybeDiagnoseAmbiguousReference(Expr* expr) +{ + if (auto overloadExpr = as(expr)) + { + if (overloadExpr->lookupResult2.isValid() && + !as(overloadExpr->lookupResult2.item.declRef.getDecl())) + { + diagnoseAmbiguousReference(overloadExpr); + return true; + } + } + return false; +} + void SemanticsVisitor::diagnoseAmbiguousReference( OverloadedExpr* overloadedExpr, LookupResult const& lookupResult) @@ -1210,6 +1225,7 @@ void SemanticsVisitor::diagnoseAmbiguousReference(Expr* expr) { getSink()->diagnose(expr, Diagnostics::ambiguousExpression); } + expr->type = m_astBuilder->getErrorType(); } Expr* SemanticsVisitor::_resolveOverloadedExprImpl( @@ -1762,6 +1778,10 @@ Expr* SemanticsVisitor::GetBaseExpr(Expr* expr) { return memberExpr->baseExpression; } + else if (auto staticMemberExpr = as(expr)) + { + return staticMemberExpr->baseExpression; + } else if (auto overloadedExpr = as(expr)) { return overloadedExpr->base; @@ -2607,7 +2627,10 @@ Expr* SemanticsExprVisitor::visitIndexExpr(IndexExpr* subscriptExpr) if (!lookupResult.isValid()) { if (!diagnosed) - getSink()->diagnose(subscriptExpr, Diagnostics::subscriptNonArray, baseType); + { + if (!maybeDiagnoseAmbiguousReference(baseExpr)) + getSink()->diagnose(subscriptExpr, Diagnostics::subscriptNonArray, baseType); + } return CreateErrorExpr(subscriptExpr); } auto subscriptFuncExpr = createLookupResultExpr( @@ -5228,9 +5251,12 @@ Expr* SemanticsVisitor::lookupMemberResultFailure( // Check it's a member expression SLANG_ASSERT(as(expr) || as(expr)); - if (!supressDiagnostic) - getSink()->diagnose(expr, Diagnostics::noMemberOfNameInType, expr->name, baseType); expr->type = QualType(m_astBuilder->getErrorType()); + if (!supressDiagnostic) + { + if (!maybeDiagnoseAmbiguousReference(GetBaseExpr(expr))) + getSink()->diagnose(expr, Diagnostics::noMemberOfNameInType, expr->name, baseType); + } return expr; } @@ -5279,11 +5305,9 @@ Expr* SemanticsVisitor::maybeInsertImplicitOpForMemberBase( shouldRemove = true; if (!shouldRemove) { - filteredLookupResult.items.add(lookupResult); + AddToLookupResult(filteredLookupResult, lookupResult); } } - if (filteredLookupResult.items.getCount() == 1) - filteredLookupResult.item = filteredLookupResult.items.getFirst(); baseExpr = createLookupResultExpr( overloadedExpr->name, filteredLookupResult, -- cgit v1.2.3