From 601e6e894c2a38243588b375bed0b9a9e60060bb Mon Sep 17 00:00:00 2001 From: Enea Zaffanella Date: Fri, 11 Jan 2013 14:34:39 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172201 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaType.cpp | 4 ++++ test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp | 6 ++---- test/SemaCXX/alias-template.cpp | 4 +--- test/SemaCXX/condition.cpp | 11 ++++++++++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 1bdd7c3b39..60db55aff3 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1996,6 +1996,7 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, 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 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, 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 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, 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 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, // a new class or enumeration. SemaRef.Diag(OwnedTagDecl->getLocation(), diag::err_type_defined_in_condition); + D.setInvalidType(true); break; } } diff --git a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp index 34a8c854a6..ec1ccbf5de 100644 --- a/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp +++ b/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp @@ -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}} diff --git a/test/SemaCXX/alias-template.cpp b/test/SemaCXX/alias-template.cpp index 4bf79f851e..db9c82afd5 100644 --- a/test/SemaCXX/alias-template.cpp +++ b/test/SemaCXX/alias-template.cpp @@ -105,9 +105,7 @@ namespace TagName { template using S = struct { int n; }; // expected-error {{can not be defined}} template using T = class { int n; }; // expected-error {{can not be defined}} template using U = enum { a, b, c }; // expected-error {{can not be defined}} - template 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 using V = struct V { int n; }; // expected-error {{'TagName::V' can not be defined in a type alias template}} } namespace StdExample { diff --git a/test/SemaCXX/condition.cpp b/test/SemaCXX/condition.cpp index ec5eb17b08..d805881194 100644 --- a/test/SemaCXX/condition.cpp +++ b/test/SemaCXX/condition.cpp @@ -19,7 +19,7 @@ void test() { 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 test3() { void test4(bool (&x)(void)) { while (x); } + +template +void test5() { + if (struct S {}* p = 0) // expected-error {{types may not be defined in conditions}} + ; +} +void test5_inst() { + test5(); +} -- 2.40.0