From cdffc36c119a7933c3e8871ccd0028f41d5b5feb Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Fri, 5 Jun 2015 18:03:58 +0000 Subject: [PATCH] [AST] There is no message for C++1z-style static_assert We would crash in the DeclPrinter trying to pretty-print the static_assert message. C++1z-style assertions don't have a message so we would crash. This fixes PR23756. llvm-svn: 239170 --- clang/lib/AST/DeclPrinter.cpp | 6 ++++-- clang/lib/Headers/Intrin.h | 9 ++------- clang/test/SemaCXX/static-assert.cpp | 9 +++++++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index c0f3e17693dc..d8cd40ec9c60 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -733,8 +733,10 @@ void DeclPrinter::VisitImportDecl(ImportDecl *D) { void DeclPrinter::VisitStaticAssertDecl(StaticAssertDecl *D) { Out << "static_assert("; D->getAssertExpr()->printPretty(Out, nullptr, Policy, Indentation); - Out << ", "; - D->getMessage()->printPretty(Out, nullptr, Policy, Indentation); + if (StringLiteral *SL = D->getMessage()) { + Out << ", "; + SL->printPretty(Out, nullptr, Policy, Indentation); + } Out << ")"; } diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h index 727a55e5b761..9592cccb15c7 100644 --- a/clang/lib/Headers/Intrin.h +++ b/clang/lib/Headers/Intrin.h @@ -546,13 +546,8 @@ _bittestandset(long *a, long b) { #if defined(__i386__) || defined(__x86_64__) static __inline__ unsigned char __attribute__((__always_inline__, __nodebug__)) _interlockedbittestandset(long volatile *__BitBase, long __BitPos) { - unsigned char __Res; - __asm__ ("xor %0, %0\n" - "lock bts %2, %1\n" - "setc %0\n" - : "=r" (__Res), "+m"(*__BitBase) - : "Ir"(__BitPos)); - return __Res; + long __OldVal = __atomic_fetch_or(__BitBase, 1 << __BitPos, 5); + return (__OldVal >> __BitPos) & 1; } #endif #ifdef __x86_64__ diff --git a/clang/test/SemaCXX/static-assert.cpp b/clang/test/SemaCXX/static-assert.cpp index 7de4d07b50b8..52be1a390425 100644 --- a/clang/test/SemaCXX/static-assert.cpp +++ b/clang/test/SemaCXX/static-assert.cpp @@ -51,3 +51,12 @@ StaticAssertProtected sap2; // expected-note {{instantiation}} static_assert(true); // expected-warning {{C++1z extension}} static_assert(false); // expected-error-re {{failed{{$}}}} expected-warning {{extension}} + +void PR23756() { + struct { // expected-note 2 {{no known conversion from}} + } _ = decltype( // expected-error {{no viable conversion}} + ({ // expected-warning {{no effect in an unevaluated context}} + static_assert(true); // expected-warning {{C++1z extension}} + 1; + })){}; +}