From 446e4029c75b651475e9055dc9dd18fbc7b6dabe Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 24 Jan 2011 19:01:04 +0000 Subject: [PATCH] Enhance the diagnostic for referring to a typedef with an elaborated name to be as useful in a templated context as it is without templates. Fixes PR8755! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124136 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/TreeTransform.h | 25 ++++++++++++++++++++++--- test/SemaCXX/PR8755.cpp | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/SemaCXX/PR8755.cpp diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 1cb24e70bf..3390dd7bad 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -796,9 +796,28 @@ public: } if (!Tag) { - // FIXME: Would be nice to highlight just the source range. - SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) - << Kind << Id << DC; + // Check where the name exists but isn't a tag type and use that to emit + // better diagnostics. + LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); + SemaRef.LookupQualifiedName(Result, DC); + switch (Result.getResultKind()) { + case LookupResult::Found: + case LookupResult::FoundOverloaded: + case LookupResult::FoundUnresolvedValue: { + NamedDecl *SomeDecl = Result.getRepresentativeDecl(); + unsigned Kind = 0; + if (isa(SomeDecl)) Kind = 1; + else if (isa(SomeDecl)) Kind = 2; + SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; + SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); + break; + } + default: + // FIXME: Would be nice to highlight just the source range. + SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) + << Kind << Id << DC; + break; + } return QualType(); } diff --git a/test/SemaCXX/PR8755.cpp b/test/SemaCXX/PR8755.cpp new file mode 100644 index 0000000000..07778ddfc9 --- /dev/null +++ b/test/SemaCXX/PR8755.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +template +struct A { + typedef int iterator; // expected-note{{declared here}} +}; + +template +void f() { + class A ::iterator foo; // expected-error{{elaborated type refers to a typedef}} +} + +void g() { + f(); // expected-note{{in instantiation of function template}} +} + -- 2.40.0