1022: attribute expansion: Fix spurious stripping of tail expression r=CohenArthur a=CohenArthur

This commit fixes the issue reported in #391, but highlights another
one, which will be reported.

Closes #391 

1033: Fix bad copy-paste in can equal interface for pointer types r=philberty a=philberty

When we perform method resolution we check if the self arguments can be
matched. Here the bug was that pointer types had a bad vistitor and only
could ever match reference types which is wrong and was a copy paste error.

Fixes #1031
Addresses #849 


Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
This commit is contained in:
bors[bot] 2022-03-17 10:53:07 +00:00 committed by GitHub
commit 3ada3d8365
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 6 deletions

View File

@ -249,7 +249,8 @@ public:
BYTE_STRING,
INT,
FLOAT,
BOOL
BOOL,
ERROR
};
private:
@ -274,11 +275,11 @@ public:
static Literal create_error ()
{
return Literal ("", CHAR, PrimitiveCoreType::CORETYPE_UNKNOWN);
return Literal ("", ERROR, PrimitiveCoreType::CORETYPE_UNKNOWN);
}
// Returns whether literal is in an invalid state.
bool is_error () const { return value_as_string == ""; }
bool is_error () const { return type == ERROR; }
};
/* Forward decl - definition moved to rust-expr.h as it requires LiteralExpr to

View File

@ -359,6 +359,10 @@ public:
case AST::Literal::LitType::BOOL:
type = HIR::Literal::LitType::BOOL;
break;
// Error literals should have been stripped during expansion
case AST::Literal::LitType::ERROR:
gcc_unreachable ();
break;
}
auto crate_num = mappings->get_current_crate ();
Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),

View File

@ -1240,7 +1240,7 @@ public:
: BaseCmp (base, emit_errors), base (base)
{}
void visit (const ReferenceType &type) override
void visit (const PointerType &type) override
{
auto base_type = base->get_base ();
auto other_base_type = type.get_base ();

View File

@ -0,0 +1,16 @@
extern "rust-intrinsic" {
pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
}
#[lang = "const_ptr"]
impl<T> *const T {
pub const unsafe fn offset(self, count: isize) -> *const T {
// { dg-warning "associated function is never used" "" { target *-*-* } .-1 }
unsafe { offset(self, count) }
}
pub const unsafe fn add(self, count: usize) -> Self {
// { dg-warning "associated function is never used" "" { target *-*-* } .-1 }
unsafe { self.offset(count as isize) }
}
}

View File

@ -1,3 +1,5 @@
fn foo (e: &str) -> &str {
&"" // { dg-bogus "cannot strip expression in this position - outer attributes not allowed" "#391" { xfail *-*-* } }
// { dg-additional-options "-w" }
fn foo(e: &str) -> &str { // { dg-bogus "expected" "#391" { xfail *-*-* } }
&"" // { dg-bogus "expected" "#391" { xfail *-*-* } }
}