about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAmanieu d'Antras <amanieu@gmail.com>2021-04-06 05:50:55 +0100
committerAmanieu d'Antras <amanieu@gmail.com>2021-04-06 12:35:41 +0100
commit32be124e306e537590cedcb56e6c16db7f9d8ce7 (patch)
treef1556b2b11d22a126ad37867267ff2afe6bb9f33 /src
parentcbd6ec760453b333e86aac106f47fe9132498924 (diff)
downloadrust-32be124e306e537590cedcb56e6c16db7f9d8ce7.tar.gz
rust-32be124e306e537590cedcb56e6c16db7f9d8ce7.zip
Use AnonConst for asm! constants
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/asm/const.rs36
-rw-r--r--src/test/ui/asm/parse-error.rs6
-rw-r--r--src/test/ui/asm/parse-error.stderr77
-rw-r--r--src/test/ui/asm/type-check-1.rs18
-rw-r--r--src/test/ui/asm/type-check-1.stderr32
-rw-r--r--src/test/ui/asm/type-check-2.rs24
-rw-r--r--src/test/ui/asm/type-check-2.stderr50
-rw-r--r--src/tools/clippy/clippy_lints/src/loops/never_loop.rs2
-rw-r--r--src/tools/clippy/clippy_lints/src/utils/inspector.rs5
-rw-r--r--src/tools/clippy/clippy_utils/src/hir_utils.rs3
10 files changed, 154 insertions, 99 deletions
diff --git a/src/test/ui/asm/const.rs b/src/test/ui/asm/const.rs
index 22bc790713d..0f6a7cd4474 100644
--- a/src/test/ui/asm/const.rs
+++ b/src/test/ui/asm/const.rs
@@ -4,38 +4,18 @@
 
 #![feature(asm)]
 
