https://github.com/pgerell updated https://github.com/llvm/llvm-project/pull/220316
>From 16ffd747b087751da3d9aa14c2e5ef88e8f17e2a Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Mon, 31 Aug 2026 17:49:48 +0200 Subject: [PATCH 1/6] [clang][OpenMP] Emit host diagnostics that were deferred and never flushed --- clang/docs/ReleaseNotes.md | 11 ++++++ clang/lib/Sema/Sema.cpp | 4 +- clang/lib/Sema/SemaDecl.cpp | 3 +- clang/test/CodeGen/X86/mmx-inline-asm-error.c | 7 +--- clang/test/OpenMP/declare_target_messages.cpp | 12 +++--- clang/test/OpenMP/host_asm_messages.c | 9 +++++ .../test/OpenMP/host_exceptions_messages.cpp | 37 +++++++++++++++++++ 7 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 clang/test/OpenMP/host_asm_messages.c create mode 100644 clang/test/OpenMP/host_exceptions_messages.cpp diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 7ec126a065ae5..5dbc0eaf85421 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -129,6 +129,10 @@ features cannot lower the translation-unit ABI level; target triples (except 32b arm targets). Can be disabled via `-fno-stack-clash-protection`. +- A host `-fopenmp` or `-fopenmp-simd` compilation now emits diagnostics it previously + deferred and then dropped when no offload target was configured. Code that used to + compile may be rejected, matching a compilation without those flags. + ### Clang Python Bindings Potentially Breaking Changes - `CompletionChunkKind` instance's `__str__` representation has been adapted to be consistent with other enums in the library. @@ -1127,6 +1131,13 @@ The `alpha.cplusplus.UseAfterLifetimeEnd` checker was renamed to `alpha.core.Use To ensure correct behavior, either use the original variable directly in the target region or map the bindings explicitly instead. +- Fixed a host OpenMP compilation never flushing its deferred diagnostics unless an + offload target was configured, which accepted `try`/`throw` with exceptions disabled + and let an invalid inline asm constraint crash CodeGen. (#GH147515) +- Fixed `-fopenmp-simd` deferring diagnostics as if it were a device compilation. It has + no device compilation and ignores `declare target`, so its diagnostics are now emitted + directly. + ### SYCL Support #### Improvements diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 29158cfff6231..c9b894eac406b 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -2262,7 +2262,9 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { Sema::SemaDiagnosticBuilder Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) { FD = FD ? FD : getCurFunctionDecl(); - if (LangOpts.OpenMP) + // -fopenmp-simd has no device compilation and ignores 'declare target', so + // there is nothing to defer for. + if (LangOpts.OpenMP && !LangOpts.OpenMPSimd) return LangOpts.OpenMPIsTargetDevice ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD) : OpenMP().diagIfOpenMPHostCode(Loc, DiagID, FD); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 094601a58d508..0e4e133094f72 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -17375,8 +17375,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, bool IsInstantiation, DiscardCleanupsInEvaluationContext(); } - if (FD && (LangOpts.isTargetDevice() || LangOpts.CUDA || - (LangOpts.OpenMP && !LangOpts.OMPTargetTriples.empty()))) { + if (FD && (LangOpts.isTargetDevice() || LangOpts.CUDA || LangOpts.OpenMP)) { auto ES = getEmissionStatus(FD); if (ES == Sema::FunctionEmissionStatus::Emitted || ES == Sema::FunctionEmissionStatus::Unknown) diff --git a/clang/test/CodeGen/X86/mmx-inline-asm-error.c b/clang/test/CodeGen/X86/mmx-inline-asm-error.c index 7f7f53a553057..da5b60fdac64c 100644 --- a/clang/test/CodeGen/X86/mmx-inline-asm-error.c +++ b/clang/test/CodeGen/X86/mmx-inline-asm-error.c @@ -1,16 +1,13 @@ // RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only %s -// RUN: %clang_cc1 -verify=omp -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp-simd %s typedef int vec256 __attribute__((ext_vector_type(8))); -// omp-warning@+2 {{AVX vector return of type 'vec256' (vector of 8 'int' values) without 'avx' enabled changes the ABI}} -// omp-warning@+1 {{AVX vector argument of type 'vec256' (vector of 8 'int' values) without 'avx' enabled changes the ABI}} vec256 foo(vec256 in) { vec256 out; asm("something %0" : : "y"(in)); // expected-error {{invalid input size for constraint 'y'}} - // omp-error@+1 {{invalid type 'vec256' (vector of 8 'int' values) in asm input for constraint 'y'}} asm("something %0" : "=y"(out)); // expected-error {{invalid output size for constraint '=y'}} - // omp-error@+1 {{invalid type 'vec256' (vector of 8 'int' values) in asm input for constraint 'y'}} asm("something %0, %0" : "+y"(out)); // expected-error {{invalid output size for constraint '+y'}} return out; diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 6fe477755dbe7..62a12d40b7271 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -21,16 +21,16 @@ // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause -fopenmp-version=45 -fopenmp-simd %{limit} -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s #pragma omp begin declare target diff --git a/clang/test/OpenMP/host_asm_messages.c b/clang/test/OpenMP/host_asm_messages.c new file mode 100644 index 0000000000000..48126712f5437 --- /dev/null +++ b/clang/test/OpenMP/host_asm_messages.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp-simd %s + +// An invalid asm constraint must be diagnosed rather than reaching CodeGen. + +void f(void) { + __asm__("nop" ::: "no_such_register"); // expected-error {{unknown register name 'no_such_register' in asm}} +} diff --git a/clang/test/OpenMP/host_exceptions_messages.cpp b/clang/test/OpenMP/host_exceptions_messages.cpp new file mode 100644 index 0000000000000..7a176f4df5f8a --- /dev/null +++ b/clang/test/OpenMP/host_exceptions_messages.cpp @@ -0,0 +1,37 @@ +// RUN: %clang_cc1 -verify=expected,host -fopenmp -fsyntax-only %s +// RUN: %clang_cc1 -verify=expected,simd -fopenmp-simd -fsyntax-only %s +// RUN: %clang_cc1 -verify=expected,host -fopenmp -fopenmp-targets=x86_64 -triple x86_64 -fsyntax-only %s + +// Exceptions are disabled, so a host compilation must diagnose 'try' and 'throw' +// whether or not an offload target is configured. + +void foo(); + +void bar() { + try { // expected-error {{cannot use 'try' with exceptions disabled}} + foo(); + } catch (...) { + } +} + +void baz(bool b) { + if (b) + throw 1; // expected-error {{cannot use 'throw' with exceptions disabled}} +} + +// A 'device_type(nohost)' function is not emitted by a host -fopenmp compilation, but +// -fopenmp-simd ignores 'declare target' and does emit it. +#pragma omp begin declare target device_type(nohost) +void devonly() { + try { // simd-error {{cannot use 'try' with exceptions disabled}} + foo(); + } catch (...) { + } +} +#pragma omp end declare target + +// Same, but marked 'nohost' only after the body has been parsed. +void late() { + throw 1; // simd-error {{cannot use 'throw' with exceptions disabled}} +} +#pragma omp declare target to(late) device_type(nohost) >From a5ac18d78bfa5378e35aaf5a8bfad56bf5da827a Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Sat, 10 Oct 2026 20:15:55 +0200 Subject: [PATCH 2/6] Merge the release notes into one entry --- clang/docs/ReleaseNotes.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 5dbc0eaf85421..5aec340860ed6 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -129,10 +129,6 @@ features cannot lower the translation-unit ABI level; target triples (except 32b arm targets). Can be disabled via `-fno-stack-clash-protection`. -- A host `-fopenmp` or `-fopenmp-simd` compilation now emits diagnostics it previously - deferred and then dropped when no offload target was configured. Code that used to - compile may be rejected, matching a compilation without those flags. - ### Clang Python Bindings Potentially Breaking Changes - `CompletionChunkKind` instance's `__str__` representation has been adapted to be consistent with other enums in the library. @@ -1131,12 +1127,9 @@ The `alpha.cplusplus.UseAfterLifetimeEnd` checker was renamed to `alpha.core.Use To ensure correct behavior, either use the original variable directly in the target region or map the bindings explicitly instead. -- Fixed a host OpenMP compilation never flushing its deferred diagnostics unless an +- Fixed `-fopenmp` and `-fopenmp-simd` host compilations dropping diagnostics when no offload target was configured, which accepted `try`/`throw` with exceptions disabled and let an invalid inline asm constraint crash CodeGen. (#GH147515) -- Fixed `-fopenmp-simd` deferring diagnostics as if it were a device compilation. It has - no device compilation and ignores `declare target`, so its diagnostics are now emitted - directly. ### SYCL Support >From 2b6451af5eba3b58ee49db3945206ca529a103ff Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Sat, 10 Oct 2026 20:16:06 +0200 Subject: [PATCH 3/6] Test -fopenmp -fopenmp-simd and clarify the OpenMPSimd comment --- clang/lib/Sema/Sema.cpp | 4 ++-- clang/test/CodeGen/X86/mmx-inline-asm-error.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index c9b894eac406b..313d9fcbc2257 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -2262,8 +2262,8 @@ Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() { Sema::SemaDiagnosticBuilder Sema::targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD) { FD = FD ? FD : getCurFunctionDecl(); - // -fopenmp-simd has no device compilation and ignores 'declare target', so - // there is nothing to defer for. + // OpenMPSimd is set only for -fopenmp-simd without -fopenmp. It has no device + // compilation and ignores 'declare target', so there is nothing to defer for. if (LangOpts.OpenMP && !LangOpts.OpenMPSimd) return LangOpts.OpenMPIsTargetDevice ? OpenMP().diagIfOpenMPDeviceCode(Loc, DiagID, FD) diff --git a/clang/test/CodeGen/X86/mmx-inline-asm-error.c b/clang/test/CodeGen/X86/mmx-inline-asm-error.c index da5b60fdac64c..f1844bea61365 100644 --- a/clang/test/CodeGen/X86/mmx-inline-asm-error.c +++ b/clang/test/CodeGen/X86/mmx-inline-asm-error.c @@ -1,6 +1,7 @@ // RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only %s // RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp %s // RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp-simd %s +// RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp -fopenmp-simd %s typedef int vec256 __attribute__((ext_vector_type(8))); vec256 foo(vec256 in) { >From 2cfdae56b07974c111e3f601c4649410b77ba9c8 Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Sat, 10 Oct 2026 20:16:07 +0200 Subject: [PATCH 4/6] Test a bare throw --- clang/test/OpenMP/host_exceptions_messages.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/test/OpenMP/host_exceptions_messages.cpp b/clang/test/OpenMP/host_exceptions_messages.cpp index 7a176f4df5f8a..98d03417a3cda 100644 --- a/clang/test/OpenMP/host_exceptions_messages.cpp +++ b/clang/test/OpenMP/host_exceptions_messages.cpp @@ -19,6 +19,10 @@ void baz(bool b) { throw 1; // expected-error {{cannot use 'throw' with exceptions disabled}} } +void rethrow() { + throw; // expected-error {{cannot use 'throw' with exceptions disabled}} +} + // A 'device_type(nohost)' function is not emitted by a host -fopenmp compilation, but // -fopenmp-simd ignores 'declare target' and does emit it. #pragma omp begin declare target device_type(nohost) >From 453f30dc15844a2243357a3f6a7c17ca20fbc8d4 Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Sun, 11 Oct 2026 15:32:14 +0200 Subject: [PATCH 5/6] Skip deferred-diag bookkeeping for -fopenmp-simd --- clang/lib/Sema/SemaDecl.cpp | 4 +++- clang/test/OpenMP/declare_target_messages.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 0e4e133094f72..4d455d9dd6045 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -17375,7 +17375,9 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, bool IsInstantiation, DiscardCleanupsInEvaluationContext(); } - if (FD && (LangOpts.isTargetDevice() || LangOpts.CUDA || LangOpts.OpenMP)) { + if (FD && (LangOpts.isTargetDevice() || LangOpts.CUDA || + (LangOpts.OpenMP && !LangOpts.OpenMPSimd) || + (LangOpts.OpenMP && !LangOpts.OMPTargetTriples.empty()))) { auto ES = getEmissionStatus(FD); if (ES == Sema::FunctionEmissionStatus::Emitted || ES == Sema::FunctionEmissionStatus::Unknown) diff --git a/clang/test/OpenMP/declare_target_messages.cpp b/clang/test/OpenMP/declare_target_messages.cpp index 62a12d40b7271..dd27532cc0c61 100644 --- a/clang/test/OpenMP/declare_target_messages.cpp +++ b/clang/test/OpenMP/declare_target_messages.cpp @@ -24,7 +24,7 @@ // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -DTESTEND=1 -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s -// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s +// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s // RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s >From 4054794e0df3a25996f53a689bc679ea5133281c Mon Sep 17 00:00:00 2001 From: Peter Gerell <[email protected]> Date: Sun, 11 Oct 2026 15:39:09 +0200 Subject: [PATCH 6/6] Test the inline asm crash from the PR description --- clang/test/CodeGen/X86/mmx-inline-asm-error.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/test/CodeGen/X86/mmx-inline-asm-error.c b/clang/test/CodeGen/X86/mmx-inline-asm-error.c index f1844bea61365..976655dc85728 100644 --- a/clang/test/CodeGen/X86/mmx-inline-asm-error.c +++ b/clang/test/CodeGen/X86/mmx-inline-asm-error.c @@ -4,6 +4,8 @@ // RUN: %clang_cc1 -verify -triple x86_64-unknown-unknown -emit-llvm-only -fopenmp -fopenmp-simd %s typedef int vec256 __attribute__((ext_vector_type(8))); +void g(int x) { __asm__("nop" : "=@"(x)); } // expected-error {{invalid output constraint '=@' in asm}} + vec256 foo(vec256 in) { vec256 out; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
