On Mar 14, 2013, at 6:52 AM, "Gao, Yunzhong" <[email protected]> wrote:

> 
> ________________________________________
> From: Gao, Yunzhong
> Sent: Wednesday, March 13, 2013 11:51 PM
> To: Douglas Gregor
> Cc: [email protected]
> Subject: RE: [PATCH] Adding a diagnostic for member templates inside a local 
> class
> 
> Hi Douglas,
> Thank you for review.

Sorry for the delay; this got buried.

> I am attaching an updated patch with the following changes:
> 
>  1. The diagnostic is moved from lib/Parse to lib/SemaTemplate;
>  2. Added a new test to test/SemaTemplate instead of test/Parser;

How about putting the new test into test/CXX/<appropriate clause and 
paragraph.cpp>, so it matches where this restriction shows up in the C++ 
standard?

>  3. In test/SemaTemplate/instantiate-exception-spec-cxx11.cpp, moved the 
> class definition outside of the
>      function body to avoid triggering the new diagnostic.
>      I did experiment with adding an expected-error annotation there, but it 
> seems that delaying the diagnostic
>      from Parser to Sema triggers quite a few more error messages, e.g.,
>          Line 52: use of undeclared identifier 'f'
>          Line 54: no member named 'f' in 'S'
>      I think adding more expected-error annotations would unnecessarily 
> complicate the existing test. The
>      proposed new test checks both function and class templates.

I think that test was intentionally making sure we don't blow up when this 
happens inside a local class. I'd be better to duplicate that part of the test.

> Could you review?

Index: lib/Sema/SemaTemplate.cpp
===================================================================
--- lib/Sema/SemaTemplate.cpp   (revision 176911)
+++ lib/Sema/SemaTemplate.cpp   (working copy)
@@ -4908,6 +4908,15 @@
   while (Ctx && isa<LinkageSpecDecl>(Ctx))
     Ctx = Ctx->getParent();
 
+  if (Ctx && Ctx->isRecord()) {
+    const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(Ctx);
+    if (RD && RD->isLocalClass()) {

It'd be nice to have a standard reference here.

In this C++-only code, Ctx->isRecord() implies that 
dyn_cast<CXXRecordDecl>(Ctx) will always return a non-null CXXRecordDecl, so 
you can use cast<> instead of dyn_cast<> and eliminate the "RD &&" check.

        - Doug



> - Gao.
> 
> ________________________________________
> From: Douglas Gregor [[email protected]]
> Sent: Wednesday, March 13, 2013 4:13 PM
> To: Gao, Yunzhong
> Cc: [email protected]
> Subject: Re: [PATCH] Adding a diagnostic for member templates inside a local 
> class
> 
> On Mar 13, 2013, at 12:55 PM, "Gao, Yunzhong" <[email protected]> 
> wrote:
> 
>> Hi,
>> Currently, clang++ accepts the following codes without any error message.
>> 
>> int test(void)
>> {
>> class A {
>>   template<class T> class B
>>   {  T t; };
>> };
>> 
>> return 0;
>> }
>> 
>> However, I believe that an error message is required according to the C++03 
>> and C++11.
>> In particular, section 14.5 clause 2 (of both specs) says "A local class 
>> shall not have member templates."
>> 
>> The following patch adds a diagnostic for member templates declared inside a 
>> local class.
> 
> Generally, this looks good. However, I'd like to see it diagnosed in Sema, 
> rather than in the parser, which we do for static data members and friends in 
> local classes.
> 
>        - Doug
> 
> 
> 
> <member_template.patch>

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to