summaryrefslogtreecommitdiff
path: root/clang/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r--clang/lib/AST/ASTContext.cpp25
1 files changed, 11 insertions, 14 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 5fa2d46de89b..c873ff0515e1 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -8547,21 +8547,18 @@ static TypedefDecl *CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context) {
static TypedefDecl *
CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context) {
+ // struct __va_list
RecordDecl *VaListTagDecl = Context->buildImplicitRecord("__va_list");
- // namespace std { struct __va_list {
- // Note that we create the namespace even in C. This is intentional so that
- // the type is consistent between C and C++, which is important in cases where
- // the types need to match between translation units (e.g. with
- // -fsanitize=cfi-icall). Ideally we wouldn't have created this namespace at
- // all, but it's now part of the ABI (e.g. in mangled names), so we can't
- // change it.
- auto *NS = NamespaceDecl::Create(
- const_cast<ASTContext &>(*Context), Context->getTranslationUnitDecl(),
- /*Inline*/ false, SourceLocation(), SourceLocation(),
- &Context->Idents.get("std"),
- /*PrevDecl*/ nullptr);
- NS->setImplicit();
- VaListTagDecl->setDeclContext(NS);
+ if (Context->getLangOpts().CPlusPlus) {
+ // namespace std { struct __va_list {
+ auto *NS = NamespaceDecl::Create(
+ const_cast<ASTContext &>(*Context), Context->getTranslationUnitDecl(),
+ /*Inline*/ false, SourceLocation(), SourceLocation(),
+ &Context->Idents.get("std"),
+ /*PrevDecl*/ nullptr);
+ NS->setImplicit();
+ VaListTagDecl->setDeclContext(NS);
+ }
VaListTagDecl->startDefinition();