From 0b3d95ae64a5965fbec718037e37be2a2f5ad443 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Sat, 17 Oct 2009 22:37:54 +0000 Subject: Fix a crash with qualified member access into a non-type, from Sean Hunt! llvm-svn: 84370 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaExpr.cpp | 6 ++++++ clang/test/SemaCXX/member-expr.cpp | 11 +++++++++++ 3 files changed, 19 insertions(+) (limited to 'clang') diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 6cea79a1b7a..bf2acfc06b9 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index b69e1fbcd6c..b32c6840192 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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(DC)) { + Diag(MemberLoc, diag::err_qualified_member_nonclass) + << DC << SS->getRange(); + return ExprError(); + } // FIXME: If DC is not computable, we should build a // CXXUnresolvedMemberExpr. diff --git a/clang/test/SemaCXX/member-expr.cpp b/clang/test/SemaCXX/member-expr.cpp index 28b1224d8d8..069f52605b9 100644 --- a/clang/test/SemaCXX/member-expr.cpp +++ b/clang/test/SemaCXX/member-expr.cpp @@ -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'}} +} -- cgit v1.2.3