From: Jean-Christian CÎRSTEA <[email protected]>
When an intrisic is used with an incorrect type, prin the location of
the call site, not the declaration.
Fixes Rust-GCC/gccrs#4465.
gcc/rust/ChangeLog:
* backend/rust-intrinsic-handlers.cc
(check_for_basic_integer_type): Fixed typo.
(build_atomic_builtin_name): Update message.
(unchecked_op, atomic_store, ctlz_handler)
(cttz_handler, bswap_handler): Use call location.
gcc/testsuite/ChangeLog:
* rust/compile/bswap.rs: Update error location.
* rust/compile/ctlz.rs: Likewise.
* rust/compile/ctlz_nonzero.rs: Likewise.
* rust/compile/cttz.rs: Likewise.
* rust/compile/cttz_nonzero.rs: Likewise.
* rust/compile/torture/intrinsics-5.rs: Likewise.
* rust/compile/torture/intrinsics-7.rs: Likewise.
Signed-off-by: Jean-Christian CÎRSTEA <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.
Commit on github:
https://github.com/Rust-GCC/gccrs/commit/98d729a316b926aeb78dd26d9b184b8568bf784a
The commit has been mentioned in the following issue(s):
- Rust-GCC/gccrs#4465: https://github.com/Rust-GCC/gccrs/issues/4465
The commit has been mentioned in the following pull-request(s):
- https://github.com/Rust-GCC/gccrs/pull/4502
gcc/rust/backend/rust-intrinsic-handlers.cc | 25 ++++++++++---------
gcc/testsuite/rust/compile/bswap.rs | 4 +--
gcc/testsuite/rust/compile/ctlz.rs | 4 +--
gcc/testsuite/rust/compile/ctlz_nonzero.rs | 4 +--
gcc/testsuite/rust/compile/cttz.rs | 4 +--
gcc/testsuite/rust/compile/cttz_nonzero.rs | 4 +--
.../rust/compile/torture/intrinsics-5.rs | 4 +--
.../rust/compile/torture/intrinsics-7.rs | 2 +-
8 files changed, 26 insertions(+), 25 deletions(-)
diff --git a/gcc/rust/backend/rust-intrinsic-handlers.cc
b/gcc/rust/backend/rust-intrinsic-handlers.cc
index 8cbcb9ca4..dab2ca861 100644
--- a/gcc/rust/backend/rust-intrinsic-handlers.cc
+++ b/gcc/rust/backend/rust-intrinsic-handlers.cc
@@ -80,7 +80,7 @@ check_for_basic_integer_type (const std::string
&intrinsic_str,
{
rust_error_at (
locus,
- "%s intrinsics can only be used with basic integer types (got %qs)",
+ "%s intrinsic can only be used with basic integer types (got %qs)",
intrinsic_str.c_str (), type->get_name ().c_str ());
}
@@ -218,7 +218,7 @@ build_atomic_builtin_name (const std::string &prefix,
location_t locus,
auto type_size_str = allowed_types.find (type_name);
- if (!check_for_basic_integer_type ("atomic", locus, operand_type))
+ if (!check_for_basic_integer_type ("atomic operation", locus, operand_type))
return "";
result += type_size_str->second;
@@ -255,7 +255,8 @@ unchecked_op (Context *ctx, TyTy::FnType *fntype, tree_code
op)
auto *monomorphized_type
= fntype->get_substs ().at (0).get_param_ty ()->resolve ();
- check_for_basic_integer_type ("unchecked operation", fntype->get_locus (),
+ auto call_locus = ctx->get_mappings ().lookup_location (fntype->get_ref ());
+ check_for_basic_integer_type ("unchecked operation", call_locus,
monomorphized_type);
auto expr = build2 (op, TREE_TYPE (x), x, y);
@@ -660,9 +661,9 @@ atomic_store (Context *ctx, TyTy::FnType *fntype, int
ordering)
auto monomorphized_type
= fntype->get_substs ()[0].get_param_ty ()->resolve ();
- auto builtin_name
- = build_atomic_builtin_name ("atomic_store_", fntype->get_locus (),
- monomorphized_type);
+ auto call_locus = ctx->get_mappings ().lookup_location (fntype->get_ref ());
+ auto builtin_name = build_atomic_builtin_name ("atomic_store_", call_locus,
+ monomorphized_type);
if (builtin_name.empty ())
return error_mark_node;
@@ -777,8 +778,8 @@ ctlz_handler (Context *ctx, TyTy::FnType *fntype, bool
nonzero)
rust_assert (fntype->get_num_substitutions () == 1);
auto *monomorphized_type
= fntype->get_substs ().at (0).get_param_ty ()->resolve ();
- if (!check_for_basic_integer_type ("ctlz", fntype->get_locus (),
- monomorphized_type))
+ auto call_locus = ctx->get_mappings ().lookup_location (fntype->get_ref ());
+ if (!check_for_basic_integer_type ("ctlz", call_locus, monomorphized_type))
return error_mark_node;
enter_intrinsic_block (ctx, fndecl);
@@ -922,8 +923,8 @@ cttz_handler (Context *ctx, TyTy::FnType *fntype, bool
nonzero)
rust_assert (fntype->get_num_substitutions () == 1);
auto *monomorphized_type
= fntype->get_substs ().at (0).get_param_ty ()->resolve ();
- if (!check_for_basic_integer_type ("cttz", fntype->get_locus (),
- monomorphized_type))
+ auto call_locus = ctx->get_mappings ().lookup_location (fntype->get_ref ());
+ if (!check_for_basic_integer_type ("cttz", call_locus, monomorphized_type))
return error_mark_node;
enter_intrinsic_block (ctx, fndecl);
@@ -1672,8 +1673,8 @@ bswap_handler (Context *ctx, TyTy::FnType *fntype)
auto *monomorphized_type
= fntype->get_substs ().at (0).get_param_ty ()->resolve ();
- check_for_basic_integer_type ("bswap", fntype->get_locus (),
- monomorphized_type);
+ auto call_locus = ctx->get_mappings ().lookup_location (fntype->get_ref ());
+ check_for_basic_integer_type ("bswap", call_locus, monomorphized_type);
tree template_parameter_type
= TyTyResolveCompile::compile (ctx, monomorphized_type);
diff --git a/gcc/testsuite/rust/compile/bswap.rs
b/gcc/testsuite/rust/compile/bswap.rs
index a41607efc..2e1c920e2 100644
--- a/gcc/testsuite/rust/compile/bswap.rs
+++ b/gcc/testsuite/rust/compile/bswap.rs
@@ -9,9 +9,9 @@ pub trait Sized {}
pub trait Copy {}
extern "rust-intrinsic" {
- pub fn bswap<T>(x: T) -> T; // { dg-error "bswap intrinsics can only be
used with basic integer types .got 'bool'." }
+ pub fn bswap<T>(x: T) -> T;
}
fn main() {
- let _ = bswap(true);
+ let _ = bswap(true); // { dg-error "bswap intrinsic can only be used with
basic integer types .got .bool.." }
}
diff --git a/gcc/testsuite/rust/compile/ctlz.rs
b/gcc/testsuite/rust/compile/ctlz.rs
index b886be774..625b8847b 100644
--- a/gcc/testsuite/rust/compile/ctlz.rs
+++ b/gcc/testsuite/rust/compile/ctlz.rs
@@ -9,9 +9,9 @@ pub trait Sized {}
pub trait Copy {}
extern "rust-intrinsic" {
- pub fn ctlz<T>(x: T) -> u32; // { dg-error "ctlz intrinsics can only be
used with basic integer types .got 'bool'." }
+ pub fn ctlz<T>(x: T) -> u32;
}
fn main() {
- let _ = ctlz(true);
+ let _ = ctlz(true); // { dg-error "ctlz intrinsic can only be used with
basic integer types .got .bool.." }
}
diff --git a/gcc/testsuite/rust/compile/ctlz_nonzero.rs
b/gcc/testsuite/rust/compile/ctlz_nonzero.rs
index bf12728d2..74c3fb96a 100644
--- a/gcc/testsuite/rust/compile/ctlz_nonzero.rs
+++ b/gcc/testsuite/rust/compile/ctlz_nonzero.rs
@@ -9,11 +9,11 @@ pub trait Sized {}
pub trait Copy {}
extern "rust-intrinsic" {
- pub fn ctlz_nonzero<T>(x: T) -> u32; // { dg-error "ctlz intrinsics can
only be used with basic integer types .got 'bool'." }
+ pub fn ctlz_nonzero<T>(x: T) -> u32;
}
fn main() {
unsafe {
- let _ = ctlz_nonzero(true);
+ let _ = ctlz_nonzero(true); // { dg-error "ctlz intrinsic can only be
used with basic integer types .got .bool.." }
}
}
diff --git a/gcc/testsuite/rust/compile/cttz.rs
b/gcc/testsuite/rust/compile/cttz.rs
index b072167ac..2267bdeff 100644
--- a/gcc/testsuite/rust/compile/cttz.rs
+++ b/gcc/testsuite/rust/compile/cttz.rs
@@ -9,9 +9,9 @@ pub trait Sized {}
pub trait Copy {}
extern "rust-intrinsic" {
- pub fn cttz<T>(x: T) -> u32; // { dg-error "cttz intrinsics can only be
used with basic integer types .got 'bool'." }
+ pub fn cttz<T>(x: T) -> u32;
}
fn main() {
- let _ = cttz(true);
+ let _ = cttz(true); // { dg-error "cttz intrinsic can only be used with
basic integer types .got 'bool'." }
}
diff --git a/gcc/testsuite/rust/compile/cttz_nonzero.rs
b/gcc/testsuite/rust/compile/cttz_nonzero.rs
index 210bd8bd2..e8e49dbce 100644
--- a/gcc/testsuite/rust/compile/cttz_nonzero.rs
+++ b/gcc/testsuite/rust/compile/cttz_nonzero.rs
@@ -9,11 +9,11 @@ pub trait Sized {}
pub trait Copy {}
extern "rust-intrinsic" {
- pub fn cttz_nonzero<T>(x: T) -> u32; // { dg-error "cttz intrinsics can
only be used with basic integer types .got 'bool'." }
+ pub fn cttz_nonzero<T>(x: T) -> u32;
}
fn main() {
unsafe {
- let _ = cttz_nonzero(true);
+ let _ = cttz_nonzero(true); // { dg-error "cttz intrinsic can only be
used with basic integer types .got 'bool'." }
}
}
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-5.rs
b/gcc/testsuite/rust/compile/torture/intrinsics-5.rs
index 28c4f191b..39d717664 100644
--- a/gcc/testsuite/rust/compile/torture/intrinsics-5.rs
+++ b/gcc/testsuite/rust/compile/torture/intrinsics-5.rs
@@ -65,8 +65,6 @@ mod copy_impls {
extern "rust-intrinsic" {
pub fn atomic_store_seqcst<T: Copy>(dst: *mut T, value: T);
- // { dg-error "atomic intrinsics can only be used with basic integer types
.got .VeryLargeType.." "" { target *-*-* } .-1 }
- // { dg-error "atomic intrinsics can only be used with basic integer types
.got .bool.." "" { target *-*-* } .-2 }
}
struct VeryLargeType {
@@ -100,6 +98,8 @@ fn main() {
unsafe {
atomic_store_seqcst(&mut dst, VeryLargeType::new(1));
+ // { dg-error "atomic operation intrinsic can only be used with basic
integer types .got .VeryLargeType.." "" { target *-*-* } .-1 }
atomic_store_seqcst(&mut b, true);
+ // { dg-error "atomic operation intrinsic can only be used with basic
integer types .got .bool.." "" { target *-*-* } .-1 }
}
}
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
index 371066c1e..159ebeab4 100644
--- a/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
+++ b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
@@ -9,11 +9,11 @@ pub trait Sized {}
extern "rust-intrinsic" {
pub fn unchecked_add<T>(x: T, y: T) -> T;
- // { dg-error "unchecked operation intrinsics can only be used with basic
integer types .got .NotAdd.." "" { target *-*-* } .-1 }
}
fn main() {
struct NotAdd;
unsafe { unchecked_add(NotAdd, NotAdd) };
+ // { dg-error "unchecked operation intrinsic can only be used with basic
integer types .got .NotAdd.." "" { target *-*-* } .-1 }
}
base-commit: b2db938d1c4a034f63baedd9eae7698497b3d0f7
--
2.54.0