forked from OSchip/llvm-project
[Clang][ARM] __va_list declaration is not saved in ASTContext causing compilation error or crash
Summary: When the code is compiled for arm32 and the builtin `__va_list` declaration is created by `CreateAAPCSABIBuiltinVaListDecl`, the declaration is not saved in the `ASTContext` which may lead to a compilation error or crash. Minimal reproducer I was able to find: **header.h** ``` #include <stdarg.h> typedef va_list va_list_1; ``` **test.cpp** ``` typedef __builtin_va_list va_list_2; void foo(const char* format, ...) { va_list args; va_start( args, format ); } ``` Steps to reproduce: ``` clang -x c++-header --target=armv7l-linux-eabihf header.h clang -c -include header.h --target=armv7l-linux-eabihf test.cpp ``` Compilation error: ``` error: non-const lvalue reference to type '__builtin_va_list' cannot bind to a value of unrelated type 'va_list' (aka '__builtin_va_list') ``` Compiling the same code as a C source leads to a crash: ``` clang --target=armv7l-linux-eabihf header.h clang -c -x c -include header.h --target=armv7l-linux-eabihf test.cpp ``` Reviewers: logan, rsmith Subscribers: cfe-commits, asl, aemerson, rengolin Differential Revision: http://reviews.llvm.org/D18557 llvm-svn: 264930
This commit is contained in:
parent
ef0fe1eed8
commit
b88d2474df
|
@ -6389,6 +6389,7 @@ CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
|
|||
|
||||
// };
|
||||
VaListDecl->completeDefinition();
|
||||
Context->VaListTagDecl = VaListDecl;
|
||||
|
||||
// typedef struct __va_list __builtin_va_list;
|
||||
QualType T = Context->getRecordType(VaListDecl);
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
// Header for PCH test __va_list_tag-typedef.c
|
||||
|
||||
#include <stdarg.h>
|
||||
typedef va_list va_list_1;
|
|
@ -0,0 +1,14 @@
|
|||
// This test checks the patch for the compilation error / crash described in D18557.
|
||||
|
||||
// Test as a C source
|
||||
// RUN: %clang_cc1 -emit-pch -x c-header -o %t %S/Inputs/__va_list_tag-typedef.h
|
||||
// RUN: %clang_cc1 -fsyntax-only -include-pch %t %s
|
||||
|
||||
// Test as a C++ source
|
||||
// RUN: %clang_cc1 -emit-pch -x c++-header -o %t %S/Inputs/__va_list_tag-typedef.h
|
||||
// RUN: %clang_cc1 -x c++ -fsyntax-only -include-pch %t %s
|
||||
|
||||
// expected-no-diagnostics
|
||||
|
||||
typedef __builtin_va_list va_list_2;
|
||||
void test(const char* format, ...) { va_list args; va_start( args, format ); }
|
Loading…
Reference in New Issue