-use std::mem::size_of;
-
-trait Proj {
-    const C: usize;
-}
-impl Proj for i8 {
-    const C: usize = 8;
-}
-impl Proj for i16 {
-    const C: usize = 16;
+fn const_generic<const X: usize>() -> usize {
+    unsafe {
+        let a: usize;
+        asm!("mov {}, {}", out(reg) a, const X);
+        a
+    }
 }
 
 const fn constfn(x: usize) -> usize {
     x
 }
 
-fn generic<T: Proj>() {
-    unsafe {
-        let a: usize;
-        asm!("mov {}, {}", out(reg) a, const size_of::<T>());
-        assert_eq!(a, size_of::<T>());
-
-        let b: usize;
-        asm!("mov {}, {}", out(reg) b, const size_of::<T>() + constfn(5));
-        assert_eq!(b, size_of::<T>() + 5);
-
-        let c: usize;
-        asm!("mov {}, {}", out(reg) c, const T::C);
-        assert_eq!(c, T::C);
-    }
-}
-
 fn main() {
     unsafe {
         let a: usize;
@@ -51,6 +31,6 @@ fn main() {
         assert_eq!(c, 10);
     }
 
-    generic::<i8>();
-    generic::<i16>();
+    let d = const_generic::<5>();
+    assert_eq!(d, 5);
 }
diff --git a/src/test/ui/asm/parse-error.rs b/src/test/ui/asm/parse-error.rs
index 538a3fde8fd..f2e9d9ca08b 100644
--- a/src/test/ui/asm/parse-error.rs
+++ b/src/test/ui/asm/parse-error.rs
@@ -36,17 +36,23 @@ fn main() {
         //~^ ERROR expected one of
         asm!("{}", options(), const foo);
         //~^ ERROR arguments are not allowed after options
+        //~^^ ERROR attempt to use a non-constant value in a constant
         asm!("{a}", a = const foo, a = const bar);
         //~^ ERROR duplicate argument named `a`
         //~^^ ERROR argument never used
+        //~^^^ ERROR attempt to use a non-constant value in a constant
+        //~^^^^ ERROR attempt to use a non-constant value in a constant
         asm!("", a = in("eax") foo);
         //~^ ERROR explicit register arguments cannot have names
         asm!("{a}", in("eax") foo, a = const bar);
         //~^ ERROR named arguments cannot follow explicit register arguments
+        //~^^ ERROR attempt to use a non-constant value in a constant
         asm!("{a}", in("eax") foo, a = const bar);
         //~^ ERROR named arguments cannot follow explicit register arguments
+        //~^^ ERROR attempt to use a non-constant value in a constant
         asm!("{1}", in("eax") foo, const bar);
         //~^ ERROR positional arguments cannot follow named arguments or explicit register arguments
+        //~^^ ERROR attempt to use a non-constant value in a constant
         asm!("", options(), "");
         //~^ ERROR expected one of
         asm!("{}", in(reg) foo, "{}", out(reg) foo);
diff --git a/src/test/ui/asm/parse-error.stderr b/src/test/ui/asm/parse-error.stderr
index dfbfc0abe34..4ab9d86948d 100644
--- a/src/test/ui/asm/parse-error.stderr
+++ b/src/test/ui/asm/parse-error.stderr
@@ -91,7 +91,7 @@ LL |         asm!("{}", options(), const foo);
    |                    previous options
 
 error: duplicate argument named `a`
-  --> $DIR/parse-error.rs:39:36
+  --> $DIR/parse-error.rs:40:36
    |
 LL |         asm!("{a}", a = const foo, a = const bar);
    |                     -------------  ^^^^^^^^^^^^^ duplicate argument
@@ -99,7 +99,7 @@ LL |         asm!("{a}", a = const foo, a = const bar);
    |                     previously here
 
 error: argument never used
-  --> $DIR/parse-error.rs:39:36
+  --> $DIR/parse-error.rs:40:36
    |
 LL |         asm!("{a}", a = const foo, a = const bar);
    |                                    ^^^^^^^^^^^^^ argument never used
@@ -107,13 +107,13 @@ LL |         asm!("{a}", a = const foo, a = const bar);
    = help: if this argument is intentionally unused, consider using it in an asm comment: `"/* {1} */"`
 
 error: explicit register arguments cannot have names
-  --> $DIR/parse-error.rs:42:18
+  --> $DIR/parse-error.rs:45:18
    |
 LL |         asm!("", a = in("eax") foo);
    |                  ^^^^^^^^^^^^^^^^^
 
 error: named arguments cannot follow explicit register arguments
-  --> $DIR/parse-error.rs:44:36
+  --> $DIR/parse-error.rs:47:36
    |
 LL |         asm!("{a}", in("eax") foo, a = const bar);
    |                     -------------  ^^^^^^^^^^^^^ named argument
@@ -121,7 +121,7 @@ LL |         asm!("{a}", in("eax") foo, a = const bar);
    |                     explicit register argument
 
 error: named arguments cannot follow explicit register arguments
-  --> $DIR/parse-error.rs:46:36
+  --> $DIR/parse-error.rs:50:36
    |
 LL |         asm!("{a}", in("eax") foo, a = const bar);
    |                     -------------  ^^^^^^^^^^^^^ named argument
@@ -129,7 +129,7 @@ LL |         asm!("{a}", in("eax") foo, a = const bar);
    |                     explicit register argument
 
 error: positional arguments cannot follow named arguments or explicit register arguments
-  --> $DIR/parse-error.rs:48:36
+  --> $DIR/parse-error.rs:53:36
    |
 LL |         asm!("{1}", in("eax") foo, const bar);
    |                     -------------  ^^^^^^^^^ positional argument
@@ -137,19 +137,19 @@ LL |         asm!("{1}", in("eax") foo, const bar);
    |                     explicit register argument
 
 error: expected one of `const`, `in`, `inlateout`, `inout`, `lateout`, `options`, `out`, or `sym`, found `""`
-  --> $DIR/parse-error.rs:50:29
+  --> $DIR/parse-error.rs:56:29
    |
 LL |         asm!("", options(), "");
    |                             ^^ expected one of 8 possible tokens
 
 error: expected one of `const`, `in`, `inlateout`, `inout`, `lateout`, `options`, `out`, or `sym`, found `"{}"`
-  --> $DIR/parse-error.rs:52:33
+  --> $DIR/parse-error.rs:58:33
    |
 LL |         asm!("{}", in(reg) foo, "{}", out(reg) foo);
    |                                 ^^^^ expected one of 8 possible tokens
 
 error: asm template must be a string literal
-  --> $DIR/parse-error.rs:54:14
+  --> $DIR/parse-error.rs:60:14
    |
 LL |         asm!(format!("{{{}}}", 0), in(reg) foo);
    |              ^^^^^^^^^^^^^^^^^^^^
@@ -157,12 +157,67 @@ LL |         asm!(format!("{{{}}}", 0), in(reg) foo);
    = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: asm template must be a string literal
-  --> $DIR/parse-error.rs:56:21
+  --> $DIR/parse-error.rs:62:21
    |
 LL |         asm!("{1}", format!("{{{}}}", 0), in(reg) foo, out(reg) bar);
    |                     ^^^^^^^^^^^^^^^^^^^^
    |
    = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 25 previous errors
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:37:37
+   |
+LL |     let mut foo = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const foo`
+...
+LL |         asm!("{}", options(), const foo);
+   |                                     ^^^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:40:31
+   |
+LL |     let mut foo = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const foo`
+...
+LL |         asm!("{a}", a = const foo, a = const bar);
+   |                               ^^^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:40:46
+   |
+LL |     let mut bar = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const bar`
+...
+LL |         asm!("{a}", a = const foo, a = const bar);
+   |                                              ^^^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:47:46
+   |
+LL |     let mut bar = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const bar`
+...
+LL |         asm!("{a}", in("eax") foo, a = const bar);
+   |                                              ^^^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:50:46
+   |
+LL |     let mut bar = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const bar`
+...
+LL |         asm!("{a}", in("eax") foo, a = const bar);
+   |                                              ^^^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/parse-error.rs:53:42
+   |
+LL |     let mut bar = 0;
+   |      ---------- help: consider using `const` instead of `let`: `const bar`
+...
+LL |         asm!("{1}", in("eax") foo, const bar);
+   |                                          ^^^ non-constant value
+
+error: aborting due to 31 previous errors
 
+For more information about this error, try `rustc --explain E0435`.
diff --git a/src/test/ui/asm/type-check-1.rs b/src/test/ui/asm/type-check-1.rs
index 7880382c3b7..57a91aaa934 100644
--- a/src/test/ui/asm/type-check-1.rs
+++ b/src/test/ui/asm/type-check-1.rs
@@ -21,5 +21,23 @@ fn main() {
         //~^ ERROR the size for values of type `[u64]` cannot be known at compilation time
         asm!("{}", inout(reg) v[..]);
         //~^ ERROR the size for values of type `[u64]` cannot be known at compilation time
+
+        // Constants must be... constant
+
+        let x = 0;
+        const fn const_foo(x: i32) -> i32 {
+            x
+        }
+        const fn const_bar<T>(x: T) -> T {
+            x
+        }
+        asm!("{}", const x);
+        //~^ ERROR attempt to use a non-constant value in a constant
+        asm!("{}", const const_foo(0));
+        asm!("{}", const const_foo(x));
+        //~^ ERROR attempt to use a non-constant value in a constant
+        asm!("{}", const const_bar(0));
+        asm!("{}", const const_bar(x));
+        //~^ ERROR attempt to use a non-constant value in a constant
     }
 }
diff --git a/src/test/ui/asm/type-check-1.stderr b/src/test/ui/asm/type-check-1.stderr
index 556e83fdb0d..eefab6d3977 100644
--- a/src/test/ui/asm/type-check-1.stderr
+++ b/src/test/ui/asm/type-check-1.stderr
@@ -1,3 +1,30 @@
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/type-check-1.rs:34:26
+   |
+LL |         let x = 0;
+   |         ----- help: consider using `const` instead of `let`: `const x`
+...
+LL |         asm!("{}", const x);
+   |                          ^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/type-check-1.rs:37:36
+   |
+LL |         let x = 0;
+   |         ----- help: consider using `const` instead of `let`: `const x`
+...
+LL |         asm!("{}", const const_foo(x));
+   |                                    ^ non-constant value
+
+error[E0435]: attempt to use a non-constant value in a constant
+  --> $DIR/type-check-1.rs:40:36
+   |
+LL |         let x = 0;
+   |         ----- help: consider using `const` instead of `let`: `const x`
+...
+LL |         asm!("{}", const const_bar(x));
+   |                                    ^ non-constant value
+
 error: invalid asm output
   --> $DIR/type-check-1.rs:10:29
    |
@@ -37,6 +64,7 @@ LL |         asm!("{}", inout(reg) v[..]);
    = help: the trait `Sized` is not implemented for `[u64]`
    = note: all inline asm arguments must have a statically known size
 
-error: aborting due to 5 previous errors
+error: aborting due to 8 previous errors
 
-For more information about this error, try `rustc --explain E0277`.
+Some errors have detailed explanations: E0277, E0435.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui/asm/type-check-2.rs b/src/test/ui/asm/type-check-2.rs
index 01c8b4eb654..0677167ccfe 100644
--- a/src/test/ui/asm/type-check-2.rs
+++ b/src/test/ui/asm/type-check-2.rs
@@ -28,31 +28,19 @@ fn main() {
 
         // Const operands must be integer or floats, and must be constants.
 
-        let x = 0;
-        const C: i32 = 0;
-        const fn const_foo(x: i32) -> i32 {
-            x
-        }
-        const fn const_bar<T>(x: T) -> T {
-            x
-        }
+        asm!("{}", const 0);
         asm!("{}", const 0i32);
         asm!("{}", const 0f32);
         asm!("{}", const 0 as *mut u8);
         //~^ ERROR asm `const` arguments must be integer or floating-point values
-        asm!("{}", const &0);
-        //~^ ERROR asm `const` arguments must be integer or floating-point values
-        asm!("{}", const x);
-        //~^ ERROR argument 1 is required to be a constant
-        asm!("{}", const const_foo(0));
-        asm!("{}", const const_foo(x));
-        //~^ ERROR argument 1 is required to be a constant
-        asm!("{}", const const_bar(0));
-        asm!("{}", const const_bar(x));
-        //~^ ERROR argument 1 is required to be a constant
+
+        // This currently causes an ICE: https://github.com/rust-lang/rust/issues/81857
+        // asm!("{}", const &0);
+        // ERROR asm `const` arguments must be integer or floating-point values
 
         // Sym operands must point to a function or static
 
+        const C: i32 = 0;
         static S: i32 = 0;
         asm!("{}", sym S);
         asm!("{}", sym main);
diff --git a/src/test/ui/asm/type-check-2.stderr b/src/test/ui/asm/type-check-2.stderr
index a520bea8f1d..830ca7b5550 100644
--- a/src/test/ui/asm/type-check-2.stderr
+++ b/src/test/ui/asm/type-check-2.stderr
@@ -1,25 +1,19 @@
 error: asm `const` arguments must be integer or floating-point values
-  --> $DIR/type-check-2.rs:41:26
+  --> $DIR/type-check-2.rs:34:20
    |
 LL |         asm!("{}", const 0 as *mut u8);
-   |                          ^^^^^^^^^^^^
-
-error: asm `const` arguments must be integer or floating-point values
-  --> $DIR/type-check-2.rs:43:26
-   |
-LL |         asm!("{}", const &0);
-   |                          ^^
+   |                    ^^^^^^^^^^^^^^^^^^
 
 error: arguments for inline assembly must be copyable
-  --> $DIR/type-check-2.rs:66:32
+  --> $DIR/type-check-2.rs:54:32
    |
 LL |         asm!("{}", in(xmm_reg) SimdNonCopy(0.0, 0.0, 0.0, 0.0));
    |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: `SimdNonCopy` does not implement the Copy trait
 
-error: cannot use value of type `[closure@$DIR/type-check-2.rs:78:28: 78:38]` for inline assembly
-  --> $DIR/type-check-2.rs:78:28
+error: cannot use value of type `[closure@$DIR/type-check-2.rs:66:28: 66:38]` for inline assembly
+  --> $DIR/type-check-2.rs:66:28
    |
 LL |         asm!("{}", in(reg) |x: i32| x);
    |                            ^^^^^^^^^^
@@ -27,7 +21,7 @@ LL |         asm!("{}", in(reg) |x: i32| x);
    = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
 
 error: cannot use value of type `Vec<i32>` for inline assembly
-  --> $DIR/type-check-2.rs:80:28
+  --> $DIR/type-check-2.rs:68:28
    |
 LL |         asm!("{}", in(reg) vec![0]);
    |                            ^^^^^^^
@@ -36,7 +30,7 @@ LL |         asm!("{}", in(reg) vec![0]);
    = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: cannot use value of type `(i32, i32, i32)` for inline assembly
-  --> $DIR/type-check-2.rs:82:28
+  --> $DIR/type-check-2.rs:70:28
    |
 LL |         asm!("{}", in(reg) (1, 2, 3));
    |                            ^^^^^^^^^
@@ -44,7 +38,7 @@ LL |         asm!("{}", in(reg) (1, 2, 3));
    = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
 
 error: cannot use value of type `[i32; 3]` for inline assembly
-  --> $DIR/type-check-2.rs:84:28
+  --> $DIR/type-check-2.rs:72:28
    |
 LL |         asm!("{}", in(reg) [1, 2, 3]);
    |                            ^^^^^^^^^
@@ -52,7 +46,7 @@ LL |         asm!("{}", in(reg) [1, 2, 3]);
    = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
 
 error: cannot use value of type `fn() {main}` for inline assembly
-  --> $DIR/type-check-2.rs:92:31
+  --> $DIR/type-check-2.rs:80:31
    |
 LL |         asm!("{}", inout(reg) f);
    |                               ^
@@ -60,7 +54,7 @@ LL |         asm!("{}", inout(reg) f);
    = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
 
 error: cannot use value of type `&mut i32` for inline assembly
-  --> $DIR/type-check-2.rs:95:31
+  --> $DIR/type-check-2.rs:83:31
    |
 LL |         asm!("{}", inout(reg) r);
    |                               ^
@@ -68,35 +62,17 @@ LL |         asm!("{}", inout(reg) r);
    = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
 
 error: asm `sym` operand must point to a fn or static
-  --> $DIR/type-check-2.rs:59:24
+  --> $DIR/type-check-2.rs:47:24
    |
 LL |         asm!("{}", sym C);
    |                        ^
 
 error: asm `sym` operand must point to a fn or static
-  --> $DIR/type-check-2.rs:61:24
+  --> $DIR/type-check-2.rs:49:24
    |
 LL |         asm!("{}", sym x);
    |                        ^
 
-error: argument 1 is required to be a constant
-  --> $DIR/type-check-2.rs:45:9
-   |
-LL |         asm!("{}", const x);
-   |         ^^^^^^^^^^^^^^^^^^^^
-
-error: argument 1 is required to be a constant
-  --> $DIR/type-check-2.rs:48:9
-   |
-LL |         asm!("{}", const const_foo(x));
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: argument 1 is required to be a constant
-  --> $DIR/type-check-2.rs:51:9
-   |
-LL |         asm!("{}", const const_bar(x));
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
 error[E0381]: use of possibly-uninitialized variable: `x`
   --> $DIR/type-check-2.rs:13:28
    |
@@ -127,7 +103,7 @@ LL |         let v: Vec<u64> = vec![0, 1, 2];
 LL |         asm!("{}", inout(reg) v[0]);
    |                               ^ cannot borrow as mutable
 
-error: aborting due to 18 previous errors
+error: aborting due to 14 previous errors
 
 Some errors have detailed explanations: E0381, E0596.
 For more information about an error, try `rustc --explain E0381`.
diff --git a/src/tools/clippy/clippy_lints/src/loops/never_loop.rs b/src/tools/clippy/clippy_lints/src/loops/never_loop.rs
index f63a3761a0d..01a7627fc7f 100644
--- a/src/tools/clippy/clippy_lints/src/loops/never_loop.rs
+++ b/src/tools/clippy/clippy_lints/src/loops/never_loop.rs
@@ -142,12 +142,12 @@ fn never_loop_expr(expr: &Expr<'_>, main_loop_id: HirId) -> NeverLoopResult {
             .map(|(o, _)| match o {
                 InlineAsmOperand::In { expr, .. }
                 | InlineAsmOperand::InOut { expr, .. }
-                | InlineAsmOperand::Const { expr }
                 | InlineAsmOperand::Sym { expr } => never_loop_expr(expr, main_loop_id),
                 InlineAsmOperand::Out { expr, .. } => never_loop_expr_all(&mut expr.iter(), main_loop_id),
                 InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => {
                     never_loop_expr_all(&mut once(in_expr).chain(out_expr.iter()), main_loop_id)
                 },
+                InlineAsmOperand::Const { .. } => NeverLoopResult::Otherwise,
             })
             .fold(NeverLoopResult::Otherwise, combine_both),
         ExprKind::Struct(_, _, None)
diff --git a/src/tools/clippy/clippy_lints/src/utils/inspector.rs b/src/tools/clippy/clippy_lints/src/utils/inspector.rs
index 6fd3c9d7dec..b3fe66ed428 100644
--- a/src/tools/clippy/clippy_lints/src/utils/inspector.rs
+++ b/src/tools/clippy/clippy_lints/src/utils/inspector.rs
@@ -306,7 +306,6 @@ fn print_expr(cx: &LateContext<'_>, expr: &hir::Expr<'_>, indent: usize) {
                 match op {
                     hir::InlineAsmOperand::In { expr, .. }
                     | hir::InlineAsmOperand::InOut { expr, .. }
-                    | hir::InlineAsmOperand::Const { expr }
                     | hir::InlineAsmOperand::Sym { expr } => print_expr(cx, expr, indent + 1),
                     hir::InlineAsmOperand::Out { expr, .. } => {
                         if let Some(expr) = expr {
@@ -319,6 +318,10 @@ fn print_expr(cx: &LateContext<'_>, expr: &hir::Expr<'_>, indent: usize) {
                             print_expr(cx, out_expr, indent + 1);
                         }
                     },
+                    hir::InlineAsmOperand::Const { anon_const } => {
+                        println!("{}anon_const:", ind);
+                        print_expr(cx, &cx.tcx.hir().body(anon_const.body).value, indent + 1);
+                    }
                 }
             }
         },
diff --git a/src/tools/clippy/clippy_utils/src/hir_utils.rs b/src/tools/clippy/clippy_utils/src/hir_utils.rs
index 618d33545a4..b30c0b79881 100644
--- a/src/tools/clippy/clippy_utils/src/hir_utils.rs
+++ b/src/tools/clippy/clippy_utils/src/hir_utils.rs
@@ -663,7 +663,8 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> {
                                 self.hash_expr(out_expr);
                             }
                         },
-                        InlineAsmOperand::Const { expr } | InlineAsmOperand::Sym { expr } => self.hash_expr(expr),
+                        InlineAsmOperand::Const { anon_const } => self.hash_body(anon_const.body),
+                        InlineAsmOperand::Sym { expr } => self.hash_expr(expr),
                     }
                 }
             },