Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gcc/rust/backend/rust-mangle.cc
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ legacy_mangle_name (const std::string &name)
i++;
m = "..";
}
else if (c.value < 0x80)
else if (c.is_ascii ())
// ASCII
m.push_back (c.value);
else
Expand Down
3 changes: 0 additions & 3 deletions gcc/rust/lex/rust-input-source.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@ constexpr uint8_t UTF8_BOM1 = 0xEF;
constexpr uint8_t UTF8_BOM2 = 0xBB;
constexpr uint8_t UTF8_BOM3 = 0xBF;

constexpr uint32_t MAX_ASCII_CODEPOINT = 0x7F;
constexpr uint32_t CODEPOINT_INVALID = 0xFFFE;

// Input source wrapper thing.
class InputSource
{
Expand Down
2 changes: 1 addition & 1 deletion gcc/rust/lex/rust-lex.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1734,7 +1734,7 @@ Lexer::parse_byte_char (location_t loc)
// otherwise, get character from direct input character
byte_char = current_char;

if (byte_char.value > 0x7f)
if (!byte_char.is_ascii ())
{
rust_error_at (get_current_location (),
"non-ASCII character in %<byte char%>");
Expand Down
19 changes: 19 additions & 0 deletions gcc/rust/util/rust-attributes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "rust-ast.h"
#include "rust-ast-full.h"
#include "rust-diagnostics.h"
#include "rust-unicode.h"

namespace Rust {
namespace Analysis {
Expand Down Expand Up @@ -612,6 +613,22 @@ AttributeChecker::visit (AST::UseDeclaration &declaration)
check_proc_macro_non_function (declaration.get_outer_attrs ());
}

static void
check_no_mangle_function (const AST::Attribute &attribute,
const AST::Function &fun)
{
if (attribute.has_attr_input ())
{
rust_error_at (attribute.get_locus (), ErrorCode::E0754,
"malformed %<no_mangle%> attribute input");
rust_inform (attribute.get_locus (),
"must be of the form: %<#[no_mangle]%>");
}
if (!is_ascii_only (fun.get_function_name ().as_string ()))
rust_error_at (fun.get_function_name ().get_locus (),
"the %<#[no_mangle]%> attribute requires ASCII identifier");
}

void
AttributeChecker::visit (AST::Function &fun)
{
Expand Down Expand Up @@ -649,6 +666,8 @@ AttributeChecker::visit (AST::Function &fun)
{
check_crate_type (name, attribute);
}
else if (result.name == "no_mangle")
check_no_mangle_function (attribute, fun);
}
fun.get_definition ()->accept_vis (*this);
}
Expand Down
4 changes: 4 additions & 0 deletions gcc/rust/util/rust-codepoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@

namespace Rust {

constexpr uint32_t MAX_ASCII_CODEPOINT = 0x7F;
constexpr uint32_t CODEPOINT_INVALID = 0xFFFE;

// FIXME: move this to rust-unicode.h?
struct Codepoint
{
Expand All @@ -36,6 +39,7 @@ struct Codepoint

static Codepoint eof () { return Codepoint (UINT32_MAX); }
bool is_eof () const { return value == UINT32_MAX; }
bool is_ascii () const { return value <= MAX_ASCII_CODEPOINT; }

// Returns a C++ string containing string value of codepoint.
std::string as_string ();
Expand Down
2 changes: 1 addition & 1 deletion gcc/rust/util/rust-punycode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extract_basic_string (const std::vector<Codepoint> &src)
std::string basic_string;
for (auto c : src)
{
if (c.value <= 0x7F)
if (c.is_ascii ())
basic_string += c.as_string ();
}
return basic_string;
Expand Down
10 changes: 10 additions & 0 deletions gcc/rust/util/rust-unicode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
// along with GCC; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.

#include "rust-input-source.h"
#include "rust-system.h"
#include "optional.h"
#include "selftest.h"
Expand Down Expand Up @@ -328,6 +329,15 @@ is_numeric (uint32_t codepoint)
return true;
}

bool
is_ascii_only (const std::string &str)
{
for (char c : str)
if (static_cast<uint32_t> (c) > MAX_ASCII_CODEPOINT)
return false;
return true;
}

} // namespace Rust

#if CHECKING_P
Expand Down
3 changes: 3 additions & 0 deletions gcc/rust/util/rust-unicode.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ class Utf8String
bool
is_alphabetic (uint32_t codepoint);

bool
is_ascii_only (const std::string &str);

bool
is_numeric (uint32_t codepoint);

Expand Down