r207677 - Fix crash if typo correction corrects a member using-declaration to a

Richard Smith richard-llvm at metafoo.co.uk
Wed Apr 30 10:40:35 PDT 2014


Author: rsmith
Date: Wed Apr 30 12:40:35 2014
New Revision: 207677

URL: http://llvm.org/viewvc/llvm-project?rev=207677&view=rev
Log:
Fix crash if typo correction corrects a member using-declaration to a
non-member declaration. Patch by Dinesh Dwivedi!

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/SemaCXX/using-decl-1.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=207677&r1=207676&r2=207677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Apr 30 12:40:35 2014
@@ -7329,6 +7329,12 @@ public:
     if (!ND || isa<NamespaceDecl>(ND))
       return false;
 
+    // FIXME: We should check if ND is member of base class of class having
+    // using declaration and direct base class in case using declaration names
+    // a constructor.
+    if (RequireMember && !ND->isCXXClassMember())
+      return false;
+
     if (RequireMember && !isa<FieldDecl>(ND) && !isa<CXXMethodDecl>(ND) &&
         !isa<TypeDecl>(ND))
       return false;

Modified: cfe/trunk/test/SemaCXX/using-decl-1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/using-decl-1.cpp?rev=207677&r1=207676&r2=207677&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/using-decl-1.cpp (original)
+++ cfe/trunk/test/SemaCXX/using-decl-1.cpp Wed Apr 30 12:40:35 2014
@@ -194,3 +194,36 @@ namespace UsingDeclVsHiddenName {
     using A::HiddenLocalExtern2;
   }
 }
+
+struct Z {
+  Z();
+};
+
+typedef struct {
+  Z i;
+} S;
+
+struct Y : S {
+  using S::S; // expected-error {{no member named 'S' in 'S'}}
+};
+
+// [namespace.udecl] Para3: In a using-declaration used as a member-declaration,
+// the nested-name-specifier shall name a base class of the class being defined.
+// If such a using-declaration names a constructor, the nested-name-specifier
+// shall name a direct base class of the class being defined;
+
+// FIXME: For c++11, Typo correction should only consider constructor of direct base class
+struct PR19171_B { }; // expected-note {{'PR19171_B' declared here}}
+struct PR19171_C : PR19171_B { };
+struct PR19171_D : PR19171_C {
+	using PR19171_B::PR19171_C; // expected-error{{no member named 'PR19171_C' in 'PR19171_B'; did you mean 'PR19171_B'?}}
+};
+
+// FIXME: Typo correction should only consider member of base classes
+struct PR19171_E { };
+struct PR19171_EE { int EE; }; // expected-note {{'PR19171_EE::EE' declared here}} \
+                                // expected-note {{target of using declaration}}
+struct PR19171_F : PR19171_E {
+	using PR19171_E::EE; // expected-error{{no member named 'EE' in 'PR19171_E'; did you mean 'PR19171_EE::EE'?}} \
+                          // expected-error{{using declaration refers into 'PR19171_E::', which is not a base class of 'PR19171_F'}}
+};





More information about the cfe-commits mailing list