[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: [PATCH] D25216: Improve error message when referencing a non-tag type with a tag
From: Reid Kleckner via Phabricator via cfe-commits <cfe-commits () lists ! llvm ! org>
Date: 2016-11-30 21:33:22
Message-ID: 598b48681f07821f712898fd17ee3142 () localhost ! localdomain
[Download RAW message or body]
rnk updated this revision to Diff 79805.
rnk added a comment.
- rebase
https://reviews.llvm.org/D25216
Files:
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
lib/Sema/SemaTemplate.cpp
lib/Sema/TreeTransform.h
test/CXX/basic/basic.lookup/basic.lookup.elab/p2.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.elab/p2-0x.cpp
test/CXX/drs/dr2xx.cpp
test/CXX/drs/dr4xx.cpp
test/CXX/temp/temp.decls/temp.friend/p1.cpp
test/CXX/temp/temp.spec/no-body.cpp
test/SemaCXX/PR8755.cpp
test/SemaCXX/using-decl-templates.cpp
test/SemaTemplate/template-id-expr.cpp
["D25216.79805.patch" (text/x-patch)]
Index: test/SemaTemplate/template-id-expr.cpp
===================================================================
--- test/SemaTemplate/template-id-expr.cpp
+++ test/SemaTemplate/template-id-expr.cpp
@@ -100,5 +100,5 @@
class C {};
template <template <typename> class D> // expected-note{{previous use is here}}
class E {
- template class D<C>; // expected-error {{elaborated type refers to a template \
template argument}} + template class D<C>; // expected-error {{'D' is a template \
template argument that cannot be referenced with a class tag}} };
Index: test/SemaCXX/using-decl-templates.cpp
===================================================================
--- test/SemaCXX/using-decl-templates.cpp
+++ test/SemaCXX/using-decl-templates.cpp
@@ -90,7 +90,7 @@
template<typename T> struct A { };
template<typename T> using APtr = A<T*>; // expected-note{{previous use is here}}
- template struct APtr<int>; // expected-error{{elaborated type refers to a type \
alias template}} + template struct APtr<int>; // expected-error{{'APtr' is a type \
alias template that cannot be referenced with a struct tag}} }
namespace DontDiagnoseInvalidTest {
Index: test/SemaCXX/PR8755.cpp
===================================================================
--- test/SemaCXX/PR8755.cpp
+++ test/SemaCXX/PR8755.cpp
@@ -7,7 +7,7 @@
template <typename T>
void f() {
- class A <T> ::iterator foo; // expected-error{{elaborated type refers to a \
typedef}} + class A <T> ::iterator foo; // expected-error{{'iterator' is a typedef \
that cannot be referenced with a class tag}} }
void g() {
Index: test/CXX/temp/temp.spec/no-body.cpp
===================================================================
--- test/CXX/temp/temp.spec/no-body.cpp
+++ test/CXX/temp/temp.spec/no-body.cpp
@@ -43,7 +43,7 @@
namespace unsupported {
#ifndef FIXING
- template struct y; // expected-error {{elaborated type refers to a template}}
+ template struct y; // expected-error {{'y' is a template that cannot be \
referenced with a struct tag}} #endif
}
Index: test/CXX/temp/temp.decls/temp.friend/p1.cpp
===================================================================
--- test/CXX/temp/temp.decls/temp.friend/p1.cpp
+++ test/CXX/temp/temp.decls/temp.friend/p1.cpp
@@ -174,7 +174,7 @@
// This shouldn't crash.
template <class T> class D {
- friend class A; // expected-error {{elaborated type refers to a template}}
+ friend class A; // expected-error {{'A' is a template that cannot be referenced \
with a class tag}} };
template class D<int>;
}
Index: test/CXX/drs/dr4xx.cpp
===================================================================
--- test/CXX/drs/dr4xx.cpp
+++ test/CXX/drs/dr4xx.cpp
@@ -90,7 +90,7 @@
struct S *p;
{
typedef struct S S; // expected-note {{here}}
- struct S *p; // expected-error {{refers to a typedef}}
+ struct S *p; // expected-error {{'S' is a typedef}}
}
}
struct S {};
Index: test/CXX/drs/dr2xx.cpp
===================================================================
--- test/CXX/drs/dr2xx.cpp
+++ test/CXX/drs/dr2xx.cpp
@@ -620,7 +620,7 @@
template<typename T> struct A {
typedef typename T::type type; // ok even if this is a typedef-name, because
// it's not an elaborated-type-specifier
- typedef struct T::type foo; // expected-error {{elaborated type refers to a \
typedef}} + typedef struct T::type foo; // expected-error {{'type' is a typedef \
that cannot be referenced with a struct tag}} };
struct B { struct type {}; };
struct C { typedef struct {} type; }; // expected-note {{here}}
@@ -1037,8 +1037,8 @@
C::type i3;
struct A a;
- struct B b; // expected-error {{refers to a typedef}}
- struct C c; // expected-error {{refers to a typedef}}
+ struct B b; // expected-error {{'B' is a typedef}}
+ struct C c; // expected-error {{'C' is a typedef}}
B::B() {} // expected-error {{requires a type specifier}}
B::A() {} // ok
Index: test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.elab/p2-0x.cpp
===================================================================
--- test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.elab/p2-0x.cpp
+++ test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.elab/p2-0x.cpp
@@ -2,18 +2,18 @@
struct A { typedef int type; };
template<typename T> using X = A; // expected-note {{declared here}}
-struct X<int>* p2; // expected-error {{elaborated type refers to a type alias \
template}} +struct X<int>* p2; // expected-error {{'X' is a type alias template that \
cannot be referenced with a struct tag}}
template<typename T> using Id = T; // expected-note {{declared here}}
template<template<typename> class F>
struct Y {
- struct F<int> i; // expected-error {{elaborated type refers to a type alias \
template}} + struct F<int> i; // expected-error {{'Id' is a type alias template that \
cannot be referenced with a struct tag}} typename F<A>::type j; // ok
// FIXME: don't produce the diagnostic both for the definition and the \
instantiation. template<typename T> using U = F<char>; // expected-note 2{{declared \
here}}
- struct Y<F>::template U<char> k; // expected-error 2{{elaborated type refers to a \
type alias template}} + struct Y<F>::template U<char> k; // expected-error 2{{'U' is \
a type alias template that cannot be referenced with a struct tag}} typename \
Y<F>::template U<char> l; // ok };
template struct Y<Id>; // expected-note {{requested here}}
Index: test/CXX/basic/basic.lookup/basic.lookup.elab/p2.cpp
===================================================================
--- test/CXX/basic/basic.lookup/basic.lookup.elab/p2.cpp
+++ test/CXX/basic/basic.lookup/basic.lookup.elab/p2.cpp
@@ -9,16 +9,16 @@
typedef int A; // expected-note {{declared here}}
int test() {
- struct A a; // expected-error {{elaborated type refers to a typedef}}
+ struct A a; // expected-error {{'A' is a typedef that cannot be referenced \
with a struct tag}} return a.foo;
}
}
namespace i1 {
template <class> class A; // expected-note {{declared here}}
int test() {
- struct A a; // expected-error {{elaborated type refers to a template}}
+ struct A a; // expected-error {{'A' is a template that cannot be referenced \
with a struct tag}} return a.foo;
}
}
Index: lib/Sema/TreeTransform.h
===================================================================
--- lib/Sema/TreeTransform.h
+++ lib/Sema/TreeTransform.h
@@ -1014,7 +1014,8 @@
case LookupResult::FoundUnresolvedValue: {
NamedDecl *SomeDecl = Result.getRepresentativeDecl();
Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl);
- SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << NTK;
+ SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
+ << NTK << Kind;
SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
break;
}
@@ -5706,7 +5707,8 @@
Template.getAsTemplateDecl())) {
SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
diag::err_tag_reference_non_tag)
- << Sema::NTK_TypeAliasTemplate;
+ << TAT << Sema::NTK_TypeAliasTemplate
+ << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
}
}
Index: lib/Sema/SemaTemplate.cpp
===================================================================
--- lib/Sema/SemaTemplate.cpp
+++ lib/Sema/SemaTemplate.cpp
@@ -2489,7 +2489,8 @@
// If the identifier resolves to a typedef-name or the simple-template-id
// resolves to an alias template specialization, the
// elaborated-type-specifier is ill-formed.
- Diag(TemplateLoc, diag::err_tag_reference_non_tag) << NTK_TypeAliasTemplate;
+ Diag(TemplateLoc, diag::err_tag_reference_non_tag)
+ << TAT << NTK_TypeAliasTemplate << TagKind;
Diag(TAT->getLocation(), diag::note_declared_at);
}
@@ -7462,7 +7463,7 @@
if (!ClassTemplate) {
NonTagKind NTK = getNonTagTypeDeclKind(TD);
- Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << NTK;
+ Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << TD << NTK << Kind;
Diag(TD->getLocation(), diag::note_previous_use);
return true;
}
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -13205,7 +13205,7 @@
if ((TUK == TUK_Reference || TUK == TUK_Friend) &&
!Previous.isForRedeclaration()) {
NonTagKind NTK = getNonTagTypeDeclKind(PrevDecl);
- Diag(NameLoc, diag::err_tag_reference_non_tag) << NTK;
+ Diag(NameLoc, diag::err_tag_reference_non_tag) << PrevDecl << NTK << Kind;
Diag(PrevDecl->getLocation(), diag::note_declared_at);
Invalid = true;
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -4553,7 +4553,9 @@
"%select{typedef|type alias|type alias template}0 "
"redefinition with different types%diff{ ($ vs $)|}1,2">;
def err_tag_reference_non_tag : Error<
- "elaborated type refers to %select{a non-tag type|a typedef|a type alias|a \
template|a type alias template|a template template argument}0">; + "%0 is a \
%select{non-tag type|typedef|type alias|template|type alias " + "template|template \
template argument}1 that cannot be referenced with a " + \
"%select{struct|interface|union|class|enum}2 tag">; def err_tag_reference_conflict : \
Error< "implicit declaration introduced by elaborated type conflicts with "
"%select{a declaration|a typedef|a type alias|a template}0 of the same name">;
[Attachment #4 (text/plain)]
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic