@@ -1420,13 +1420,111 @@ names are effectively reserved. Some significant attributes include:
14201420
14211421* The ` doc ` attribute, for documenting code in-place.
14221422* The ` cfg ` attribute, for conditional-compilation by build-configuration.
1423+ * The ` lang ` attribute, for custom definitions of traits and functions that are known to the Rust compiler (see [ Language items] ( #language-items ) ).
14231424* The ` link ` attribute, for describing linkage metadata for a crate.
14241425* The ` test ` attribute, for marking functions as unit tests.
1425- * The ` allow ` , ` warn ` , ` forbid ` , and ` deny ` attributes, for controling lint checks. Lint checks supported
1426+ * The ` allow ` , ` warn ` , ` forbid ` , and ` deny ` attributes, for controlling lint checks. Lint checks supported
14261427by the compiler can be found via ` rustc -W help ` .
14271428
14281429Other attributes may be added or removed during development of the language.
14291430
1431+ ### Language items
1432+
1433+ Some primitive Rust operations are defined in Rust code,
1434+ rather than being implemented directly in C or assembly language.
1435+ The definitions of these operations have to be easy for the compiler to find.
1436+ The ` lang ` attribute makes it possible to declare these operations.
1437+ For example, the ` str ` module in the Rust core library defines the string equality function:
1438+
1439+ ~~~
1440+ #[lang="str_eq"]
1441+ pub fn eq_slice(a: &str, b: &str) -> bool {
1442+ true // not actually the implementation
1443+ }
1444+ ~~~
1445+
1446+ The name ` str_eq ` has a special meaning to the Rust compiler,
1447+ and the presence of this definition means that it will use this definition
1448+ when generating calls to the string equality function.
1449+
1450+ A complete list of the built-in language items follows:
1451+
1452+ #### Traits
1453+
1454+ ` const `
1455+ : Cannot be mutated.
1456+ ` copy `
1457+ : Can be implicitly copied.
1458+ ` owned `
1459+ : Are uniquely owned.
1460+ ` durable `
1461+ : Contain borrowed pointers.
1462+ ` drop `
1463+ : Have finalizers.
1464+ ` add `
1465+ : Elements can be added (for example, integers and floats).
1466+ ` sub `
1467+ : Elements can be subtracted.
1468+ ` mul `
1469+ : Elements can be multiplied.
1470+ ` div `
1471+ : Elements can be divided.
1472+ ` mod `
1473+ : Elements have a modulo operation.
1474+ ` neg `
1475+ : Elements can be negated arithmetically.
1476+ ` not `
1477+ : Elements can be negated logically.
1478+ ` bitxor `
1479+ : Elements have an exclusive-or operation.
1480+ ` bitand `
1481+ : Elements have a bitwise ` and ` operation.
1482+ ` bitor `
1483+ : Elements have a bitwise ` or ` operation.
1484+ ` shl `
1485+ : Elements have a left shift operation.
1486+ ` shr `
1487+ : Elements have a right shift operation.
1488+ ` index `
1489+ : Elements can be indexed.
1490+ ` eq `
1491+ : Elements can be compared for equality.
1492+ ` ord `
1493+ : Elements have a partial ordering.
1494+
1495+ #### Operations
1496+
1497+ ` str_eq `
1498+ : Compare two strings for equality.
1499+ ` uniq_str_eq `
1500+ : Compare two owned strings for equality.
1501+ ` annihilate `
1502+ : Destroy a box before freeing it.
1503+ ` log_type `
1504+ : Generically print a string representation of any type.
1505+ ` fail_ `
1506+ : Abort the program with an error.
1507+ ` fail_bounds_check `
1508+ : Abort the program with a bounds check error.
1509+ ` exchange_malloc `
1510+ : Allocate memory on the exchange heap.
1511+ ` exchange_free `
1512+ : Free memory that was allocated on the exchange heap.
1513+ ` malloc `
1514+ : Allocate memory on the managed heap.
1515+ ` free `
1516+ : Free memory that was allocated on the managed heap.
1517+ ` borrow_as_imm `
1518+ : Create an immutable borrowed pointer to a mutable value.
1519+ ` return_to_mut `
1520+ : Release a borrowed pointer created with ` return_to_mut `
1521+ ` check_not_borrowed `
1522+ : Fail if a value has existing borrowed pointers to it.
1523+ ` strdup_uniq `
1524+ : Return a new unique string containing a copy of the contents of a unique string.
1525+
1526+ > ** Note:** This list is likely to become out of date. We should auto-generate it
1527+ > from ` librustc/middle/lang_items.rs ` .
14301528
14311529# Statements and expressions
14321530
0 commit comments