Skip to content

Commit

Permalink
Auto merge of #59724 - oli-obk:const_arg_ice, r=eddyb
Browse files Browse the repository at this point in the history
Function arguments should never get promoted

fixes #59469
  • Loading branch information
bors committed Apr 8, 2019
2 parents 474e7a6 + 01e8394 commit 3750348
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/librustc_mir/transform/qualify_consts.rs
Expand Up @@ -639,15 +639,15 @@ impl<'a, 'tcx> Checker<'a, 'tcx> {
per_local.insert(local);
}
}
cx.per_local[IsNotPromotable].insert(local);
cx.per_local[IsNotConst].insert(local);
}

LocalKind::Var if mode == Mode::Fn => {
cx.per_local[IsNotConst].insert(local);
}

LocalKind::Temp if !temps[local].is_promotable() => {
cx.per_local[IsNotPromotable].insert(local);
cx.per_local[IsNotConst].insert(local);
}

_ => {}
Expand Down Expand Up @@ -817,15 +817,15 @@ impl<'a, 'tcx> Checker<'a, 'tcx> {
}
}

// Ensure the `IsNotPromotable` qualification is preserved.
// Ensure the `IsNotConst` qualification is preserved.
// NOTE(eddyb) this is actually unnecessary right now, as
// we never replace the local's qualif, but we might in
// the future, and so it serves to catch changes that unset
// important bits (in which case, asserting `contains` could
// be replaced with calling `insert` to re-set the bit).
if kind == LocalKind::Temp {
if !self.temp_promotion_state[index].is_promotable() {
assert!(self.cx.per_local[IsNotPromotable].contains(index));
assert!(self.cx.per_local[IsNotConst].contains(index));
}
}
}
Expand Down
13 changes: 13 additions & 0 deletions src/test/ui/consts/const_arg_local.rs
@@ -0,0 +1,13 @@
// only-x86_64

#[cfg(target_arch = "x86")]
use std::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;

unsafe fn pclmul(a: __m128i, b: __m128i) -> __m128i {
let imm8 = 3;
_mm_clmulepi64_si128(a, b, imm8) //~ ERROR argument 3 is required to be a constant
}

fn main() {}
8 changes: 8 additions & 0 deletions src/test/ui/consts/const_arg_local.stderr
@@ -0,0 +1,8 @@
error: argument 3 is required to be a constant
--> $DIR/const_arg_local.rs:10:5
|
LL | _mm_clmulepi64_si128(a, b, imm8)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

12 changes: 12 additions & 0 deletions src/test/ui/consts/const_arg_promotable.rs
@@ -0,0 +1,12 @@
// only-x86_64

#[cfg(target_arch = "x86")]
use std::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;

unsafe fn pclmul(a: __m128i, b: __m128i) -> __m128i {
_mm_clmulepi64_si128(a, b, *&mut 42) //~ ERROR argument 3 is required to be a constant
}

fn main() {}
8 changes: 8 additions & 0 deletions src/test/ui/consts/const_arg_promotable.stderr
@@ -0,0 +1,8 @@
error: argument 3 is required to be a constant
--> $DIR/const_arg_promotable.rs:9:5
|
LL | _mm_clmulepi64_si128(a, b, *&mut 42)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

12 changes: 12 additions & 0 deletions src/test/ui/consts/const_arg_wrapper.rs
@@ -0,0 +1,12 @@
// only-x86_64

#[cfg(target_arch = "x86")]
use std::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;

unsafe fn pclmul(a: __m128i, b: __m128i, imm8: i32) -> __m128i {
_mm_clmulepi64_si128(a, b, imm8) //~ ERROR argument 3 is required to be a constant
}

fn main() {}
8 changes: 8 additions & 0 deletions src/test/ui/consts/const_arg_wrapper.stderr
@@ -0,0 +1,8 @@
error: argument 3 is required to be a constant
--> $DIR/const_arg_wrapper.rs:9:5
|
LL | _mm_clmulepi64_si128(a, b, imm8)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

0 comments on commit 3750348

Please sign in to comment.