[PATCH] D16351: [FIX] Bug 25404 - Crash on typedef in OpenCL 2.0

Igor Chesnokov via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 3 22:11:46 PST 2016


ichesnokov updated this revision to Diff 46876.
ichesnokov marked 2 inline comments as done.
ichesnokov added a comment.

Test case enriched to check typedef redefinition without warnings.
Minor fix of comment.


http://reviews.llvm.org/D16351

Files:
  lib/Sema/SemaDecl.cpp
  test/SemaOpenCL/implicit-typedef.cl

Index: test/SemaOpenCL/implicit-typedef.cl
===================================================================
--- test/SemaOpenCL/implicit-typedef.cl
+++ test/SemaOpenCL/implicit-typedef.cl
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 %s -DTEST_WARNINGS -cl-std=CL2.0 -verify -pedantic -fsyntax-only -Wsystem-headers
+// RUN: %clang_cc1 %s -cl-std=CL2.0 -fsyntax-only
+
+#if defined(TEST_WARNINGS)
+typedef atomic_int atomic_flag; // expected-warning {{redefinition of typedef 'atomic_flag' is a C11 feature}}
+#else
+typedef atomic_int atomic_flag;
+#endif
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -2036,6 +2036,22 @@
   if (getLangOpts().Modules || getLangOpts().C11)
     return;
   
+  // Added isImplicit() check, because implicit TypeDecl::getLocation()
+  // returns 0. The're many implicit typedefs in OpenCL, e.g. atomic_flag.
+  if (Old->isImplicit() || New->isImplicit()) {
+    // Since we don't emit system header warnings for compatibility with GCC,
+    // don't do this for implicit type redefinition warnings the same way.
+    if (!getDiagnostics().getSuppressSystemWarnings()) {
+      if (New->getLocation().isValid()) {
+        Diag(New->getLocation(), diag::ext_redefinition_of_typedef)
+          << New->getDeclName();
+        if (Old->getLocation().isValid())
+          Diag(Old->getLocation(), diag::note_previous_definition);
+      }
+    }
+    return;
+  }
+
   // If we have a redefinition of a typedef in C, emit a warning.  This warning
   // is normally mapped to an error, but can be controlled with
   // -Wtypedef-redefinition.  If either the original or the redefinition is


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16351.46876.patch
Type: text/x-patch
Size: 1726 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160204/4266aef0/attachment.bin>


More information about the cfe-commits mailing list