[cfe-commits] r172201 - in /cfe/trunk: lib/Sema/SemaType.cpp test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp test/SemaCXX/alias-template.cpp test/SemaCXX/condition.cpp

Enea Zaffanella zaffanella at cs.unipr.it
Fri Jan 11 06:34:40 PST 2013


Author: enea
Date: Fri Jan 11 08:34:39 2013
New Revision: 172201

URL: http://llvm.org/viewvc/llvm-project?rev=172201&view=rev
Log:
Fixed an assertion failure triggered by invalid code.

Set invalid type of declarator after emitting error diagnostics,
so that it won't be later considered when instantiating the template.
Added test5_inst in test/SemaCXX/condition.cpp for non-regression.


Modified:
    cfe/trunk/lib/Sema/SemaType.cpp
    cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp
    cfe/trunk/test/SemaCXX/alias-template.cpp
    cfe/trunk/test/SemaCXX/condition.cpp

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=172201&r1=172200&r2=172201&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jan 11 08:34:39 2013
@@ -1996,6 +1996,7 @@
       SemaRef.Diag(OwnedTagDecl->getLocation(),
              diag::err_type_defined_in_alias_template)
         << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+      D.setInvalidType(true);
       break;
     case Declarator::TypeNameContext:
     case Declarator::TemplateParamContext:
@@ -2006,6 +2007,7 @@
       SemaRef.Diag(OwnedTagDecl->getLocation(),
              diag::err_type_defined_in_type_specifier)
         << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+      D.setInvalidType(true);
       break;
     case Declarator::PrototypeContext:
     case Declarator::ObjCParameterContext:
@@ -2016,6 +2018,7 @@
       SemaRef.Diag(OwnedTagDecl->getLocation(),
                    diag::err_type_defined_in_param_type)
         << SemaRef.Context.getTypeDeclType(OwnedTagDecl);
+      D.setInvalidType(true);
       break;
     case Declarator::ConditionContext:
       // C++ 6.4p2:
@@ -2023,6 +2026,7 @@
       // a new class or enumeration.
       SemaRef.Diag(OwnedTagDecl->getLocation(),
                    diag::err_type_defined_in_condition);
+      D.setInvalidType(true);
       break;
     }
   }

Modified: cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp?rev=172201&r1=172200&r2=172201&view=diff
==============================================================================
--- cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp (original)
+++ cfe/trunk/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp Fri Jan 11 08:34:39 2013
@@ -1,10 +1,8 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
 
 struct A { };
-A::A (enum { e1 }) {} // expected-error{{can not be defined in a parameter}} \
-// expected-error{{out-of-line definition}}
-void A::f(enum { e2 }) {} // expected-error{{can not be defined in a parameter}} \
-// expected-error{{out-of-line definition}}
+A::A (enum { e1 }) {} // expected-error{{can not be defined in a parameter}}
+void A::f(enum { e2 }) {} // expected-error{{can not be defined in a parameter}}
 
 enum { e3 } A::g() { } // expected-error{{can not be defined in the result type}} \
 // expected-error{{out-of-line definition}}

Modified: cfe/trunk/test/SemaCXX/alias-template.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/alias-template.cpp?rev=172201&r1=172200&r2=172201&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/alias-template.cpp (original)
+++ cfe/trunk/test/SemaCXX/alias-template.cpp Fri Jan 11 08:34:39 2013
@@ -105,9 +105,7 @@
   template<typename Z> using S = struct { int n; }; // expected-error {{can not be defined}}
   template<typename Z> using T = class { int n; }; // expected-error {{can not be defined}}
   template<typename Z> using U = enum { a, b, c }; // expected-error {{can not be defined}}
-  template<typename Z> using V = struct V { int n; }; // expected-error {{redefinition of 'V' as different kind of symbol}} \
-                                                         expected-error {{'TagName::V' can not be defined in a type alias template}} \
-                                                         expected-note {{previous definition is here}}
+  template<typename Z> using V = struct V { int n; }; // expected-error {{'TagName::V' can not be defined in a type alias template}}
 }
 
 namespace StdExample {

Modified: cfe/trunk/test/SemaCXX/condition.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/condition.cpp?rev=172201&r1=172200&r2=172201&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/condition.cpp (original)
+++ cfe/trunk/test/SemaCXX/condition.cpp Fri Jan 11 08:34:39 2013
@@ -19,7 +19,7 @@
   while (struct NewS *x=0) ;
   while (struct S {} *x=0) ; // expected-error {{types may not be defined in conditions}}
   while (struct {} *x=0) ; // expected-error {{types may not be defined in conditions}}
-  switch (enum {E} x=0) ; // expected-error {{types may not be defined in conditions}} expected-error {{cannot initialize}} \
+  switch (enum {E} x=0) ; // expected-error {{types may not be defined in conditions}} \
   // expected-warning{{enumeration value 'E' not handled in switch}} expected-warning {{switch statement has empty body}} \
   // expected-note{{put the semicolon on a separate line}}
 
@@ -58,3 +58,12 @@
 void test4(bool (&x)(void)) {
   while (x);
 }
+
+template <class>
+void test5() {
+  if (struct S {}* p = 0) // expected-error {{types may not be defined in conditions}}
+    ;
+}
+void test5_inst() {
+   test5<int>();
+}





More information about the cfe-commits mailing list