llvm/llvm-project

[clang] Bitcasts from vectors to integers not supported at compile time

Open

#159,905 创建于 2025年9月20日

在 GitHub 查看
 (14 评论) (0 反应) (1 负责人)C++ (10,782 fork)batch import
clang:frontendconstexprgood first issue

仓库指标

Star
 (26,378 star)
PR 合并指标
 (平均合并 1天 2小时) (30 天内合并 1,000 个 PR)

描述

I have test case that seems to regressed for latest constexpr changes.

#include<immintrin.h>
constexpr
__m64 foo(__m64 a, int b){
    return (__m64)(long long)a << b;
}
int main(){
    foo((__m64){5},1);
    return 0;
}

gcc-trunk works fine. clang-trunk errors out.

<source>:3:7: error: constexpr function never produces a constant expression [-Winvalid-constexpr]
    3 | __m64 foo(__m64 a, int b){
      |       ^~~
<source>:4:19: note: subexpression not valid in a constant expression
    4 |     return (__m64)(long long)a << b;

Following change passed

#include<immintrin.h>
constexpr
__m64 foo(__m64 a, int b){
    if(b > 63)
        return (__m64){0};
    return (__m64)(long long)a << b;
}
int main(){
    foo((__m64){5},1);
    return 0;
}

here is repro https://godbolt.org/z/d7obEcb57 Does anyone know what may be trouble here?

贡献者指南