summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/hlsl.meta.slang13
-rw-r--r--source/slang/slang-check-expr.cpp42
-rw-r--r--source/slang/slang-check-impl.h2
-rw-r--r--source/slang/slang-check-overload.cpp8
-rw-r--r--tests/diagnostics/ambiguous-member-base/lib.slang3
-rw-r--r--tests/diagnostics/ambiguous-member-base/user.slang14
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