}
}
+void
+FeatureGate::check_rustc_attri (const std::vector<AST::Attribute> &attributes)
+{
+ for (const AST::Attribute &attr : attributes)
+ {
+ auto name = attr.get_path ().as_string ();
+ if (name.rfind ("rustc_", 0) == 0)
+ {
+ gate (Feature::Name::RUSTC_ATTRS, attr.get_locus (),
+ "internal implementation detail");
+ }
+ }
+}
+
+void
+FeatureGate::visit (AST::MacroRulesDefinition &rules_def)
+{
+ check_rustc_attri (rules_def.get_outer_attrs ());
+}
+
+void
+FeatureGate::visit (AST::InherentImpl &impl)
+{
+ for (const auto &item : impl.get_impl_items ())
+ {
+ item->accept_vis (*this);
+ }
+}
+
+void
+FeatureGate::visit (AST::TraitImpl &impl)
+{
+ for (const auto &item : impl.get_impl_items ())
+ {
+ item->accept_vis (*this);
+ }
+}
+
+void
+FeatureGate::visit (AST::Method &method)
+{
+ check_rustc_attri (method.get_outer_attrs ());
+}
+
+void
+FeatureGate::visit (AST::Function &function)
+{
+ check_rustc_attri (function.get_outer_attrs ());
+}
+
} // namespace Rust
\ No newline at end of file
namespace Rust {
-struct Feature;
-
class FeatureGate : public AST::ASTVisitor
{
public:
void visit (AST::TypeParam ¶m) override {}
void visit (AST::LifetimeWhereClauseItem &item) override {}
void visit (AST::TypeBoundWhereClauseItem &item) override {}
- void visit (AST::Method &method) override {}
+ void visit (AST::Method &method) override;
void visit (AST::Module &module) override {}
void visit (AST::ExternCrate &crate) override {}
void visit (AST::UseTreeGlob &use_tree) override {}
void visit (AST::UseTreeList &use_tree) override {}
void visit (AST::UseTreeRebind &use_tree) override {}
void visit (AST::UseDeclaration &use_decl) override {}
- void visit (AST::Function &function) override {}
+ void visit (AST::Function &function) override;
void visit (AST::TypeAlias &type_alias) override {}
void visit (AST::StructStruct &struct_item) override {}
void visit (AST::TupleStruct &tuple_struct) override {}
void visit (AST::TraitItemConst &item) override {}
void visit (AST::TraitItemType &item) override {}
void visit (AST::Trait &trait) override {}
- void visit (AST::InherentImpl &impl) override {}
- void visit (AST::TraitImpl &impl) override {}
+ void visit (AST::InherentImpl &impl) override;
+ void visit (AST::TraitImpl &impl) override;
void visit (AST::ExternalStaticItem &item) override {}
void visit (AST::ExternalFunctionItem &item) override {}
void visit (AST::ExternBlock &block) override;
void visit (AST::MacroMatchFragment &match) override {}
void visit (AST::MacroMatchRepetition &match) override {}
void visit (AST::MacroMatcher &matcher) override {}
- void visit (AST::MacroRulesDefinition &rules_def) override {}
+ void visit (AST::MacroRulesDefinition &rules_def) override;
void visit (AST::MacroInvocation ¯o_invoc) override {}
void visit (AST::MetaItemPath &meta_item) override {}
void visit (AST::MetaItemSeq &meta_item) override {}
private:
void gate (Feature::Name name, Location loc, const std::string &error_msg);
+ void check_rustc_attri (const std::vector<AST::Attribute> &attributes);
std::set<Feature::Name> valid_features;
};
} // namespace Rust
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! compile_error {
() => {{}};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! concat {
() => {{}};
// { dg-additional-options "-fdump-tree-gimple" }
+#![feature(rustc_attrs)]
#[rustc_builtin_macro]
macro_rules! concat {
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! env {
() => {};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! env {
() => {{}};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_bytes {
() => {{}};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_str {
() => {{}};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! crabby_crab_carb { // { dg-error "cannot find a built-in macro with name .crabby_crab_carb." }
() => {{}};
// { dg-additional-options "-fdump-tree-gimple" }
+#![feature(rustc_attrs)]
#[rustc_builtin_macro]
macro_rules! concat {
--- /dev/null
+#[rustc_builtin_macro] //{ dg-error "internal implementation detail. " "" { target *-*-* } }
+macro_rules! line {
+ () => {{}};
+}
+
+fn main() -> i32 {
+ let a = line!();
+ print(a);
+
+ 0
+}
--- /dev/null
+
+pub struct NotI8(i8);
+
+impl NotI8 {
+ #[rustc_inherit_overflow_checks] //{ dg-error "internal implementation detail" "" { target *-*-* } }
+ pub fn add(self, other: NotI8) -> NotI8 {
+ NotI8(self.0 + other.0)
+ }
+}
+
+fn main() -> i32 {
+ 0
+}
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include {
() => {};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_bytes {
() => {{}};
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_str {
() => {{}};
// { dg-additional-options "-w -frust-cfg=A" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! cfg {
() => {{}};
// { dg-additional-options "-w -frust-cfg=A" }
// { dg-output "A\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! cfg {
() => {{}};
// { dg-output "\r*\ntest10btrue2.15\r*\ntest10bfalse2.151\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! concat {
() => {{}};
// { dg-output "VALUE\r*\nVALUE\r*\n" }
// { dg-set-compiler-env-var ENV_MACRO_TEST "VALUE" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! env {
() => {{}};
// { dg-output "104\r*\n33\r*\n1\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_bytes {
() => {{}};
// { dg-output "hello, include!\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! include_str {
() => {{}};
-// { dg-output "18\r*\n21\r*\n" }
+// { dg-output "20\r*\n23\r*\n" }
+#![feature(rustc_attrs)]
+
extern "C" {
fn printf(fmt: *const i8, ...);
}
// { dg-output "rust/execute/torture/builtin_macros1.rs\r*" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! file {
() => {{}};
// { dg-output "14\r*\n42\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! column {
() => {{}};
// { dg-output "1\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! concat {
() => {{}};
// { dg-output "1\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! concat {
() => {{}};
// { dg-additional-options "-w -frust-cfg=A" }
// { dg-output "A\r*\nB\r*\n" }
+#![feature(rustc_attrs)]
+
#[rustc_builtin_macro]
macro_rules! cfg {
() => {{}};