]> granicus.if.org Git - clang/commitdiff
[Bug 25404] Fix crash on typedef in OpenCL 2.0
authorAnastasia Stulova <anastasia.stulova@arm.com>
Tue, 4 Apr 2017 16:50:46 +0000 (16:50 +0000)
committerAnastasia Stulova <anastasia.stulova@arm.com>
Tue, 4 Apr 2017 16:50:46 +0000 (16:50 +0000)
Fixed the assertion due to absence of source location for
implicitly defined types (using addImplicitTypedef()).
During Sema checks the source location is being expected
and therefore an assertion is triggered.

The change is not specific to OpenCL. But it is particularly
common for OpenCL types to be declared implicitly in Clang
to support the mode without the standard header.

Differential Revision: https://reviews.llvm.org/D31397

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

lib/Sema/SemaDecl.cpp
test/SemaOpenCL/types.cl [new file with mode: 0644]

index 80b23557a7a6066ca1ff3f9cf192fa4e4fba2a29..7659fba14a3287b22b6a74416399b9d7e3164408 100644 (file)
@@ -2154,7 +2154,9 @@ void Sema::MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New,
   // -Wtypedef-redefinition.  If either the original or the redefinition is
   // in a system header, don't emit this for compatibility with GCC.
   if (getDiagnostics().getSuppressSystemWarnings() &&
-      (Context.getSourceManager().isInSystemHeader(Old->getLocation()) ||
+      // Some standard types are defined implicitly in Clang (e.g. OpenCL).
+      (Old->isImplicit() ||
+       Context.getSourceManager().isInSystemHeader(Old->getLocation()) ||
        Context.getSourceManager().isInSystemHeader(New->getLocation())))
     return;
 
diff --git a/test/SemaOpenCL/types.cl b/test/SemaOpenCL/types.cl
new file mode 100644 (file)
index 0000000..dc14800
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -fsyntax-only
+
+// expected-no-diagnostics
+
+// Check redefinition of standard types
+typedef atomic_int atomic_flag;