diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-05-07 23:58:18 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-05-07 23:58:18 +0000 |
commit | 9b79fc9c57dc9d541c2a5737c3e2c24cc68d485d (patch) | |
tree | ef1106603d82a8c98672f7b6986a2054ed60e8e5 /lib/Sema/SemaDeclAttr.cpp | |
parent | ca11510d399ae0493bcb3daf24e3c1df399d75f2 (diff) |
Process attributes in the order they appear in the source code. This make clang
match gcc behavior for two conflicting visibilities in the same decl. It also
makes handling of dllimport/dllexport more natural.
As a bonus we now warn on the dllimport in
void __attribute__((dllimport)) foo13();
void __attribute__((dllexport)) foo13();
as does gcc.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156343 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclAttr.cpp')
-rw-r--r-- | lib/Sema/SemaDeclAttr.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index f2d1d19d22..47acdf9456 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -3986,8 +3986,12 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, void Sema::ProcessDeclAttributeList(Scope *S, Decl *D, const AttributeList *AttrList, bool NonInheritable, bool Inheritable) { + SmallVector<const AttributeList*, 4> attrs; for (const AttributeList* l = AttrList; l; l = l->getNext()) { - ProcessDeclAttribute(*this, S, D, *l, NonInheritable, Inheritable); + attrs.push_back(l); + } + for (int i = attrs.size() - 1; i >= 0; --i) { + ProcessDeclAttribute(*this, S, D, *attrs[i], NonInheritable, Inheritable); } // GCC accepts |