]> granicus.if.org Git - clang/commitdiff
Fix a crash with qualified member access into a non-type, from Sean Hunt!
authorDouglas Gregor <dgregor@apple.com>
Sat, 17 Oct 2009 22:37:54 +0000 (22:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 17 Oct 2009 22:37:54 +0000 (22:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84370 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaCXX/member-expr.cpp

index 6cea79a1b7a1eeaec47cd1e080e4f6286f27fda5..bf2acfc06b9bde0fdc22eae4b0cf6ee9867a9ded 100644 (file)
@@ -383,6 +383,8 @@ def note_ambig_member_ref_object_type : Note<
   "lookup in the object type %0 refers here">;
 def note_ambig_member_ref_scope : Note<
   "lookup from the current scope refers here">;
+def err_qualified_member_nonclass : Error<
+  "qualified member access refers to a member in %0">;
 
 // C++ class members
 def err_storageclass_invalid_for_member : Error<
index b69e1fbcd6c3e9280595f4adb7ccd4c07b6885b2..b32c6840192643f9d81a421f93b3f11cf8818e77 100644 (file)
@@ -2184,6 +2184,12 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
       // If the member name was a qualified-id, look into the
       // nested-name-specifier.
       DC = computeDeclContext(*SS, false);
+      
+      if (!isa<TypeDecl>(DC)) {
+        Diag(MemberLoc, diag::err_qualified_member_nonclass)
+          << DC << SS->getRange();
+        return ExprError();
+      }
 
       // FIXME: If DC is not computable, we should build a
       // CXXUnresolvedMemberExpr.
index 28b1224d8d8fbfef78d658bcbab501e49a501367..069f52605b92e9a376df277d9c963bb6966bb464 100644 (file)
@@ -31,3 +31,14 @@ int f0(B *b) {
   return b->f0->f0; // expected-error{{member reference base type 'struct A *()' is not a structure or union}} \
   // expected-note{{perhaps you meant to call this function}}
 }
+
+int i;
+
+namespace C {
+  int i;
+}
+
+void test2(X *xp) {
+  xp->::i = 7; // expected-error{{qualified member access refers to a member in the global namespace}}
+  xp->C::i = 7; // expected-error{{qualified member access refers to a member in namespace 'C'}}
+}