r180591 - Add r180263 back, but fix hasBraces() to be correct during parsing.

Douglas Gregor dgregor at apple.com
Thu Apr 25 19:05:02 PDT 2013



Sent from my iPhone

On Apr 25, 2013, at 6:54 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:

> HI Douglas,
> 
> I would normally wait for your review on this, but it seemed fairly
> safe and fixed a buildbot  broken by the previous patch fixing one
> line extern C declarations.
> 
> Let me know if you are OK with this patch.
> 
> On 25 April 2013 21:30, Rafael Espindola <rafael.espindola at gmail.com> wrote:
>> Author: rafael
>> Date: Thu Apr 25 20:30:23 2013
>> New Revision: 180591
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=180591&view=rev
>> Log:
>> Add r180263 back, but fix hasBraces() to be correct during parsing.
>> 
>> Original commit message:
>> 
>> Fix a case in linkage computation that should check for single line extern "C".
>> 
>> Modified:
>>    cfe/trunk/include/clang/AST/DeclCXX.h
>>    cfe/trunk/lib/AST/Decl.cpp
>>    cfe/trunk/lib/AST/DeclCXX.cpp
>>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>    cfe/trunk/test/SemaCXX/undefined-internal.cpp
>> 
>> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=180591&r1=180590&r2=180591&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
>> +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Apr 25 20:30:23 2013
>> @@ -2352,22 +2352,27 @@ public:
>> private:
>>   /// Language - The language for this linkage specification.
>>   LanguageIDs Language;
>> +  /// True if this linkage spec has brances. This is needed so that hasBraces()
>> +  /// returns the correct result while the linkage spec body is being parsed.
>> +  /// Once RBraceLoc has been set this is not used, so it doesn't need to be
>> +  /// serialized.
>> +  bool HasBraces;

Please turn this and the Language member into bit fields to shrink the size of this class. 

