938: First pass at declarative macro expansion r=philberty a=philberty
This does not support repetition matchers but it supports simple
declarative macros and transcribes them. The approach taken here is that
we reuse our existing parser to call the apropriate functions as specified
as part of the MacroFragmentType enum if the parser does not have errors
parsing that item then it must be a match.
Then once we match a rule we have a map of the token begin/end offsets
for each fragment match, this is then used to adjust and create a new token
stream for the macro rule definition so that when we feed it to the parser
the tokens are already substituted. The resulting expression or item is
then attached to the respective macro invocation and this is then name
resolved and used for hir lowering.
Fixes#17#22
Addresses #573
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Addresses issue #717
1) Changed the rust-path.h and removed the iterate_path_segments
fuction.
2) Removed the lambda fuction form rust-ast-lower.cc and replaced it
with a for loop.
Signed-off-by : M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
This allows for macro invocation at the toplevel or as statements. This
patched required us to propogate the delimited token tree fix to include
the delimiter tokens. The rest of the fix was straight forward to call
the apropriate visitors in names resolution and hir lowering.
Some thought will be needed to handle hir lowering for repeating items.
When we parse DelimTokenTree's the delimiter's are synthesised when we
ask for the token stream which results in tokens lacking location info.
This removes the hack by adding the actual tokens from the lexer into the
stream.
This is the first pass at implementing macros more testcases are needed.
This does not support repetition matchers but it supports simple
declarative macros and transcribes them. The approach taken here is that
we reuse our existing parser to call the apropriate functions as specified
as part of the MacroFragmentType enum if the parser does not have errors
parsing that item then it must be a match.
Then once we match a rule we have a map of the token begin/end offsets
for each fragment match, this is then used to adjust and create a new token
stream for the macro rule definition so that when we feed it to the parser
the tokens are already substituted. The resulting expression or item is
then attached to the respective macro invocation and this is then name
resolved and used for hir lowering.
Fixes#17#22
Addresses #573
935: frust-cfg: Only allow double quoted values r=philberty a=CohenArthur
Closes#910
This PR separates the `handle_cfg_option()` function in two, separating the parsing logic from the session logic. The parsing logic is able to be unit tested, and now only allows quoted values.
What remains to be done is to only allow `key` and `value` to be proper rust identifiers. We need to figure out if we'd like to spawn a parser here and parse identifiers, or simply sanitize both strings to make sure they do not contain invalid characters.
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
This commit separates the `handle_cfg_option()` function in two,
separating the parsing logic from the session logic. The parsing logic
is able to be unit tested, and now only allows quoted values.
932: Add location information to MacroRule r=CohenArthur a=CohenArthur
Closes#930
This PR adds location information to the `MacroRule` structure.
The location is from the beginning of the invokation pattern, so that errors look like so:
```rust
test.rs:2:5: error: ...
2 | ($a:expr, $b:expr) => { a + b }
| ^
```
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
933: macrotranscriber: Add location info r=CohenArthur a=CohenArthur
Closes#929
Adds location info to the macro's transcriber. When generating a `MacroRule` error, this PR creates an empty location for the transcriber, since the error function is only called if no fat arrow is present or if there was an error parsing the macro's matcher. Please let me know if this is the expected behavior
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
934: macromatch: Add location to abstract MacroMatch class r=philberty a=CohenArthur
Closes#928
This adds location to the all child classes of the `MacroMatch` abstract class. The current locations are as follow, which I believe is what is expected but might be wrong.
```rust
test.rs:2:6: error: macro match fragment
2 | ($a:expr, $b:expr) => { $a + $b };
| ^
test.rs:2:15: error: macro match fragment
2 | ($a:expr, $b:expr) => { $a + $b };
| ^
test.rs:2:5: error: macro matcher
2 | ($a:expr, $b:expr) => { $a + $b };
| ^
test.rs:3:8: error: macro match fragment
3 | ($($i:ident)*) => { $($i)* }
| ^
test.rs:3:17: error: macro match repetition!
3 | ($($i:ident)*) => { $($i)* }
| ^
test.rs:3:5: error: macro matcher
3 | ($($i:ident)*) => { $($i)* }
| ^
```
I think this should be rebased on #932 so that I can remove the FIXME
937: dockerfile: Install cargo-gccrs alongside gccrs r=philberty a=CohenArthur
Closes#826
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
931: rust-cfg: Quote option name when erroring out r=philberty a=CohenArthur
Removes a warning generated by `-Wformat-diag`
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
926: macros: Add multiple macro syntax tests r=CohenArthur a=CohenArthur
This PR adds test cases for macros, including parsing and execution.
I am unsure on how to check for proper execution: The solution I have chosen so far is to make sure that a correct amount of lines is printed, which I'm not entirely satisfied with.
Another solution would be to increase a global integer to use when exiting, which we can then assert on using dejagnu, which is cleaner but relies on unsafe rust code.
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
922: Support inline never and always options r=philberty a=philberty
This maps over to DECL_UNINLINEABLE and to use the GCC attribute
always_inline.
Fixes#921
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
920: Support deref_mut lang item during method resolution r=philberty a=philberty
This adds in the lookups for the DEREF_MUT lang item for operator overloading
this needs more testing to ensure the behaviour is correct and is the same as
rustc.
Fixes#890
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
When we have method resolution we need to look at any deref lang items for
the receiver. The precise rules need to be tested rigorously to ensure this is right.
Fixes#890
918: Refactor code to reuse a canonical way to compile items r=philberty a=philberty
This is a big cleanup so all paths that compile functions and constants
end up in the same path so we avoid any duplication in how we actually
compile a function or constant.
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
This is a big cleanup so all paths that compile functions and constants
end up in the same path so we avoid any duplication in how we actually
compile a function.
917: remove tree addressable context during type checking r=philberty a=philberty
We can reuse more C front-end code c_mark_addressable can be used instead
of trying to track TREE_ADDRESSABLE as part of type-checking. This also
pulls the GCC::Backend::address_expression to be part of the HIRCompileBase
class during code-generation.
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
We can reuse more C front-end code c_mark_addressable can be used instead
of trying to track TREE_ADDRESSABLE as part of type-checking. This also
pulls the GCC::Backend::address_expression to be part of the HIRCompileBase
class during code-generation.
916: Support inline attribute by marking as DECL_DECLARED_INLINE_P r=philberty a=philberty
This does a refactor by removing more flags for the fndecl construction
from the rust-gcc wrapper code in favour of using the tree api directly.
The ABI option attributes have also been refactored from the backend
interface in favour of their own package.
The gccgo wrapper tried to mark inline fns as extern inline but this
refactor allows us to control the inline options specificly for the
rust semantics.
Fixes#857
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
This does a refactor by removing more flags for the fndecl construction
from the rust-gcc wrapper code in favour of using the tree api directly.
The ABI option attributes have also been refactored from the backend
interface in favour of their own package.
The gccgo wrapper tried to mark inline fns as extern inline but this
refactor allows us to control the inline options specificly for the
rust semantics.
Fixes#857
912: Handle generic substitution on path expressions r=philberty a=philberty
In this bug the path expression failed to take Foo::<i32> and apply this
bound generic argument into the impl block. The fn type for this function
test is:
fn <T,Y>test(a:T, b:Y);
But the impl block has a Self of Foo<T> so we need to inherit the T
argument from the previous Foo::<i32> which was missing.
Fixes#893
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
911: Refactor to_string from header to impl file r=philberty a=philberty
This is part of the overal cleanup to move implementation into cc files from the headers.
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
In this bug the path expression failed to take Foo::<i32> and apply this
bound generic argument into the impl block. The fn type for this function
test is:
fn <T,Y>test(a:T, b:Y);
But the impl block has a Self of Foo<T> so we need to inherit the T
argument from the previous Foo::<i32> which was missing.
Fixes#893