On Aug 27, 2010, at 5:32 PM, Faisal Vali wrote:

> This is an updated patch which spits out more consistent sounding
> error messages.
> In Sema::MergeVarDecl, instead of doing (pseudo code)
> if (LR.isSingleResult())
>  PDecl = LR.getFoundDecl()
> I used:
> if (!LR.empty())
>  PDecl = LR.getRepresentativeDecl()
> 
> Thanks!

Your patch looks pretty good. I've simplified the change in Sema::MergeVarDecls 
quite a bit by checking that we're not redeclaring a static data member *after* 
we've checked that we aren't performing a redeclaration of entities of a 
different kind. A few other minor comments:

Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp       (revision 112294)
+++ lib/Sema/SemaDecl.cpp       (working copy)
@@ -1456,7 +1456,28 @@
   // If the new decl is already invalid, don't do any other checking.
   if (New->isInvalidDecl())
     return;
+  // If 'New' is an in-class static data member declaration then 'PrevDecl' 
+  // can only be an *in-class* member declaration (one can not declare an out 
of class 
+  // name before an inclass name, right?!). 
+  // In such a case 'New' has to be ill-formed since we can only re-declare a 
name if 
+  // it designates an overload of a member function and we know 'New' is NOT a 
function - 
+  // so any prior member declaration of the same name has to be an error.

We usually try to keep comments a bit shorter, and avoid questions in them, 
unless it's something really complicated. I went with the far shorter:

  // C++ [class.mem]p1:
  //   A member shall not be declared twice in the member-specification [...]
  // 
  // Here, we need only consider static data members.

+  if (!Previous.empty()) {
+    NamedDecl* PrevDecl = Previous.getRepresentativeDecl();
 
+    if (New->isStaticDataMember() && !New->isOutOfLine() && 
PrevDecl->isCXXClassMember())  {   

Please keep lines <= 80 columns.

  int v;  //expected-note{{previous declaration is here}} 
expected-note{{previous declaration is here}} expected-note{{previous 
declaration is here}}

Note that you can use:

  // expected-note 3{{previous declaration is here}

to check that the "previous declaration is here" diagnostic occurs three times.

Thanks for the great test case, too!

Revised patch committed as r112476.

        - Doug

> 
> 
> 
> 
> On Fri, Aug 27, 2010 at 6:47 PM, Faisal Vali <[email protected]> wrote:
>> Hi,
>> 
>> This patch fixes the following bugs:
>>  - redeclaration of in class static variables (http://llvm.org/PR7970)
>>  - redeclaration of an in class non-static variable was allowed if
>> *two* or more overloaded functions with that same name had already
>> been declared
>>    i.e. struct S { void f(); int f(int); char f; }; would compile
>> because Sema::LookupSingleResult in Sema::HandleField would return
>> null
>>    if LookupResult was an overloaded result.
>> 
>> I have attached a bunch of tests in p1 (not sure if they are all
>> necessary), and if you review the test file, you'll see that depending
>> on the ordering of member declarations
>>  (i.e data before functions or static before non-static) different
>> error messages are spit out.  Something smells quite brittle about
>> this.  I wonder if it
>> would be worthwhile to try and unify these member declaration checks
>> in one place and then call them consistently from HandleField,
>> HandleDeclarator and MergeVarDecl,
>> or would this complicate more than simplify?
>> 
>> I verified my changes against the tests in SemaCXX and CXX.
>> 
>> I am quite new at this so would appreciate any constructive feedback :)
>> 
>> thanks,
>> Faisal Vali
>> 
> <prevent-static-var-in-class-redeclaration-3.patch>_______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

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

Reply via email to