>>   /// ExternLoc - The source location for the extern keyword.
>>   SourceLocation ExternLoc;
>>   /// RBraceLoc - The source location for the right brace (if valid).
>>   SourceLocation RBraceLoc;
>> 
>>   LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
>> -                  SourceLocation LangLoc, LanguageIDs lang,
>> -                  SourceLocation RBLoc)
>> +                  SourceLocation LangLoc, LanguageIDs lang, bool HasBraces)
>>     : Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
>> -      Language(lang), ExternLoc(ExternLoc), RBraceLoc(RBLoc) { }
>> +      Language(lang), HasBraces(HasBraces), ExternLoc(ExternLoc),
>> +      RBraceLoc(SourceLocation()) { }
>> 
>> public:
>>   static LinkageSpecDecl *Create(ASTContext &C, DeclContext *DC,
>>                                  SourceLocation ExternLoc,
>>                                  SourceLocation LangLoc, LanguageIDs Lang,
>> -                                 SourceLocation RBraceLoc = SourceLocation());
>> +                                 bool HasBraces);
>>   static LinkageSpecDecl *CreateDeserialized(ASTContext &C, unsigned ID);
>> 
>>   /// \brief Return the language specified by this linkage specification.
>> @@ -2377,12 +2382,18 @@ public:
>> 
>>   /// \brief Determines whether this linkage specification had braces in
>>   /// its syntactic form.
>> -  bool hasBraces() const { return RBraceLoc.isValid(); }
>> +  bool hasBraces() const {
>> +    assert(!RBraceLoc.isValid() || HasBraces);
>> +    return HasBraces;
>> +  }
>> 
>>   SourceLocation getExternLoc() const { return ExternLoc; }
>>   SourceLocation getRBraceLoc() const { return RBraceLoc; }
>>   void setExternLoc(SourceLocation L) { ExternLoc = L; }
>> -  void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
>> +  void setRBraceLoc(SourceLocation L) {
>> +    RBraceLoc = L;
>> +    HasBraces = RBraceLoc.isValid();
>> +  }
>> 
>>   SourceLocation getLocEnd() const LLVM_READONLY {
>>     if (hasBraces())
>> 
>> Modified: cfe/trunk/lib/AST/Decl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=180591&r1=180590&r2=180591&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/Decl.cpp (original)
>> +++ cfe/trunk/lib/AST/Decl.cpp Thu Apr 25 20:30:23 2013
>> @@ -476,6 +476,13 @@ template <typename T> static bool isInEx
>>   return First->getDeclContext()->isExternCContext();
>> }
>> 
>> +static bool isSingleLineExternC(const Decl &D) {
>> +  if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext()))
>> +    if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
>> +      return true;
>> +  return false;
>> +}
>> +
>> static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
>>                                               LVComputationKind computation) {
>>   assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
>> @@ -504,7 +511,8 @@ static LinkageInfo getLVForNamespaceScop
>>         return PrevVar->getLinkageAndVisibility();
>> 
>>       if (Var->getStorageClass() != SC_Extern &&
>> -          Var->getStorageClass() != SC_PrivateExtern)
>> +          Var->getStorageClass() != SC_PrivateExtern &&
>> +          !isSingleLineExternC(*Var))
>>         return LinkageInfo::internal();
>>     }
>> 
>> @@ -1580,11 +1588,8 @@ VarDecl::DefinitionKind VarDecl::isThisD
>>   //   A declaration directly contained in a linkage-specification is treated
>>   //   as if it contains the extern specifier for the purpose of determining
>>   //   the linkage of the declared name and whether it is a definition.
>> -  const DeclContext *DC = getDeclContext();
>> -  if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(DC)) {
>> -    if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces())
>> -      return DeclarationOnly;
>> -  }
>> +  if (isSingleLineExternC(*this))
>> +    return DeclarationOnly;
>> 
>>   // C99 6.9.2p2:
>>   //   A declaration of an object that has file scope without an initializer,
>> 
>> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
>> +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Apr 25 20:30:23 2013
>> @@ -1816,14 +1816,14 @@ LinkageSpecDecl *LinkageSpecDecl::Create
>>                                          SourceLocation ExternLoc,
>>                                          SourceLocation LangLoc,
>>                                          LanguageIDs Lang,
>> -                                         SourceLocation RBraceLoc) {
>> -  return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, RBraceLoc);
>> +                                         bool HasBraces) {
>> +  return new (C) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
>> }
>> 
>> LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
>>   void *Mem = AllocateDeserializedDecl(C, ID, sizeof(LinkageSpecDecl));
>>   return new (Mem) LinkageSpecDecl(0, SourceLocation(), SourceLocation(),
>> -                                   lang_c, SourceLocation());
>> +                                   lang_c, false);
>> }
>> 
>> void UsingDirectiveDecl::anchor() { }
>> 
>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=180591&r1=180590&r2=180591&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Apr 25 20:30:23 2013
>> @@ -10507,7 +10507,8 @@ Decl *Sema::ActOnStartLinkageSpecificati
>>   // FIXME: Add all the various semantics of linkage specifications
>> 
>>   LinkageSpecDecl *D = LinkageSpecDecl::Create(Context, CurContext,
>> -                                               ExternLoc, LangLoc, Language);
>> +                                               ExternLoc, LangLoc, Language,
>> +                                               LBraceLoc.isValid());
>>   CurContext->addDecl(D);
>>   PushDeclContext(S, D);
>>   return D;
>> 
>> Modified: cfe/trunk/test/SemaCXX/undefined-internal.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/undefined-internal.cpp?rev=180591&r1=180590&r2=180591&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/undefined-internal.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/undefined-internal.cpp Thu Apr 25 20:30:23 2013
>> @@ -323,3 +323,10 @@ namespace test13 {
>>   }
>> }
>> 
>> +namespace test14 {
>> +  extern "C" const int foo;
>> +
>> +  int f() {
>> +    return foo;
>> +  }
>> +}
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list