Work around GCC miscompile exposed by r338464.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 1 Aug 2018 02:27:18 +0000 (02:27 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 1 Aug 2018 02:27:18 +0000 (02:27 +0000)
See gcc.gnu.org/PR86769 for details of the bug.

llvm-svn: 338478

clang/lib/Sema/SemaDecl.cpp

index eb76b94..b92d76a 100644 (file)
@@ -6011,9 +6011,12 @@ static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
 
   // Check the attributes on the function type, if any.
   if (const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
+    // Don't declare this variable in the second operand of the for-statement;
+    // GCC miscompiles that by ending its lifetime before evaluating the
+    // third operand. See gcc.gnu.org/PR86769.
+    AttributedTypeLoc ATL;
     for (TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
-         auto ATL = TL ? TL.getAsAdjusted<AttributedTypeLoc>()
-                       : AttributedTypeLoc();
+         (ATL = TL.getAsAdjusted<AttributedTypeLoc>());
          TL = ATL.getModifiedLoc()) {
       // The [[lifetimebound]] attribute can be applied to the implicit object
       // parameter of a non-static member function (other than a ctor or dtor)