forked from OSchip/llvm-project
Sema: Only merge typedef attributes if the previous decl is a typedef
In r186373, we started merging attributes on typedefs, but this causes us to try to merge attributes even if the previous declaration was not a typedef. Only merge the attributes if the previous decl was also a typedef. Fixes rdar://problem/15044218 llvm-svn: 192146
This commit is contained in:
parent
4f755deaf6
commit
84ff5ee448
|
@ -1712,12 +1712,12 @@ void Sema::MergeTypedefNameDecl(TypedefNameDecl *New, LookupResult &OldDecls) {
|
|||
if (isIncompatibleTypedef(Old, New))
|
||||
return;
|
||||
|
||||
// The types match. Link up the redeclaration chain if the old
|
||||
// declaration was a typedef.
|
||||
if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Old))
|
||||
// The types match. Link up the redeclaration chain and merge attributes if
|
||||
// the old declaration was a typedef.
|
||||
if (TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Old)) {
|
||||
New->setPreviousDeclaration(Typedef);
|
||||
|
||||
mergeDeclAttributes(New, Old);
|
||||
mergeDeclAttributes(New, Old);
|
||||
}
|
||||
|
||||
if (getLangOpts().MicrosoftExt)
|
||||
return;
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
typedef struct S1 { char c; } S1 __attribute__((aligned(8)));
|
||||
static_assert(alignof(S1) == 8, "attribute ignored");
|
||||
static_assert(alignof(struct S1) == 1, "attribute applied to original type");
|
||||
|
||||
typedef struct __attribute__((aligned(8))) S2 { char c; } AS;
|
||||
static_assert(alignof(S2) == 8, "attribute not propagated");
|
||||
static_assert(alignof(struct S2) == 8, "attribute ignored");
|
||||
|
||||
typedef struct __attribute__((aligned(4))) S3 {
|
||||
char c;
|
||||
} S3 __attribute__((aligned(8)));
|
||||
static_assert(alignof(S3) == 8, "attribute ignored");
|
||||
static_assert(alignof(struct S3) == 4, "attribute clobbered");
|
|
@ -244,3 +244,9 @@ namespace test7 {
|
|||
X *x = new X; // expected-warning{{'operator new' is deprecated}} expected-warning{{'operator delete' is deprecated}}
|
||||
}
|
||||
}
|
||||
|
||||
// rdar://problem/15044218
|
||||
typedef struct TDS {
|
||||
} TDS __attribute__((deprecated)); // expected-note {{'TDS' declared here}}
|
||||
TDS tds; // expected-warning {{'TDS' is deprecated}}
|
||||
struct TDS tds2; // no warning, attribute only applies to the typedef.
|
||||
|
|
Loading…
Reference in New Issue