forked from OSchip/llvm-project
When instantiating a typedef of an anonymous tag type, note in the tag
declaration that this typedef gives the tag a name. Fixes a problem uncovered by Boost.GIL (Generic Image Library). llvm-svn: 102180
This commit is contained in:
parent
7a0ffdbe53
commit
83eb5032c0
|
@ -200,12 +200,22 @@ Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) {
|
|||
if (Invalid)
|
||||
Typedef->setInvalidDecl();
|
||||
|
||||
if (const TagType *TT = DI->getType()->getAs<TagType>()) {
|
||||
TagDecl *TD = TT->getDecl();
|
||||
|
||||
// If the TagDecl that the TypedefDecl points to is an anonymous decl
|
||||
// keep track of the TypedefDecl.
|
||||
if (!TD->getIdentifier() && !TD->getTypedefForAnonDecl())
|
||||
TD->setTypedefForAnonDecl(Typedef);
|
||||
}
|
||||
|
||||
if (TypedefDecl *Prev = D->getPreviousDeclaration()) {
|
||||
NamedDecl *InstPrev = SemaRef.FindInstantiatedDecl(D->getLocation(), Prev,
|
||||
TemplateArgs);
|
||||
Typedef->setPreviousDeclaration(cast<TypedefDecl>(InstPrev));
|
||||
}
|
||||
|
||||
|
||||
Typedef->setAccess(D->getAccess());
|
||||
Owner->addDecl(Typedef);
|
||||
|
||||
|
|
|
@ -30,5 +30,13 @@ void f() {
|
|||
struct { int x; } Unnamed; // expected-note{{unnamed type used in template argument was declared here}}
|
||||
A<__typeof__(Unnamed)> *a9; // expected-error{{template argument uses unnamed type}}
|
||||
|
||||
template<typename T, unsigned N>
|
||||
struct Array {
|
||||
typedef struct { T x[N]; } type;
|
||||
};
|
||||
|
||||
template<typename T> struct A1 { };
|
||||
A1<Array<int, 17>::type> ax;
|
||||
|
||||
// FIXME: [temp.arg.type]p3. The check doesn't really belong here (it
|
||||
// belongs somewhere in the template instantiation section).
|
||||
|
|
Loading…
Reference in New Issue