* expression functions and raise expressions
@ 2018-03-03 18:39 Jere
2018-03-03 20:03 ` Jeffrey R. Carter
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Jere @ 2018-03-03 18:39 UTC (permalink / raw)
I wanted to double check if I am reading the RM correctly.
From 6.8 2/4, I see that a function expression can consist entirely
of an (expression)
Section 4.4 2 says that an expression can be made up of a single
(relation)
Section 4.4 3/4 further says a relation can be a raise expression.
Given that, I expect that the following declaration/definition is correct:
function Reference
(Container : aliased in out Container_Type;
Cursor : Cursor_Type)
return Reference_Type
is (raise My_Exception
with "Reference not supported for Ordered_Sets")
with Inline;
GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
gives some errors:
test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005 6.5(5.5/2))
test.ads:328:11: return by reference not permitted in Ada 2005
NOTE: Reference_Type is untagged limited discriminated null
record with Implicit_Dereference defined. Also note that a similar
function that returns an aggregate initialization compiles fine
on both versions.
I am compiling with Ada2012 mode (-gnat12 option)
I believe this to be a bug in GCC 7.2 for mingw64, but wanted to
make sure I wasn't misreading the RM.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-03 18:39 expression functions and raise expressions Jere
@ 2018-03-03 20:03 ` Jeffrey R. Carter
2018-03-03 22:53 ` Jere
2018-03-03 20:54 ` Simon Wright
2018-03-05 20:21 ` Randy Brukardt
2 siblings, 1 reply; 7+ messages in thread
From: Jeffrey R. Carter @ 2018-03-03 20:03 UTC (permalink / raw)
On 03/03/2018 07:39 PM, Jere wrote:
>
> GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> gives some errors:
> test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005 6.5(5.5/2))
> test.ads:328:11: return by reference not permitted in Ada 2005
These messages seem to indicate -gnat05 mode.
> I am compiling with Ada2012 mode (-gnat12 option)
If that's the case, then this does look like a compiler error.
--
Jeff Carter
"Now look, Col. Batguano, if that really is your name."
Dr. Strangelove
31
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-03 18:39 expression functions and raise expressions Jere
2018-03-03 20:03 ` Jeffrey R. Carter
@ 2018-03-03 20:54 ` Simon Wright
2018-03-03 22:54 ` Jere
2018-03-05 20:21 ` Randy Brukardt
2 siblings, 1 reply; 7+ messages in thread
From: Simon Wright @ 2018-03-03 20:54 UTC (permalink / raw)
Jere <jhb.chat@gmail.com> writes:
> GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> gives some errors:
> test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005 6.5(5.5/2))
> test.ads:328:11: return by reference not permitted in Ada 2005
>
> NOTE: Reference_Type is untagged limited discriminated null
> record with Implicit_Dereference defined. Also note that a similar
> function that returns an aggregate initialization compiles fine
> on both versions.
>
> I am compiling with Ada2012 mode (-gnat12 option)
>
> I believe this to be a bug in GCC 7.2 for mingw64, but wanted to
> make sure I wasn't misreading the RM.
It's fixed in GCC 8.
It fails in the same way as 7.1.0, same weird error message about 2005,
with GNAT GPL 2016.
(macOS High Sierra)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-03 20:03 ` Jeffrey R. Carter
@ 2018-03-03 22:53 ` Jere
0 siblings, 0 replies; 7+ messages in thread
From: Jere @ 2018-03-03 22:53 UTC (permalink / raw)
On Saturday, March 3, 2018 at 3:03:36 PM UTC-5, Jeffrey R. Carter wrote:
> On 03/03/2018 07:39 PM, Jere wrote:
> >
> > GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> > gives some errors:
> > test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005 6.5(5.5/2))
> > test.ads:328:11: return by reference not permitted in Ada 2005
>
> These messages seem to indicate -gnat05 mode.
>
> > I am compiling with Ada2012 mode (-gnat12 option)
>
> If that's the case, then this does look like a compiler error.
>
I doubled checked the GPR file and it was indeed 2012, so strange error
indeed.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-03 20:54 ` Simon Wright
@ 2018-03-03 22:54 ` Jere
0 siblings, 0 replies; 7+ messages in thread
From: Jere @ 2018-03-03 22:54 UTC (permalink / raw)
On Saturday, March 3, 2018 at 3:54:06 PM UTC-5, Simon Wright wrote:
> Jere writes:
>
> > GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> > gives some errors:
> > test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005 6.5(5.5/2))
> > test.ads:328:11: return by reference not permitted in Ada 2005
> >
> > NOTE: Reference_Type is untagged limited discriminated null
> > record with Implicit_Dereference defined. Also note that a similar
> > function that returns an aggregate initialization compiles fine
> > on both versions.
> >
> > I am compiling with Ada2012 mode (-gnat12 option)
> >
> > I believe this to be a bug in GCC 7.2 for mingw64, but wanted to
> > make sure I wasn't misreading the RM.
>
> It's fixed in GCC 8.
>
> It fails in the same way as 7.1.0, same weird error message about 2005,
> with GNAT GPL 2016.
>
> (macOS High Sierra)
Ok, thanks for the confirmation. I worked around it, but it definitely
caught me offguard.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-03 18:39 expression functions and raise expressions Jere
2018-03-03 20:03 ` Jeffrey R. Carter
2018-03-03 20:54 ` Simon Wright
@ 2018-03-05 20:21 ` Randy Brukardt
2018-03-07 22:39 ` Jere
2 siblings, 1 reply; 7+ messages in thread
From: Randy Brukardt @ 2018-03-05 20:21 UTC (permalink / raw)
If "Reference_Type" is a limited type, then this would have been correct at
one point: we forgot to allow raise expressions in limited contexts. (Recall
that returning a limited expression from a function is "built-in-place" and
only allows certain expressions, copying objects [for instance] is not
allowed.) I noticed this when writing some ACATS tests in this area, and it
was fixed with a recent Binding Interpretation (correction). But it won't
formally be adopted until Ada 2020, so an Ada 2012 compiler is ""correct" if
it allows or rejects such a use (as corrections can, but don't have to be,
applied to the existing language).
For a non-limited type, this should be just fine. But as a raise expression
matches any type (and thus is different than any previous Ada expression),
it might be buggy in some odd case.
Randy.
"Jere" <jhb.chat@gmail.com> wrote in message
news:60f20df9-4b33-4f29-829e-2fccb89a650a@googlegroups.com...
>I wanted to double check if I am reading the RM correctly.
> From 6.8 2/4, I see that a function expression can consist entirely
> of an (expression)
>
> Section 4.4 2 says that an expression can be made up of a single
> (relation)
>
> Section 4.4 3/4 further says a relation can be a raise expression.
>
> Given that, I expect that the following declaration/definition is correct:
>
> function Reference
> (Container : aliased in out Container_Type;
> Cursor : Cursor_Type)
> return Reference_Type
> is (raise My_Exception
> with "Reference not supported for Ordered_Sets")
> with Inline;
>
> GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> gives some errors:
> test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005
> 6.5(5.5/2))
> test.ads:328:11: return by reference not permitted in Ada 2005
>
> NOTE: Reference_Type is untagged limited discriminated null
> record with Implicit_Dereference defined. Also note that a similar
> function that returns an aggregate initialization compiles fine
> on both versions.
>
> I am compiling with Ada2012 mode (-gnat12 option)
>
> I believe this to be a bug in GCC 7.2 for mingw64, but wanted to
> make sure I wasn't misreading the RM.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: expression functions and raise expressions
2018-03-05 20:21 ` Randy Brukardt
@ 2018-03-07 22:39 ` Jere
0 siblings, 0 replies; 7+ messages in thread
From: Jere @ 2018-03-07 22:39 UTC (permalink / raw)
On Monday, March 5, 2018 at 3:21:18 PM UTC-5, Randy Brukardt wrote:
> "Jere" wrote in message
> >I wanted to double check if I am reading the RM correctly.
> > From 6.8 2/4, I see that a function expression can consist entirely
> > of an (expression)
> >
> > Section 4.4 2 says that an expression can be made up of a single
> > (relation)
> >
> > Section 4.4 3/4 further says a relation can be a raise expression.
> >
> > Given that, I expect that the following declaration/definition is correct:
> >
> > function Reference
> > (Container : aliased in out Container_Type;
> > Cursor : Cursor_Type)
> > return Reference_Type
> > is (raise My_Exception
> > with "Reference not supported for Ordered_Sets")
> > with Inline;
> >
> > GNAT GPL 2017 accepts it, but FSF GNAT 7.2 for mingw64 on Win10
> > gives some errors:
> > test.ads:328:11: (Ada 2005) cannot copy object of a limited type (RM-2005
> > 6.5(5.5/2))
> > test.ads:328:11: return by reference not permitted in Ada 2005
> >
> > NOTE: Reference_Type is untagged limited discriminated null
> > record with Implicit_Dereference defined. Also note that a similar
> > function that returns an aggregate initialization compiles fine
> > on both versions.
> >
> > I am compiling with Ada2012 mode (-gnat12 option)
> >
> > I believe this to be a bug in GCC 7.2 for mingw64, but wanted to
> > make sure I wasn't misreading the RM.
> If "Reference_Type" is a limited type, then this would have been correct at
> one point: we forgot to allow raise expressions in limited contexts. (Recall
> that returning a limited expression from a function is "built-in-place" and
> only allows certain expressions, copying objects [for instance] is not
> allowed.) I noticed this when writing some ACATS tests in this area, and it
> was fixed with a recent Binding Interpretation (correction). But it won't
> formally be adopted until Ada 2020, so an Ada 2012 compiler is ""correct" if
> it allows or rejects such a use (as corrections can, but don't have to be,
> applied to the existing language).
>
> For a non-limited type, this should be just fine. But as a raise expression
> matches any type (and thus is different than any previous Ada expression),
> it might be buggy in some odd case.
>
> Randy.
>
Thanks!
It was a limited type. I guess for now, I won't use them in expression
functions then so I can keep it portable. It was just convenient, but
not a show stopper.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-03-07 22:39 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-03 18:39 expression functions and raise expressions Jere
2018-03-03 20:03 ` Jeffrey R. Carter
2018-03-03 22:53 ` Jere
2018-03-03 20:54 ` Simon Wright
2018-03-03 22:54 ` Jere
2018-03-05 20:21 ` Randy Brukardt
2018-03-07 22:39 ` Jere
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox