diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-02-09 06:54:23 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-02-09 06:54:23 +0000 |
commit | 6cab596218f9b16f32153ccba57ac6fec9984bed (patch) | |
tree | 7bf905e246ea08a2a20db67bf6239f4f99d9561a /clang/lib/Sema/SemaCXXScopeSpec.cpp | |
parent | 158ba130eec9997716b22bdf2bfe476d9f73104a (diff) | |
download | bcm5719-llvm-6cab596218f9b16f32153ccba57ac6fec9984bed.tar.gz bcm5719-llvm-6cab596218f9b16f32153ccba57ac6fec9984bed.zip |
Improve diagnostic for using non-class/namespace/scoped enum in a nested name specifier.
Rather than simply saying "X is not a class or namespace", clarify what
X is by providing the aka type in the case where X is a type, or
pointing to the named declaration if there's an unambiguous one to refer
to. In the ambiguous case, the ambiguities are already enumerated
(though could be clarified by describing what kind of entities they are)
Included a few FIXMEs in tests where some further improvements could be
made.
llvm-svn: 201038
Diffstat (limited to 'clang/lib/Sema/SemaCXXScopeSpec.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCXXScopeSpec.cpp | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp b/clang/lib/Sema/SemaCXXScopeSpec.cpp index 9a390a7e266..ef1eaf2c146 100644 --- a/clang/lib/Sema/SemaCXXScopeSpec.cpp +++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp @@ -654,20 +654,23 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S, } } - unsigned DiagID; - if (!Found.empty()) - DiagID = diag::err_expected_class_or_namespace; - else if (SS.isSet()) { - Diag(IdentifierLoc, diag::err_no_member) - << &Identifier << LookupCtx << SS.getRange(); - return true; - } else - DiagID = diag::err_undeclared_var_use; - - if (SS.isSet()) - Diag(IdentifierLoc, DiagID) << &Identifier << SS.getRange(); + if (!Found.empty()) { + if (TypeDecl *TD = Found.getAsSingle<TypeDecl>()) + Diag(IdentifierLoc, diag::err_expected_class_or_namespace) + << QualType(TD->getTypeForDecl(), 0) << getLangOpts().CPlusPlus; + else { + Diag(IdentifierLoc, diag::err_expected_class_or_namespace) + << &Identifier << getLangOpts().CPlusPlus; + if (NamedDecl *ND = Found.getAsSingle<NamedDecl>()) + Diag(ND->getLocation(), + diag::note_expected_class_or_namespace_declared_here) + << &Identifier; + } + } else if (SS.isSet()) + Diag(IdentifierLoc, diag::err_no_member) << &Identifier << LookupCtx + << SS.getRange(); else - Diag(IdentifierLoc, DiagID) << &Identifier; + Diag(IdentifierLoc, diag::err_undeclared_var_use) << &Identifier; return true; } @@ -698,7 +701,7 @@ bool Sema::ActOnCXXNestedNameSpecifierDecltype(CXXScopeSpec &SS, QualType T = BuildDecltypeType(DS.getRepAsExpr(), DS.getTypeSpecTypeLoc()); if (!T->isDependentType() && !T->getAs<TagType>()) { - Diag(DS.getTypeSpecTypeLoc(), diag::err_expected_class) + Diag(DS.getTypeSpecTypeLoc(), diag::err_expected_class_or_namespace) << T << getLangOpts().CPlusPlus; return true; } |