Skip to content

[Sema][SYCL] Only defer device diags for constexpr var init under SYCL - #22767

Open
wenju-he wants to merge 2 commits into
intel:syclfrom
wenju-he:sema-defer-device-diags-constexpr-var-init-SYCL
Open

[Sema][SYCL] Only defer device diags for constexpr var init under SYCL#22767
wenju-he wants to merge 2 commits into
intel:syclfrom
wenju-he:sema-defer-device-diags-constexpr-var-init-SYCL

Conversation

@wenju-he

@wenju-he wenju-he commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

InConstexprVarInit marks that Sema is parsing a possibly
constant-evaluated variable initializer and should stay accurate for
all languages. What's SYCL-specific is SemaSYCL's "manifestly
constant-evaluated" exemption, which reroutes device diagnostics into
MaybeDeviceDeferredDiags and discards them if the variable turns out
constant-initialized. 10fee97 made InConstexprVarInit
unconditional, so this also started swallowing CUDA/HIP deferred
diagnostics (e.g. AMDGPU builtin checks in a global constexpr lambda).

Gate the consumption instead: getDeviceDeferredDiags() only reroutes
to MaybeDeviceDeferredDiags when SYCLIsDevice is set.

Fix clang/test/SemaHIP/amdgpu-builtin-in-lambda.hip
CMPLRLLVM-77209

InConstexprVarInit gates a mechanism (added for SYCL's "manifestly
constant-evaluated" device-code exemption) that reroutes deferred
device diagnostics into MaybeDeviceDeferredDiags, discarding them if
the variable turns out to be constant-initialized. It was originally
opt-in via LangOpts.SYCLAllowAllFeaturesInConstexpr (added in
fa62920), but 10fee97 ("[SYCL][clang] Always lift SYCL
device code restrictions in constant expressions") made it
unconditional for any constexpr-capable global/static variable
initializer, so it also swallowed CUDA/HIP deferred diagnostics (e.g.
AMDGPU builtin argument checks) raised while initializing a global
constexpr lambda, since SemaBase::SemaDiagnosticBuilder routes to
whichever map InConstexprVarInit currently selects regardless of which
DiagIfDeviceCode caller (SYCL or CUDA) created the deferred diagnostic.
Restrict it to SYCL device compilation, its only real consumer
(SemaSYCL::DiagIfDeviceCode).

Fix clang/test/SemaHIP/amdgpu-builtin-in-lambda.hip
CMPLRLLVM-77209

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wenju-he
wenju-he requested a review from a team as a code owner July 26, 2026 01:43

@elizabethandrews elizabethandrews left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think we should gate where InConstexprVarInit is set. It accurately records that are parsing a constexpr variable's initializer. We should gate it's consumption.

…rInit

Per review, InConstexprVarInit should stay an accurate, ungated record
of "we are parsing a constexpr variable's initializer" rather than
being restricted to SYCL device compilation. Instead, gate its
consumption: SemaBase::SemaDiagnosticBuilder::getDeviceDeferredDiags()
now only reroutes to MaybeDeviceDeferredDiags when SYCLIsDevice is
also set, so CUDA/HIP deferred diagnostics (e.g. AMDGPU builtin
argument checks) are no longer swallowed by SYCL's
"manifestly constant-evaluated" exemption.

CMPLRLLVM-77209

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@wenju-he

Copy link
Copy Markdown
Contributor Author

I do not think we should gate where InConstexprVarInit is set. It accurately records that are parsing a constexpr variable's initializer. We should gate it's consumption.

done

@tahonermann tahonermann left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good with the update to address @elizabethandrews's comment. Thanks @wenju-he!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants