[cfe-commits] [PATCH] Array exception type decay to pointer automatically

Richard Smith richard at metafoo.co.uk
Tue Nov 20 20:10:28 PST 2012


On Tue, Nov 20, 2012 at 7:20 PM, WenHan Gu (谷汶翰) <wenhan.gu at gmail.com> wrote:
> Hi Richard,
> Thanks your comments.
>
> However, I have no idea whether I should do this patch.
> I've tested by gcc, clang and searched C++ spec draft n3242, the result is
> that both GCC and Clang failed on that and I cannot find any wording on this
> issue.

I suggest you switch to using n3485.

15.4/2:

A type denoted in an exception-specification shall not denote an
incomplete type other than a class
currently being defined or an rvalue reference type. A type denoted in
an exception-specification shall not
denote a pointer or reference to an incomplete type, other than cv
void* or a pointer or reference to a
class currently being defined. A type cv T, “array of T”, or “function
returning T” denoted in an exception-
specification is adjusted to type T, “pointer to T”, or “pointer to
function returning T”, respectively.

We are supposed to apply the decay from S[10] to S* before we check
whether it's an incomplete-or-being-defined type or a pointer to an
incomplete-or-being-defined type, so S[10] is OK.

> Could you teach me more or could some else help?
> Thanks!
>
>   1 struct S {
>   2   void foo() throw (S[10])  { throw 0; }  // Both gcc and clang failed
> on this function
>   3   void bar() throw (S)  { throw 0; }
>   4 };
>   5
>   6 int main() {
>   7   S().foo();
>   8   S().bar();
>   9 }
>
>
>
>
> 2012/11/21 Richard Smith <richard at metafoo.co.uk>
>>
>> Hi,
>>
>> On Tue, Nov 20, 2012 at 1:54 AM, WenHan Gu (谷汶翰) <wenhan.gu at gmail.com>
>> wrote:
>> > Hi all,
>> >
>> > I've done the patch and testcase to fix PR14338.
>> > http://llvm.org/bugs/show_bug.cgi?id=14388
>> >
>> > Here's the patch, please review:
>> > http://llvm.org/bugs/attachment.cgi?id=9574&action=diff
>> >
>> >
>> > Is that okay to commit?
>>
>> A matching update is needed in SemaTemplateInstantiateDecl. Perhaps
>> you could put this logic into CheckSepcifiedExceptionType (and either
>> return the modified type or pass it through by reference)? One of the
>> checks in  CheckSpecifiedExceptionType also needs updating. With your
>> patch, we still reject this:
>>
>> struct S {
>>   void f() throw (S[10]);
>> };
>>
>> ... but we should accept it, because the type 'S' is supposed to be
>> considered as complete in exception specifications inside its body.
>
>
>
>
> --
> Best regards,
> Wen-Han Gu (Nowar)
>




More information about the cfe-commits mailing list