diff options
| author | ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> | 2025-08-01 12:36:29 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-01 19:36:29 +0000 |
| commit | 8a15efb37a33d3c2943be87a19cbf9b5e2e8432b (patch) | |
| tree | 3ee02acbcfc4b53112427ce9febc2aa0d92815ed /source/slang/slang-check-overload.cpp | |
| parent | 6239a67cbeb3c551e08bfbf96044a0451e8ecc24 (diff) | |
Drain sink when single-argument constructor call fail (#7883)
* fix bug
* fix test
* push test changs for clarity
* fix bug
* fix test
* push test changs for clarity
* test what fails
* remove redundant code
Diffstat (limited to 'source/slang/slang-check-overload.cpp')
| -rw-r--r-- | source/slang/slang-check-overload.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp index 71e8488d8..9e5560b3a 100644 --- a/source/slang/slang-check-overload.cpp +++ b/source/slang/slang-check-overload.cpp @@ -2727,6 +2727,7 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) // bool typeOverloadChecked = false; + DiagnosticSink collectedErrorsSink(getSourceManager(), nullptr); if (expr->arguments.getCount() == 1 && !as<ExplicitCtorInvokeExpr>(expr) && !as<InitializerListExpr>(expr->arguments[0])) { @@ -2735,16 +2736,15 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) if (isDeclRefTypeOf<AggTypeDeclBase>(typeType->getType())) { Expr* resultExpr = nullptr; - DiagnosticSink tempSink(getSourceManager(), nullptr); ConversionCost conversionCost = kConversionCost_None; - auto coerceResult = SemanticsVisitor(withSink(&tempSink)) + auto coerceResult = SemanticsVisitor(withSink(&collectedErrorsSink)) ._coerce( CoercionSite::ExplicitCoercion, typeType->getType(), &resultExpr, expr->arguments[0]->type, expr->arguments[0], - &tempSink, + &collectedErrorsSink, &conversionCost); if (auto resultInvokeExpr = as<InvokeExpr>(resultExpr)) { @@ -2963,6 +2963,16 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) // for language server to use. if (IsErrorExpr(outExpr)) { + // Drain our error sink of "saved errors" + if (collectedErrorsSink.getErrorCount()) + { + Slang::ComPtr<ISlangBlob> blob; + collectedErrorsSink.getBlobIfNeeded(blob.writeRef()); + getSink()->diagnoseRaw( + Severity::Error, + static_cast<char const*>(blob->getBufferPointer())); + } + if (auto invokeExpr = as<InvokeExpr>(outExpr)) { invokeExpr->originalFunctionExpr = typeExpr; |
