diff options
| -rw-r--r-- | source/slang/hlsl.meta.slang | 13 | ||||
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 42 | ||||
| -rw-r--r-- | source/slang/slang-check-impl.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-check-overload.cpp | 8 | ||||
| -rw-r--r-- | tests/diagnostics/ambiguous-member-base/lib.slang | 3 | ||||
| -rw-r--r-- | tests/diagnostics/ambiguous-member-base/user.slang | 14 |
6 files changed, 61 insertions, 21 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 66d1cb5e6..94dceef54 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -20657,17 +20657,6 @@ struct HitObject case cuda: __intrinsic_asm "optixHitObjectSetSbtRecordIndex"; } } - - // TODO - Add other targets [__requiresNVAPI] __glsl_extension(GL_EXT_ray_tracing) - [ForceInline] - [require(cuda, ser_raygen_closesthit_miss)] - uint LoadLocalRootArgumentsConstant(uint RootConstantOffsetInBytes) - { - __target_switch - { - case cuda: __intrinsic_asm "optixHitObjectGetSbtDataPointer"; - } - } /// Returns the instance index of a hit. Valid if the hit object represents a hit. [__requiresNVAPI] __glsl_extension(GL_EXT_ray_tracing) @@ -21050,11 +21039,13 @@ struct HitObject /// represents a hit or a miss. RootConstantOffsetInBytes must be a multiple of 4. [__requiresNVAPI] [require(hlsl, ser)] + [require(cuda, ser)] uint LoadLocalRootTableConstant(uint RootConstantOffsetInBytes) { __target_switch { case hlsl: __intrinsic_asm ".LoadLocalRootTableConstant"; + case cuda: __intrinsic_asm "(*(uint32_t*)((char*)optixHitObjectGetSbtDataPointer()+$1))"; } } 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<StaticMemberExpr>(); + 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<StaticMemberExpr>(); - 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<OverloadedExpr>(expr)) + { + if (overloadExpr->lookupResult2.isValid() && + !as<NamespaceDecl>(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<StaticMemberExpr>(expr)) + { + return staticMemberExpr->baseExpression; + } else if (auto overloadedExpr = as<OverloadedExpr>(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<StaticMemberExpr>(expr) || as<MemberExpr>(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, diff --git a/source/slang/slang-check-impl.h b/source/slang/slang-check-impl.h index a82278054..2675ecee0 100644 --- a/source/slang/slang-check-impl.h +++ b/source/slang/slang-check-impl.h @@ -1436,7 +1436,7 @@ public: OverloadedExpr* overloadedExpr, LookupResult const& lookupResult); void diagnoseAmbiguousReference(Expr* overloadedExpr); - + bool maybeDiagnoseAmbiguousReference(Expr* overloadedExpr); Expr* ExpectATypeRepr(Expr* expr); diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp index 8a8da3eb2..5a2b0872f 100644 --- a/source/slang/slang-check-overload.cpp +++ b/source/slang/slang-check-overload.cpp @@ -2975,6 +2975,14 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) // Nothing at all was found that we could even consider invoking. // In all other cases, this is an error. + if (auto overloadExpr = as<OverloadedExpr>(funcExpr)) + { + if (overloadExpr->lookupResult2.isValid()) + { + diagnoseAmbiguousReference(funcExpr); + return CreateErrorExpr(expr); + } + } getSink()->diagnose(expr->functionExpr, Diagnostics::expectedFunction, funcExpr->type); expr->type = QualType(m_astBuilder->getErrorType()); return expr; diff --git a/tests/diagnostics/ambiguous-member-base/lib.slang b/tests/diagnostics/ambiguous-member-base/lib.slang new file mode 100644 index 000000000..fd7e771e2 --- /dev/null +++ b/tests/diagnostics/ambiguous-member-base/lib.slang @@ -0,0 +1,3 @@ +struct X { int m; } + +static X x;
\ No newline at end of file diff --git a/tests/diagnostics/ambiguous-member-base/user.slang b/tests/diagnostics/ambiguous-member-base/user.slang new file mode 100644 index 000000000..3aa212807 --- /dev/null +++ b/tests/diagnostics/ambiguous-member-base/user.slang @@ -0,0 +1,14 @@ +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): +import lib; + +static X x; + +void test() +{ + // CHECK: ([[# @LINE+1]]):{{.*}}ambiguous reference to 'x' + x.m = 2; + // CHECK: ([[# @LINE+1]]):{{.*}}ambiguous reference to 'x' + x[3] = 2; + // CHECK: ([[# @LINE+1]]):{{.*}}ambiguous reference to 'x' + x(); +}
\ No newline at end of file |
