]> granicus.if.org Git - clang/commitdiff
Sema: Don't crash converting to bool from _Atomic
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 16 Dec 2014 06:31:17 +0000 (06:31 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 16 Dec 2014 06:31:17 +0000 (06:31 +0000)
Turning our _Atomic L-value into an R-value removes its _Atomic-ness.
However, we didn't update our 'FromType' which made
ScalarTypeToBooleanCastKind think we were trying to pass it a
non-scalar.

This fixes PR21836.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224322 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/SemaCXX/atomic-type.cpp

index 1f9c1ea73cdde93c9a0f89f4f6a28a3c588fe5bc..2227721f70efc06173402f0554c9fd7a49f945c7 100644 (file)
@@ -2754,10 +2754,10 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
 
   case ICK_Lvalue_To_Rvalue: {
     assert(From->getObjectKind() != OK_ObjCProperty);
-    FromType = FromType.getUnqualifiedType();
     ExprResult FromRes = DefaultLvalueConversion(From);
     assert(!FromRes.isInvalid() && "Can't perform deduced conversion?!");
     From = FromRes.get();
+    FromType = From->getType();
     break;
   }
 
index ae18eab5b4a909fff3c972fde67730b91a41ee83..779b0671cad6acbbfa09032eddca03b542a7381b 100644 (file)
@@ -83,3 +83,7 @@ namespace copy_init {
   // allows extraneous braces around initializers.
   Y y3 = { { X(0) }, { 4 } }; // expected-error 2{{illegal initializer type}}
 }
+
+bool PR21836(_Atomic(int) *x) {
+    return *x;
+}