diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-06-19 05:04:44 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-06-19 05:04:44 +0000 |
commit | ea798aa7f596060d4be4e3c6bcadcda77a63829e (patch) | |
tree | c90aebc1cd4cb9e50096b5f01f1d4898615bc11b /clang/lib | |
parent | 37da4333a8671e7ac612ba5438881c5fde0ca01c (diff) | |
download | bcm5719-llvm-ea798aa7f596060d4be4e3c6bcadcda77a63829e.tar.gz bcm5719-llvm-ea798aa7f596060d4be4e3c6bcadcda77a63829e.zip |
[Sema] Produce diagnostics for attribute 'trivial_abi' that appears
after the closing brace of a class declaration.
Merge the two call sites of checkIllFormedTrivialABIStruct and sink it
into CheckCompletedCXXClass so that it is called after the attribute has
been attached to the CXXRecordDecl.
rdar://problem/40873297
llvm-svn: 335021
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 4 |
2 files changed, 5 insertions, 10 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e21f380fb71..7a7e0378cfd 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -6018,6 +6018,10 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { } } + // See if trivial_abi has to be dropped. + if (Record->hasAttr<TrivialABIAttr>()) + checkIllFormedTrivialABIStruct(*Record); + // Set HasTrivialSpecialMemberForCall if the record has attribute // "trivial_abi". bool HasTrivialABI = Record->hasAttr<TrivialABIAttr>(); @@ -7810,17 +7814,12 @@ void Sema::ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc, l->getName(); } - // See if trivial_abi has to be dropped. - auto *RD = dyn_cast<CXXRecordDecl>(TagDecl); - if (RD && RD->hasAttr<TrivialABIAttr>()) - checkIllFormedTrivialABIStruct(*RD); - ActOnFields(S, RLoc, TagDecl, llvm::makeArrayRef( // strict aliasing violation! reinterpret_cast<Decl**>(FieldCollector->getCurFields()), FieldCollector->getCurNumFields()), LBrac, RBrac, AttrList); - CheckCompletedCXXClass(RD); + CheckCompletedCXXClass(dyn_cast_or_null<CXXRecordDecl>(TagDecl)); } /// AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index ebda251c64e..2218bdd958e 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -2123,10 +2123,6 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, } } - // See if trivial_abi has to be dropped. - if (Instantiation && Instantiation->hasAttr<TrivialABIAttr>()) - checkIllFormedTrivialABIStruct(*Instantiation); - // Finish checking fields. ActOnFields(nullptr, Instantiation->getLocation(), Instantiation, Fields, SourceLocation(), SourceLocation(), nullptr); |